mirror of
https://github.com/oceanprotocol/ocean-subgraph.git
synced 2024-12-02 05:57:29 +01:00
metadata draft
This commit is contained in:
parent
4b85c1fc53
commit
efba716ff5
42
src/lzma/bit-tree-decoder.ts
Normal file
42
src/lzma/bit-tree-decoder.ts
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import { RangeDecoder } from './range-decoder';
|
||||||
|
import { LZMA } from './lzma';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LZMA Decoder
|
||||||
|
* @author Nidin Vinayakan
|
||||||
|
*/
|
||||||
|
export class BitTreeDecoder {
|
||||||
|
public probs: Uint16Array
|
||||||
|
private numBits: u32
|
||||||
|
|
||||||
|
constructor(numBits:u32) {
|
||||||
|
this.numBits = numBits
|
||||||
|
this.probs = new Uint16Array(1 << this.numBits)
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public init(): void {
|
||||||
|
LZMA.INIT_PROBS(this.probs)
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public decode(rc: RangeDecoder): u32 {
|
||||||
|
var m: u32 = 1
|
||||||
|
for (var i: u32 = 0; i < this.numBits; i++) m = (m << 1) + rc.decodeBit(this.probs, m)
|
||||||
|
return m - (1 << this.numBits)
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public reverseDecode(rc: RangeDecoder): i32 {
|
||||||
|
return LZMA.BitTreeReverseDecode(this.probs, this.numBits, rc)
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
static constructArray(numBits: i32, len: i32): Array<BitTreeDecoder> {
|
||||||
|
var vec: BitTreeDecoder[] = new Array<BitTreeDecoder>(len)
|
||||||
|
for (var i: i32 = 0; i < len; i++) {
|
||||||
|
vec.__unchecked_set(i, new BitTreeDecoder(numBits))
|
||||||
|
}
|
||||||
|
return vec
|
||||||
|
}
|
||||||
|
}
|
42
src/lzma/len-decoder.ts
Normal file
42
src/lzma/len-decoder.ts
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import { BitTreeDecoder } from './bit-tree-decoder'
|
||||||
|
import { LZMA } from './lzma'
|
||||||
|
import { RangeDecoder } from './range-decoder'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LZMA Decoder
|
||||||
|
* @author Nidin Vinayakan
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class LenDecoder {
|
||||||
|
private choice: Uint16Array
|
||||||
|
private lowCoder: Array<BitTreeDecoder>
|
||||||
|
private midCoder: Array<BitTreeDecoder>
|
||||||
|
private highCoder: BitTreeDecoder
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.lowCoder = BitTreeDecoder.constructArray(3, 1 << LZMA.kNumPosBitsMax)
|
||||||
|
this.midCoder = BitTreeDecoder.constructArray(3, 1 << LZMA.kNumPosBitsMax)
|
||||||
|
this.highCoder = new BitTreeDecoder(8)
|
||||||
|
}
|
||||||
|
|
||||||
|
public init(): void {
|
||||||
|
this.choice = new Uint16Array(2)
|
||||||
|
this.choice.__unchecked_set(0, LZMA.PROB_INIT_VAL)
|
||||||
|
this.choice.__unchecked_set(1, LZMA.PROB_INIT_VAL)
|
||||||
|
this.highCoder.init()
|
||||||
|
for (var i: i32 = 0; i < 1 << LZMA.kNumPosBitsMax; i++) {
|
||||||
|
this.lowCoder[i].init()
|
||||||
|
this.midCoder[i].init()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public decode(rc: RangeDecoder, posState: i32): i32 {
|
||||||
|
if (rc.decodeBit(this.choice, 0) == 0) {
|
||||||
|
return this.lowCoder[posState].decode(rc)
|
||||||
|
}
|
||||||
|
if (rc.decodeBit(this.choice, 1) == 0) {
|
||||||
|
return 8 + this.midCoder[posState].decode(rc)
|
||||||
|
}
|
||||||
|
return 16 + this.highCoder.decode(rc)
|
||||||
|
}
|
||||||
|
}
|
312
src/lzma/lzma-decoder.ts
Normal file
312
src/lzma/lzma-decoder.ts
Normal file
@ -0,0 +1,312 @@
|
|||||||
|
import { RangeDecoder } from './range-decoder';
|
||||||
|
import { OutWindow } from './out-window';
|
||||||
|
import { BitTreeDecoder } from './bit-tree-decoder';
|
||||||
|
import { LenDecoder } from './len-decoder';
|
||||||
|
import { LZMA } from './lzma';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LZMA Decoder
|
||||||
|
* @author Nidin Vinayakan
|
||||||
|
*/
|
||||||
|
export class LzmaDecoder {
|
||||||
|
//Public
|
||||||
|
public markerIsMandatory: boolean
|
||||||
|
public rangeDec: RangeDecoder //RangeDecoder
|
||||||
|
public outWindow: OutWindow //OutWindow
|
||||||
|
public lc: i32
|
||||||
|
public pb: i32
|
||||||
|
public lp: u8
|
||||||
|
public dictSize: u32
|
||||||
|
public dictSizeInProperties: u32
|
||||||
|
|
||||||
|
//Private
|
||||||
|
private litProbs: Uint16Array
|
||||||
|
|
||||||
|
private posSlotDecoder: Array<BitTreeDecoder>
|
||||||
|
private alignDecoder: BitTreeDecoder
|
||||||
|
private posDecoders: Uint16Array
|
||||||
|
|
||||||
|
private isMatch: Uint16Array
|
||||||
|
private isRep: Uint16Array
|
||||||
|
private isRepG0: Uint16Array
|
||||||
|
private isRepG1: Uint16Array
|
||||||
|
private isRepG2: Uint16Array
|
||||||
|
private isRep0Long: Uint16Array
|
||||||
|
|
||||||
|
private lenDecoder: LenDecoder
|
||||||
|
private repLenDecoder: LenDecoder
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.posSlotDecoder = BitTreeDecoder.constructArray(6, LZMA.kNumLenToPosStates) //6
|
||||||
|
this.alignDecoder = new BitTreeDecoder(LZMA.kNumAlignBits)
|
||||||
|
this.posDecoders = new Uint16Array(1 + LZMA.kNumFullDistances - LZMA.kEndPosModelIndex)
|
||||||
|
|
||||||
|
this.isMatch = new Uint16Array(LZMA.kNumStates << LZMA.kNumPosBitsMax)
|
||||||
|
this.isRep = new Uint16Array(LZMA.kNumStates)
|
||||||
|
this.isRepG0 = new Uint16Array(LZMA.kNumStates)
|
||||||
|
this.isRepG1 = new Uint16Array(LZMA.kNumStates)
|
||||||
|
this.isRepG2 = new Uint16Array(LZMA.kNumStates)
|
||||||
|
this.isRep0Long = new Uint16Array(LZMA.kNumStates << LZMA.kNumPosBitsMax)
|
||||||
|
|
||||||
|
this.lenDecoder = new LenDecoder()
|
||||||
|
this.repLenDecoder = new LenDecoder()
|
||||||
|
this.rangeDec = new RangeDecoder()
|
||||||
|
this.outWindow = new OutWindow()
|
||||||
|
}
|
||||||
|
|
||||||
|
public init(): void {
|
||||||
|
this.initLiterals()
|
||||||
|
this.initDist()
|
||||||
|
|
||||||
|
LZMA.INIT_PROBS(this.isMatch)
|
||||||
|
LZMA.INIT_PROBS(this.isRep)
|
||||||
|
LZMA.INIT_PROBS(this.isRepG0)
|
||||||
|
LZMA.INIT_PROBS(this.isRepG1)
|
||||||
|
LZMA.INIT_PROBS(this.isRepG2)
|
||||||
|
LZMA.INIT_PROBS(this.isRep0Long)
|
||||||
|
|
||||||
|
this.lenDecoder.init()
|
||||||
|
this.repLenDecoder.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
public create(): void {
|
||||||
|
this.outWindow.create(this.dictSize)
|
||||||
|
this.createLiterals()
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
private createLiterals(): void {
|
||||||
|
this.litProbs = new Uint16Array(0x300 << (this.lc + this.lp))
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
private initLiterals(): void {
|
||||||
|
var num: i32 = 0x300 << (this.lc + this.lp)
|
||||||
|
for (var i: i32 = 0; i < num; i++) {
|
||||||
|
this.litProbs.__unchecked_set(i, LZMA.PROB_INIT_VAL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
private decodeLiteral(state:u16, rep0:u32): void {
|
||||||
|
var prevByte:u32 = 0
|
||||||
|
if (!this.outWindow.isEmpty()) prevByte = this.outWindow.getByte(1)
|
||||||
|
|
||||||
|
var symbol:u16 = 1
|
||||||
|
var litState:u32 =
|
||||||
|
((this.outWindow.totalPos & ((1 << this.lp) - 1)) << this.lc) +
|
||||||
|
(prevByte >>> (8 - this.lc))
|
||||||
|
var probsOffset: i32 = (0x300 * litState) | 0
|
||||||
|
|
||||||
|
if (state >= 7) {
|
||||||
|
let matchByte = this.outWindow.getByte(rep0 + 1)
|
||||||
|
do {
|
||||||
|
let matchBit = (matchByte >>> 7) & 1
|
||||||
|
matchByte <<= 1
|
||||||
|
let bit = this.rangeDec.decodeBit(
|
||||||
|
this.litProbs,
|
||||||
|
probsOffset + ((1 + matchBit) << 8) + symbol,
|
||||||
|
)
|
||||||
|
symbol = (symbol << 1) | bit
|
||||||
|
if (matchBit != bit) break
|
||||||
|
} while (symbol < 0x100)
|
||||||
|
}
|
||||||
|
while (symbol < 0x100) {
|
||||||
|
symbol =
|
||||||
|
(symbol << 1) |
|
||||||
|
this.rangeDec.decodeBit(this.litProbs, probsOffset + symbol)
|
||||||
|
}
|
||||||
|
this.outWindow.putByte(<u8>(symbol - 0x100))
|
||||||
|
}
|
||||||
|
|
||||||
|
private decodeDistance(len: i32): u32 {
|
||||||
|
var lenState: u32 = <u32>len
|
||||||
|
if (lenState > LZMA.kNumLenToPosStates - 1) lenState = LZMA.kNumLenToPosStates - 1
|
||||||
|
|
||||||
|
var posSlot:u32 = this.posSlotDecoder[lenState].decode(this.rangeDec)
|
||||||
|
if (posSlot < 4) return posSlot
|
||||||
|
|
||||||
|
var numDirectBits:u32 = (posSlot >>> 1) - 1
|
||||||
|
var dist:u32 = (2 | (posSlot & 1)) << numDirectBits
|
||||||
|
if (posSlot < LZMA.kEndPosModelIndex) {
|
||||||
|
dist += LZMA.BitTreeReverseDecode(
|
||||||
|
this.posDecoders,
|
||||||
|
numDirectBits,
|
||||||
|
this.rangeDec,
|
||||||
|
dist - posSlot,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
dist +=
|
||||||
|
this.rangeDec.decodeDirectBits(numDirectBits - LZMA.kNumAlignBits) << LZMA.kNumAlignBits
|
||||||
|
dist += this.alignDecoder.reverseDecode(this.rangeDec)
|
||||||
|
}
|
||||||
|
return dist
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
private initDist(): void {
|
||||||
|
for (var i:u32 = 0; i < LZMA.kNumLenToPosStates; i++) {
|
||||||
|
this.posSlotDecoder[i].init()
|
||||||
|
}
|
||||||
|
this.alignDecoder.init()
|
||||||
|
LZMA.INIT_PROBS(this.posDecoders)
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public decodeProperties(properties: Uint8Array): void {
|
||||||
|
var prop = new Uint8Array(4)
|
||||||
|
var p0 = properties.__unchecked_get(0)
|
||||||
|
prop.__unchecked_set(0, p0)
|
||||||
|
if (p0 >= 9 * 5 * 5) {
|
||||||
|
throw 1
|
||||||
|
// throw 'Incorrect LZMA properties'
|
||||||
|
}
|
||||||
|
var p1 = p0 % 9
|
||||||
|
prop.__unchecked_set(1, p1)
|
||||||
|
p0 /= 9
|
||||||
|
prop.__unchecked_set(0, p0)
|
||||||
|
var p2 = p0 / 5
|
||||||
|
var p3 = p0 % 5
|
||||||
|
|
||||||
|
prop.__unchecked_set(2, p2)
|
||||||
|
prop.__unchecked_set(3, p3)
|
||||||
|
|
||||||
|
this.lc = p1
|
||||||
|
this.pb = p2
|
||||||
|
this.lp = p3
|
||||||
|
|
||||||
|
this.dictSizeInProperties = 0
|
||||||
|
for (var i: u32 = 0; i < 4; i++) {
|
||||||
|
this.dictSizeInProperties |= <u32>properties.__unchecked_get(i + 1) << (8 * i)
|
||||||
|
}
|
||||||
|
this.dictSize = this.dictSizeInProperties
|
||||||
|
|
||||||
|
if (this.dictSize < LZMA.LZMA_DIC_MIN) {
|
||||||
|
this.dictSize = LZMA.LZMA_DIC_MIN
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
private updateState_Literal(state: u8): u8 {
|
||||||
|
if (state < 4) return 0
|
||||||
|
else if (state < 10) return state - 3
|
||||||
|
else return state - 6
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
private updateState_ShortRep(state: u8): u8 {
|
||||||
|
return state < 7 ? 9 : 11
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
private updateState_Rep(state: u8): u8 {
|
||||||
|
return state < 7 ? 8 : 11
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
private updateState_Match(state: u8): u8 {
|
||||||
|
return state < 7 ? 7 : 10
|
||||||
|
}
|
||||||
|
|
||||||
|
public decode(unpackSizeDefined: boolean, unpackSize: i32): i32 {
|
||||||
|
this.init()
|
||||||
|
this.rangeDec.init()
|
||||||
|
|
||||||
|
if (unpackSizeDefined) {
|
||||||
|
this.outWindow.outStream = new Uint8Array(unpackSize)
|
||||||
|
} else {
|
||||||
|
this.outWindow.outStream = new Uint8Array(4)
|
||||||
|
}
|
||||||
|
|
||||||
|
var rep0:u32 = 0,
|
||||||
|
rep1:u32 = 0,
|
||||||
|
rep2:u32 = 0,
|
||||||
|
rep3:u32 = 0
|
||||||
|
var state:u8 = 0
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (unpackSizeDefined && unpackSize == 0 && !this.markerIsMandatory) {
|
||||||
|
if (this.rangeDec.isFinishedOK()) {
|
||||||
|
return LZMA.LZMA_RES_FINISHED_WITHOUT_MARKER
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var posState = this.outWindow.totalPos & ((1 << this.pb) - 1)
|
||||||
|
|
||||||
|
if (this.rangeDec.decodeBit(this.isMatch, (state << LZMA.kNumPosBitsMax) + posState) == 0) {
|
||||||
|
if (unpackSizeDefined && unpackSize == 0) {
|
||||||
|
return LZMA.LZMA_RES_ERROR
|
||||||
|
}
|
||||||
|
this.decodeLiteral(state, rep0)
|
||||||
|
state = this.updateState_Literal(state)
|
||||||
|
unpackSize--
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var len: i32
|
||||||
|
|
||||||
|
if (this.rangeDec.decodeBit(this.isRep, state) != 0) {
|
||||||
|
if (unpackSizeDefined && unpackSize == 0) {
|
||||||
|
return LZMA.LZMA_RES_ERROR
|
||||||
|
}
|
||||||
|
if (this.outWindow.isEmpty()) {
|
||||||
|
return LZMA.LZMA_RES_ERROR
|
||||||
|
}
|
||||||
|
if (this.rangeDec.decodeBit(this.isRepG0, state) == 0) {
|
||||||
|
if (this.rangeDec.decodeBit(this.isRep0Long, (state << LZMA.kNumPosBitsMax) + posState) == 0) {
|
||||||
|
state = this.updateState_ShortRep(state)
|
||||||
|
this.outWindow.putByte(this.outWindow.getByte(rep0 + 1))
|
||||||
|
unpackSize--
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var dist: i32
|
||||||
|
if (this.rangeDec.decodeBit(this.isRepG1, state) == 0) {
|
||||||
|
dist = rep1
|
||||||
|
} else {
|
||||||
|
if (this.rangeDec.decodeBit(this.isRepG2, state) == 0) {
|
||||||
|
dist = rep2
|
||||||
|
} else {
|
||||||
|
dist = rep3
|
||||||
|
rep3 = rep2
|
||||||
|
}
|
||||||
|
rep2 = rep1
|
||||||
|
}
|
||||||
|
rep1 = rep0
|
||||||
|
rep0 = dist
|
||||||
|
}
|
||||||
|
len = this.repLenDecoder.decode(this.rangeDec, posState)
|
||||||
|
state = this.updateState_Rep(state)
|
||||||
|
} else {
|
||||||
|
rep3 = rep2
|
||||||
|
rep2 = rep1
|
||||||
|
rep1 = rep0
|
||||||
|
len = this.lenDecoder.decode(this.rangeDec, posState)
|
||||||
|
state = this.updateState_Match(state)
|
||||||
|
rep0 = this.decodeDistance(len)
|
||||||
|
if (rep0 == 0xffffffff) {
|
||||||
|
return this.rangeDec.isFinishedOK() ? LZMA.LZMA_RES_FINISHED_WITH_MARKER : LZMA.LZMA_RES_ERROR
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unpackSizeDefined && unpackSize == 0) {
|
||||||
|
return LZMA.LZMA_RES_ERROR
|
||||||
|
}
|
||||||
|
if (rep0 >= this.dictSize || !this.outWindow.checkDistance(rep0)) {
|
||||||
|
return LZMA.LZMA_RES_ERROR
|
||||||
|
}
|
||||||
|
}
|
||||||
|
len += LZMA.kMatchMinLen
|
||||||
|
var isError: boolean = false
|
||||||
|
if (unpackSizeDefined && unpackSize < len) {
|
||||||
|
len = unpackSize
|
||||||
|
isError = true
|
||||||
|
}
|
||||||
|
this.outWindow.copyMatch(rep0 + 1, len)
|
||||||
|
unpackSize -= len
|
||||||
|
if (isError) {
|
||||||
|
return LZMA.LZMA_RES_ERROR
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return LZMA.LZMA_RES_ERROR
|
||||||
|
}
|
||||||
|
}
|
43
src/lzma/lzma-helper.ts
Normal file
43
src/lzma/lzma-helper.ts
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import { LZMA } from './lzma'
|
||||||
|
|
||||||
|
export class LZMAHelper {
|
||||||
|
static decoder: LZMA = new LZMA()
|
||||||
|
static decoderAsync: Worker = new Worker('LZMAWorker.min.js')
|
||||||
|
static callback: Function
|
||||||
|
static ENCODE: number = 1
|
||||||
|
static DECODE: number = 2
|
||||||
|
|
||||||
|
static init(): void {
|
||||||
|
var command = 0
|
||||||
|
LZMAHelper.decoderAsync.onmessage = function(e) {
|
||||||
|
if (command == 0) {
|
||||||
|
command = e.data
|
||||||
|
} else if (command == LZMAHelper.ENCODE) {
|
||||||
|
command = 0 //encode not implemented
|
||||||
|
} else if (command == LZMAHelper.DECODE) {
|
||||||
|
command = 0
|
||||||
|
LZMAHelper.callback(e.data)
|
||||||
|
LZMAHelper.callback = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static encode(data: ArrayBuffer): ArrayBuffer {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
static decode(data: ArrayBuffer): ArrayBuffer {
|
||||||
|
return LZMAHelper.decoder.decode(new Uint8Array(data)).buffer
|
||||||
|
}
|
||||||
|
static encodeAsync(data: ArrayBuffer, _callback: Function): void {}
|
||||||
|
static decodeAsync(data: ArrayBuffer, _callback: Function): void {
|
||||||
|
if (LZMAHelper.callback == null) {
|
||||||
|
LZMAHelper.callback = _callback
|
||||||
|
LZMAHelper.decoderAsync.postMessage(LZMAHelper.DECODE)
|
||||||
|
LZMAHelper.decoderAsync.postMessage(data, [data])
|
||||||
|
} else {
|
||||||
|
console.log('Warning! Another LZMA decoding is running...')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LZMAHelper.init()
|
36
src/lzma/lzma-worker.ts
Normal file
36
src/lzma/lzma-worker.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import { LZMA } from './lzma'
|
||||||
|
|
||||||
|
export class LZMAWorker {
|
||||||
|
static ENCODE: number = 1
|
||||||
|
static DECODE: number = 2
|
||||||
|
private decoder: LZMA
|
||||||
|
private command: Object = null
|
||||||
|
private time: number
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
var _this = this
|
||||||
|
this.decoder = new LZMA()
|
||||||
|
|
||||||
|
addEventListener(
|
||||||
|
'message',
|
||||||
|
(e: any) => {
|
||||||
|
if (_this.command == null) {
|
||||||
|
_this.command = e.data
|
||||||
|
} else if (_this.command['job'] == 1) {
|
||||||
|
_this.command = null
|
||||||
|
} else if (_this.command['job'] == 2) {
|
||||||
|
_this.decode(e.data)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
false
|
||||||
|
)
|
||||||
|
}
|
||||||
|
private decode(data): void {
|
||||||
|
this.time = Date.now()
|
||||||
|
var result = this.decoder.decode(new Uint8Array(data))
|
||||||
|
this.command['time'] = Date.now() - this.time
|
||||||
|
;(<any>postMessage)(this.command)
|
||||||
|
;(<any>postMessage)(result.buffer, [result.buffer])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new LZMAWorker()
|
135
src/lzma/lzma.ts
Normal file
135
src/lzma/lzma.ts
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
import { LzmaDecoder } from './lzma-decoder'
|
||||||
|
import { RangeDecoder } from './range-decoder'
|
||||||
|
;('use strict')
|
||||||
|
/**
|
||||||
|
* LZMA Decoder
|
||||||
|
* @author Nidin Vinayakan
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class DecodeResult {
|
||||||
|
constructor(
|
||||||
|
public success: u32,
|
||||||
|
public errorCode: u32,
|
||||||
|
public unpackSize: i32,
|
||||||
|
public data: Uint8Array
|
||||||
|
) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class LZMA {
|
||||||
|
static readonly LZMA_DIC_MIN: u32 = 1 << 12
|
||||||
|
static readonly LZMA_RES_ERROR: u32 = 0x1
|
||||||
|
static readonly LZMA_RES_FINISHED_WITH_MARKER: u32 = 0x2
|
||||||
|
static readonly LZMA_RES_FINISHED_WITHOUT_MARKER: u32 = 0x3
|
||||||
|
static readonly kNumBitModelTotalBits: u16 = 11
|
||||||
|
static readonly kNumMoveBits: u8 = 5
|
||||||
|
static readonly PROB_INIT_VAL: u16 = (1 << LZMA.kNumBitModelTotalBits) / 2 //1024
|
||||||
|
static readonly kNumPosBitsMax: u8 = 4
|
||||||
|
|
||||||
|
static readonly kNumStates: u32 = 12
|
||||||
|
static readonly kNumLenToPosStates: u32 = 4
|
||||||
|
static readonly kNumAlignBits: u32 = 4
|
||||||
|
static readonly kStartPosModelIndex: u32 = 4
|
||||||
|
static readonly kEndPosModelIndex: u32 = 14
|
||||||
|
static readonly kNumFullDistances: u32 = 1 << (LZMA.kEndPosModelIndex >>> 1)
|
||||||
|
static readonly kMatchMinLen: u32 = 2
|
||||||
|
|
||||||
|
public decoder: LzmaDecoder
|
||||||
|
public data: Uint8Array
|
||||||
|
|
||||||
|
@inline
|
||||||
|
static INIT_PROBS(p: Uint16Array): void {
|
||||||
|
p.fill(LZMA.PROB_INIT_VAL)
|
||||||
|
}
|
||||||
|
|
||||||
|
static BitTreeReverseDecode(
|
||||||
|
probs: Uint16Array,
|
||||||
|
numBits: i32,
|
||||||
|
rc: RangeDecoder,
|
||||||
|
offset: i32 = 0
|
||||||
|
): i32 {
|
||||||
|
var m: u32 = 1
|
||||||
|
var symbol: u32 = 0
|
||||||
|
for (var i: i32 = 0; i < numBits; i++) {
|
||||||
|
var bit: u32 = rc.decodeBit(probs, offset + m)
|
||||||
|
m <<= 1
|
||||||
|
m += bit
|
||||||
|
symbol |= bit << i
|
||||||
|
}
|
||||||
|
return symbol
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.decoder = new LzmaDecoder()
|
||||||
|
}
|
||||||
|
|
||||||
|
public unpackSize(data: Uint8Array): u32 {
|
||||||
|
var header: Uint8Array = new Uint8Array(13)
|
||||||
|
var i: i32
|
||||||
|
for (i = 0; i < 13; i++) {
|
||||||
|
header[i] = data[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
var unpackSize: u32 = 0
|
||||||
|
var unpackSizeDefined: boolean = false
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
var b: u32 = header[5 + i]
|
||||||
|
if (b != 0xff) {
|
||||||
|
unpackSizeDefined = true
|
||||||
|
}
|
||||||
|
unpackSize |= b << (8 * i)
|
||||||
|
}
|
||||||
|
return unpackSize
|
||||||
|
}
|
||||||
|
|
||||||
|
public decode(data: Uint8Array): DecodeResult {
|
||||||
|
this.data = data
|
||||||
|
var header: Uint8Array = new Uint8Array(13)
|
||||||
|
var i: i32
|
||||||
|
for (i = 0; i < 13; i++) {
|
||||||
|
header[i] = data[i]
|
||||||
|
}
|
||||||
|
this.decoder.decodeProperties(header)
|
||||||
|
var unpackSize: u32 = 0
|
||||||
|
var unpackSizeDefined: boolean = false
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
var b: u32 = header[5 + i]
|
||||||
|
if (b != 0xff) {
|
||||||
|
unpackSizeDefined = true
|
||||||
|
}
|
||||||
|
unpackSize |= b << (8 * i)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.decoder.markerIsMandatory = !unpackSizeDefined
|
||||||
|
this.decoder.rangeDec.inStream = data
|
||||||
|
this.decoder.create()
|
||||||
|
// we support the streams that have uncompressed size and marker.
|
||||||
|
var res: i32 = this.decoder.decode(unpackSizeDefined, unpackSize)
|
||||||
|
|
||||||
|
if (res == LZMA.LZMA_RES_ERROR) {
|
||||||
|
return new DecodeResult(false, LZMA.LZMA_RES_ERROR, null, null)
|
||||||
|
//throw 'LZMA decoding error'
|
||||||
|
} else if (res == LZMA.LZMA_RES_FINISHED_WITHOUT_MARKER) {
|
||||||
|
//console.log("Finished without end marker");
|
||||||
|
} else if (res == LZMA.LZMA_RES_FINISHED_WITH_MARKER) {
|
||||||
|
if (unpackSizeDefined) {
|
||||||
|
if (this.decoder.outWindow.out_pos != unpackSize) {
|
||||||
|
return new DecodeResult(false, LZMA.LZMA_RES_ERROR, null, null)
|
||||||
|
//throw 'Finished with end marker before than specified size'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return new DecodeResult(false, LZMA.LZMA_RES_ERROR, null, null)
|
||||||
|
//throw 'Internal Error'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.decoder.rangeDec.corrupted) {
|
||||||
|
// console.log('Warning: LZMA stream is corrupted')
|
||||||
|
}
|
||||||
|
return new DecodeResult(
|
||||||
|
true,
|
||||||
|
null,
|
||||||
|
this.decoder.outWindow.out_pos,
|
||||||
|
this.decoder.outWindow.outStream
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
92
src/lzma/out-window.ts
Normal file
92
src/lzma/out-window.ts
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
import { HEADER_SIZE } from "~lib/internal/arraybuffer";
|
||||||
|
/**
|
||||||
|
* LZMA Decoder
|
||||||
|
* @author Nidin Vinayakan
|
||||||
|
*/
|
||||||
|
export class OutWindow {
|
||||||
|
public totalPos: i32
|
||||||
|
public outStream: Uint8Array
|
||||||
|
|
||||||
|
private buf: Uint8Array
|
||||||
|
private pos: i32
|
||||||
|
public out_pos: i32
|
||||||
|
private size: i32
|
||||||
|
private isFull: boolean
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.out_pos = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
public create(
|
||||||
|
dictSize: i32,
|
||||||
|
): void {
|
||||||
|
this.buf = new Uint8Array(dictSize)
|
||||||
|
this.pos = 0
|
||||||
|
this.size = dictSize
|
||||||
|
this.isFull = false
|
||||||
|
this.totalPos = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public putByte(b: u8): void {
|
||||||
|
this.totalPos++
|
||||||
|
this.buf.__unchecked_set(this.pos++, b)
|
||||||
|
if (this.pos == this.size) {
|
||||||
|
this.pos = 0
|
||||||
|
this.isFull = true
|
||||||
|
}
|
||||||
|
if (this.outStream.length === this.out_pos) {
|
||||||
|
this.grow()
|
||||||
|
}
|
||||||
|
this.outStream.__unchecked_set(this.out_pos++, b)
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
private grow(): void {
|
||||||
|
let tmp = this.outStream
|
||||||
|
this.outStream = new Uint8Array(tmp.length * 2)
|
||||||
|
|
||||||
|
memory.copy(
|
||||||
|
changetype<usize>(this.outStream.buffer) + this.outStream.byteOffset + HEADER_SIZE,
|
||||||
|
changetype<usize>(tmp.buffer) + tmp.byteOffset + HEADER_SIZE,
|
||||||
|
tmp.length
|
||||||
|
);
|
||||||
|
|
||||||
|
let tmp_ptr = <usize>tmp;
|
||||||
|
let AB_ptr = load<u32>(tmp_ptr, 0);
|
||||||
|
__memory_free(AB_ptr);
|
||||||
|
__memory_free(tmp_ptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
public trim(): Uint8Array {
|
||||||
|
var out = this.outStream.subarray(0, this.out_pos)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public getByte(
|
||||||
|
dist: i32,
|
||||||
|
): u8 {
|
||||||
|
return this.buf.__unchecked_get(dist <= this.pos ? this.pos - dist : this.size - dist + this.pos)
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public copyMatch(
|
||||||
|
dist: i32,
|
||||||
|
len:i32,
|
||||||
|
): void {
|
||||||
|
for (; len > 0; len--) {
|
||||||
|
this.putByte(this.getByte(dist))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public checkDistance(dist: i32): boolean {
|
||||||
|
return dist <= this.pos || this.isFull
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public isEmpty(): boolean {
|
||||||
|
return this.pos == 0 && !this.isFull
|
||||||
|
}
|
||||||
|
}
|
96
src/lzma/range-decoder.ts
Normal file
96
src/lzma/range-decoder.ts
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
import { LZMA } from "./lzma";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LZMA Decoder
|
||||||
|
* @author Nidin Vinayakan
|
||||||
|
*/
|
||||||
|
export class RangeDecoder {
|
||||||
|
static kTopValue: u32 = 1 << 24
|
||||||
|
|
||||||
|
public inStream: Uint8Array
|
||||||
|
public corrupted: boolean
|
||||||
|
|
||||||
|
public in_pos: i32
|
||||||
|
private range: u32 = 0
|
||||||
|
private code: u32 = 0
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.in_pos = 13
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public isFinishedOK(): boolean {
|
||||||
|
return this.code == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public init(): void {
|
||||||
|
this.corrupted = false
|
||||||
|
|
||||||
|
if (this.inStream[this.in_pos++] != 0) {
|
||||||
|
this.corrupted = true
|
||||||
|
}
|
||||||
|
|
||||||
|
this.range = 0xffffffff
|
||||||
|
this.code = 0
|
||||||
|
|
||||||
|
for (var i: i32 = 0; i < 4; i++) {
|
||||||
|
this.code = (this.code << 8) | this.inStream[this.in_pos++]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.code == this.range) {
|
||||||
|
this.corrupted = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public normalize():void {
|
||||||
|
if (this.range < RangeDecoder.kTopValue) {
|
||||||
|
this.range <<= 8
|
||||||
|
this.code = (this.code << 8) | this.inStream[this.in_pos++]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
public decodeDirectBits(numBits: i32): i32 {
|
||||||
|
var res:u32 = 0
|
||||||
|
do {
|
||||||
|
this.range >>>= 1
|
||||||
|
this.code -= this.range
|
||||||
|
let t:u32 = 0 - (this.code >>> 31)
|
||||||
|
this.code += this.range & t
|
||||||
|
|
||||||
|
if (this.code == this.range) {
|
||||||
|
this.corrupted = true
|
||||||
|
}
|
||||||
|
|
||||||
|
this.normalize()
|
||||||
|
res <<= 1
|
||||||
|
res += t + 1
|
||||||
|
} while (--numBits)
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
|
decodeBit(prob: Uint16Array, index: i32):u16 {
|
||||||
|
var v:u16 = prob.__unchecked_get(index);
|
||||||
|
var bound:u32 = (this.range >> LZMA.kNumBitModelTotalBits) * v;
|
||||||
|
var symbol:u16 = 0;
|
||||||
|
if (this.code < bound)
|
||||||
|
{
|
||||||
|
v += ((1 << LZMA.kNumBitModelTotalBits) - v) >> LZMA.kNumMoveBits;
|
||||||
|
this.range = bound;
|
||||||
|
symbol = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
v -= v >> LZMA.kNumMoveBits;
|
||||||
|
this.code -= bound;
|
||||||
|
this.range -= bound;
|
||||||
|
symbol = 1;
|
||||||
|
}
|
||||||
|
prob.__unchecked_set(index, v)
|
||||||
|
this.normalize();
|
||||||
|
return symbol;
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,16 @@
|
|||||||
import { BigInt, ethereum } from '@graphprotocol/graph-ts'
|
import {
|
||||||
|
json,
|
||||||
|
BigInt,
|
||||||
|
ethereum,
|
||||||
|
log,
|
||||||
|
Bytes,
|
||||||
|
JSONValue,
|
||||||
|
JSONValueKind
|
||||||
|
} from '@graphprotocol/graph-ts'
|
||||||
import { MetadataUpdated, MetadataCreated } from '../@types/Metadata/Metadata'
|
import { MetadataUpdated, MetadataCreated } from '../@types/Metadata/Metadata'
|
||||||
|
|
||||||
import { Datatoken, MetadataUpdate } from '../@types/schema'
|
import { Datatoken, MetadataUpdate } from '../@types/schema'
|
||||||
|
import { LZMA } from '../lzma/lzma'
|
||||||
|
|
||||||
export function handleMetadataEvent(
|
export function handleMetadataEvent(
|
||||||
event: ethereum.Event,
|
event: ethereum.Event,
|
||||||
@ -36,8 +45,26 @@ export function handleMetadataUpdated(event: MetadataUpdated): void {
|
|||||||
false
|
false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
export function jsonToString(val: JSONValue | null): string {
|
||||||
|
if (val != null && val.kind === JSONValueKind.STRING) {
|
||||||
|
return val.toString()
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
export function handleMetadataCreated(event: MetadataCreated): void {
|
export function handleMetadataCreated(event: MetadataCreated): void {
|
||||||
|
const lzma = new LZMA()
|
||||||
|
const data = lzma.decode(event.params.data)
|
||||||
|
|
||||||
|
const obj = json.fromBytes(data.data as Bytes).toObject()
|
||||||
|
const did = obj.get('id')
|
||||||
|
const name = obj.get('service.attributes.main.name')
|
||||||
|
log.info('!!!!!!!!!!!!!!!!!!!!! DECOMPRESSED DATA {} {} {}', [
|
||||||
|
name.toString(),
|
||||||
|
did.toString(),
|
||||||
|
(data.data as Bytes).toString()
|
||||||
|
])
|
||||||
|
|
||||||
handleMetadataEvent(
|
handleMetadataEvent(
|
||||||
event,
|
event,
|
||||||
event.params.dataToken.toHexString(),
|
event.params.dataToken.toHexString(),
|
||||||
|
Loading…
Reference in New Issue
Block a user