Skip to content

Commit d2094ca

Browse files
authored
feat: export encode/decode options (#113)
* feat: export encode/decode -Options * test options with encodedLength/decodeFirst * add encode/decode -Options usage to readme These options are being exported so they can be used with cborg's API, specifically the `decodeFirst` and `encodedLength` functions.
1 parent fa09fe4 commit d2094ca

File tree

3 files changed

+57
-5
lines changed

3 files changed

+57
-5
lines changed

README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,25 @@ let data = encode(obj)
4343
let decoded = decode(data)
4444
decoded.y[0] // 2
4545
CID.asCID(decoded.z.a) // cid instance
46+
47+
// encode/decode options are exported for use with cborg's encodedLength and decodeFirst
48+
import { encodeOptions, decodeOptions } from '@ipld/dag-cbor'
49+
import { encodedLength } from 'cborg/length'
50+
import { decodeFirst } from 'cborg'
51+
52+
// dag-cbor encoded length of obj in bytes
53+
const byteLength = encodedLength(obj, encodeOptions)
54+
byteLength // 104
55+
56+
// concatenate two dag-cbor encoded obj
57+
const concatenatedData = new Uint8Array(data.length * 2)
58+
concatenatedData.set(data)
59+
concatenatedData.set(data, data.length)
60+
61+
// returns dag-cbor decoded obj at the beginning of the buffer as well as the remaining bytes
62+
const [first, remainder] = decodeFirst(concatenatedData, decodeOptions)
63+
assert.deepStrictEqual(first, obj)
64+
assert.deepStrictEqual(remainder, data)
4665
```
4766

4867
## Spec

src/index.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ function numberEncoder (num) {
6464
return null
6565
}
6666

67-
const encodeOptions = {
67+
const _encodeOptions = {
6868
float64: true,
6969
typeEncoders: {
7070
Object: cidEncoder,
@@ -73,6 +73,13 @@ const encodeOptions = {
7373
}
7474
}
7575

76+
export const encodeOptions = {
77+
..._encodeOptions,
78+
typeEncoders: {
79+
..._encodeOptions.typeEncoders
80+
}
81+
}
82+
7683
/**
7784
* @param {Uint8Array} bytes
7885
* @returns {CID}
@@ -84,7 +91,7 @@ function cidDecoder (bytes) {
8491
return CID.decode(bytes.subarray(1)) // ignore leading 0x00
8592
}
8693

87-
const decodeOptions = {
94+
const _decodeOptions = {
8895
allowIndefinite: false,
8996
coerceUndefinedToNull: true,
9097
allowNaN: false,
@@ -97,7 +104,12 @@ const decodeOptions = {
97104
/** @type {import('cborg').TagDecoder[]} */
98105
tags: []
99106
}
100-
decodeOptions.tags[CID_CBOR_TAG] = cidDecoder
107+
_decodeOptions.tags[CID_CBOR_TAG] = cidDecoder
108+
109+
export const decodeOptions = {
110+
..._decodeOptions,
111+
tags: _decodeOptions.tags.slice()
112+
}
101113

102114
export const name = 'dag-cbor'
103115
export const code = 0x71
@@ -107,11 +119,11 @@ export const code = 0x71
107119
* @param {T} node
108120
* @returns {ByteView<T>}
109121
*/
110-
export const encode = (node) => cborg.encode(node, encodeOptions)
122+
export const encode = (node) => cborg.encode(node, _encodeOptions)
111123

112124
/**
113125
* @template T
114126
* @param {ByteView<T>} data
115127
* @returns {T}
116128
*/
117-
export const decode = (data) => cborg.decode(data, decodeOptions)
129+
export const decode = (data) => cborg.decode(data, _decodeOptions)

test/test-basics.spec.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import { Buffer } from 'buffer'
44
import { garbage } from '@ipld/garbage'
55
import { assert } from 'aegir/chai'
6+
import { decodeFirst } from 'cborg'
7+
import { encodedLength } from 'cborg/length'
68
import { bytes, CID } from 'multiformats'
79
import * as dagcbor from '../src/index.js'
810

@@ -181,4 +183,23 @@ describe('dag-cbor', () => {
181183
const encoded = bytes.fromHex('a3636261720363666f6f0163666f6f02')
182184
assert.throws(() => decode(encoded), /CBOR decode error: found repeat map key "foo"/)
183185
})
186+
187+
test('determine encoded length of obj', () => {
188+
const { encodeOptions } = dagcbor
189+
190+
const length = encodedLength(obj, encodeOptions)
191+
same(length, serializedObj.length)
192+
})
193+
194+
test('.deserialize the first of concatenated serialized objects', () => {
195+
const { decodeOptions } = dagcbor
196+
197+
const concatSerializedObjs = new Uint8Array(serializedObj.length * 2)
198+
concatSerializedObjs.set(serializedObj)
199+
concatSerializedObjs.set(serializedObj, serializedObj.length)
200+
201+
const [deserializedObj, remainder] = decodeFirst(concatSerializedObjs, decodeOptions)
202+
same(deserializedObj, obj)
203+
same(remainder, serializedObj)
204+
})
184205
})

0 commit comments

Comments
 (0)