UNPKG

@dstanesc/o-o-o-o-o-o-o

Version:

O-O-O-O-O-O-O is a collection of content addressed persistent data structures

235 lines (221 loc) 7.62 kB
import { linkCodecFactory, blockCodecFactory, LinkCodec, BlockCodec, valueCodecFactory, ValueCodec, } from '../codecs' import { memoryBlockStoreFactory } from '../block-store' import { Version, Edge, Index, Prop, Status, Vertex, ValueRef } from '../types' import { EdgeDecoder, EdgeEncoder, VersionDecoder, VersionEncoder, IndexDecoder, IndexEncoder, PropDecoder, PropEncoder, VertexDecoder, VertexEncoder, PropValueEncoder, PropValueDecoder, } from '../serde' import * as assert from 'assert' import { CID } from 'multiformats/cid' import base64 from 'base64-js' const { encode: linkEncode, decode: linkDecode }: LinkCodec = linkCodecFactory() const { encode: blockEncode, decode: blockDecode }: BlockCodec = blockCodecFactory() const { encode: valueEncode, decode: valueDecode }: ValueCodec = valueCodecFactory() const { put: blockPut, get: blockGet } = memoryBlockStoreFactory() describe('Serde validation with', function () { test('basic write and read, vertices', async () => { const v1: Vertex = { status: Status.CREATED, offset: 0 } const v2: Vertex = { status: Status.UPDATED, offset: 25, type: 77, nextProp: 92, nextEdge: 90, } const v3: Vertex = { status: Status.DELETED, offset: 50 } const bytes = new VertexEncoder([v1, v2, v3]).write() const vertices = new VertexDecoder(bytes).read() const v3p: Vertex = { status: Status.DELETED, offset: 50 } assert.deepEqual([v1, v2, v3p], vertices) }) test('basic write and read, edges', async () => { const e1: Edge = { status: Status.CREATED, offset: 0, source: 0, target: 20, sourceNext: 10, sourcePrev: 25, targetNext: 99, targetPrev: 77, nextProp: 25, } const e2: Edge = { status: Status.CREATED, offset: 45, type: 22, source: 0, target: 20, targetNext: 99, targetPrev: 77, nextProp: 25, } const e3: Edge = { status: Status.CREATED, offset: 90, type: 22, source: 0, target: 2000, } const bytes = new EdgeEncoder([e1, e2, e3]).write() const e3p: Edge = { status: Status.CREATED, offset: 90, type: 22, source: 0, target: 2000, } const edges = new EdgeDecoder(bytes).read() assert.deepEqual([e1, e2, e3p], edges) }) test('basic write and read, props', async () => { const p1: Prop = { status: Status.CREATED, offset: 0, key: 1, value: { some: 'text' }, nextProp: 111, } const p2: Prop = { status: Status.CREATED, offset: 56, type: 121, key: 1, value: 222, } const p3: Prop = { status: Status.CREATED, offset: 112, type: 128, key: 7, value: 'Hello World', nextProp: 888, } const { refs, buf } = new PropValueEncoder( 0, [p1, p2, p3], valueEncode ).write() const bytes = await new PropEncoder([p1, p2, p3], refs).write() const props = await new PropDecoder(bytes, (valueRef: ValueRef) => { const decoder = new PropValueDecoder(buf, valueDecode) decoder.skipBytes(valueRef.ref) return decoder.readValue(valueRef) }).read() assert.deepEqual([p1, p2, p3], props) }) test('basic write and read, indices', async () => { const i1: Index = { status: Status.CREATED, offset: 0, key: 101, value: await linkEncode(new TextEncoder().encode('Some text')), nextIndex: 111, } const i2: Index = { status: Status.CREATED, offset: 56, type: 121, key: 0, value: await linkEncode( new TextEncoder().encode('Some other text') ), } const i3: Index = { status: Status.CREATED, offset: 112, type: 128, key: 1, value: await linkEncode(new TextEncoder().encode('Some more text')), nextIndex: 888, } const bytes = await new IndexEncoder([i1, i2, i3]).write() const indices = await new IndexDecoder(bytes, linkDecode).read() assert.deepEqual([i1, i2, i3], indices) }) test('basic write and read, versions', async () => { const v1: Version = { root: CID.parse( 'bafkreidhv2kilqj6eydivvatngsrtbcbifiij33tnq6zww7u34kit536q4' ), details: { comment: 'First commit', tags: ['tag0', 'tag1'], timestamp: 123456789, }, } const publicKeyJWK = { key_ops: ['verify'], ext: true, kty: 'RSA', n: 't8iYfsaJOvQPYdbd7rhKf5g8ta8un4LUnwCgjfDcgQbQWxV6pEwh40Rh2rTZCBrTr4S00LsNDwhGP4lb4bpATPvmtGFxeBPig6dXmjJr37rVB1w236zcl8AsrNX2qHe3uVeZVvg6ZXhTjV7nM_MurOHxDbRzWSIc2xRqnrPIey6ZA5xAe_ay3Gt82QC_d4x4jU9vt6yQgoUv9qteJHH-7eFNk0KlzZMO9KygYnwCKBRxMIanil6KCb44MNKuqWlxWmxaD7Oq7rnTvaIRWtDIfRdEhRUU4SdNS-pMEJjxlU1xs_Ofbn4i2RjZI7ebhMDuuNSJ6YA5mTTSINf-PjNdpQ', e: 'AQAB', alg: 'PS256', } const v2: Version = { root: CID.parse( 'bafkreicklvs2aaeqfvs6f2pgcki2gont35chka2loq7mlah7yu4tj6bsvy' ), parent: CID.parse( 'bafkreidhv2kilqj6eydivvatngsrtbcbifiij33tnq6zww7u34kit536q4' ), mergeParent: CID.parse( 'bafkreiegljjns2rqb3z5mtdyvq2u6u2cvsahyez6bqsdjibo6737vrqhbi' ), details: { comment: 'Second commit', tags: ['tag2'], timestamp: 123456789, author: JSON.stringify(publicKeyJWK), signature: base64.toByteArray( 'Y/abSmVYftmvvBuSkVL6S9U8ilvRrSqLJZ7pl2P1qJP/WocJUFXWlZcaiEKMoImH6KNC8I4nrJVP17hUtFM88hg552sp+EBV5V6hOkViHAiZfY6f3hQzaXzozvRlHOGt/UZKKr8lbCYdncASlob/OIsMmbulXKtngnWA48BsUtP7CoKXKKkqmBl/5dvHaAgnZ6voDKssSKlrFUcrd6qOgPUN+aBSv/9DqBTNhOT+JF3MJ3HRGplt648DatCA/eLyXOJZTRtVeVbRO+bqEaLztZ+L/4X4NQoJ1kL7QmwSPAx8qDBJSVBiDtoLG5yjf+u2dILaFjgEBskwtPIJ1ETM4Q==' ), }, } const v3: Version = { root: CID.parse( 'bafkreiguifcsbkfb7jlxr7inlp5fqukmve7mv2po234jj73pp7nryvbcxu' ), parent: CID.parse( 'bafkreicklvs2aaeqfvs6f2pgcki2gont35chka2loq7mlah7yu4tj6bsvy' ), details: { comment: 'Third commit', tags: ['tag3'], timestamp: 123456789, }, } const bytes = new VersionEncoder( CID.parse( 'bafkreibygummtcvcgmld7re3s4kjfoaf4z3zgxsdsqdmh3baom4suvgnem' ), [v1, v2, v3], valueEncode ).write() const { id, versions } = new VersionDecoder( bytes, linkDecode, valueDecode ).read() assert.deepEqual([v1, v2, v3], versions) }) })