diff --git a/src/block/interface.ts b/src/block/interface.ts index 932327df..d09c73c5 100644 --- a/src/block/interface.ts +++ b/src/block/interface.ts @@ -12,6 +12,11 @@ import type { Link, Version } from '../link/interface.js' */ export interface ByteView extends Uint8Array, Phantom {} +/** + * Similar to ByteView but extends ArrayBuffer. + */ +export interface ArrayBufferView extends ArrayBuffer, Phantom {} + declare const Marker: unique symbol /** diff --git a/src/codecs/interface.ts b/src/codecs/interface.ts index 3baaf7e0..8e5d9d1a 100644 --- a/src/codecs/interface.ts +++ b/src/codecs/interface.ts @@ -1,4 +1,4 @@ -import type { ByteView } from '../block/interface.js' +import type { ArrayBufferView, ByteView } from '../block/interface.js' /** * IPLD encoder part of the codec. @@ -14,7 +14,7 @@ export interface BlockEncoder { */ export interface BlockDecoder { code: Code - decode(bytes: ByteView): T + decode(bytes: ByteView | ArrayBufferView): T } /** @@ -22,4 +22,4 @@ export interface BlockDecoder { */ export interface BlockCodec extends BlockEncoder, BlockDecoder {} -export type { ByteView } +export type { ArrayBufferView, ByteView } diff --git a/src/codecs/json.ts b/src/codecs/json.ts index 77151e7b..e7d3dc39 100644 --- a/src/codecs/json.ts +++ b/src/codecs/json.ts @@ -1,4 +1,4 @@ -import type { ByteView } from './interface.js' +import type { ArrayBufferView, ByteView } from './interface.js' const textEncoder = new TextEncoder() const textDecoder = new TextDecoder() @@ -10,6 +10,6 @@ export function encode (node: T): ByteView { return textEncoder.encode(JSON.stringify(node)) } -export function decode (data: ByteView): T { +export function decode (data: ByteView | ArrayBufferView): T { return JSON.parse(textDecoder.decode(data)) } diff --git a/src/codecs/raw.ts b/src/codecs/raw.ts index 2d76a422..03ba4ae2 100644 --- a/src/codecs/raw.ts +++ b/src/codecs/raw.ts @@ -1,5 +1,5 @@ import { coerce } from '../bytes.js' -import type { ByteView } from './interface.js' +import type { ArrayBufferView, ByteView } from './interface.js' export const name = 'raw' export const code = 0x55 @@ -8,6 +8,6 @@ export function encode (node: Uint8Array): ByteView { return coerce(node) } -export function decode (data: ByteView): Uint8Array { +export function decode (data: ByteView | ArrayBufferView): Uint8Array { return coerce(data) } diff --git a/test/test-multicodec.spec.ts b/test/test-multicodec.spec.ts index 33d3446d..2dd743f9 100644 --- a/test/test-multicodec.spec.ts +++ b/test/test-multicodec.spec.ts @@ -12,12 +12,24 @@ describe('multicodec', () => { assert.deepStrictEqual(raw.decode(buff), bytes.fromString('test')) }) + it('encode/decode raw arraybuffer', () => { + const buff = raw.encode(bytes.fromString('test')) + assert.deepStrictEqual(buff, bytes.fromString('test')) + assert.deepStrictEqual(raw.decode(buff.buffer), bytes.fromString('test')) + }) + it('encode/decode json', () => { const buff = json.encode({ hello: 'world' }) assert.deepStrictEqual(buff, bytes.fromString(JSON.stringify({ hello: 'world' }))) assert.deepStrictEqual(json.decode(buff), { hello: 'world' }) }) + it('encode/decode json arraybuffer', () => { + const buff = json.encode({ hello: 'world' }) + assert.deepStrictEqual(buff, bytes.fromString(JSON.stringify({ hello: 'world' }))) + assert.deepStrictEqual(json.decode(buff.buffer), { hello: 'world' }) + }) + it('raw cannot encode string', async () => { // @ts-expect-error - 'string' is not assignable to parameter of type 'Uint8Array' assert.throws(() => raw.encode('asdf'), 'Unknown type, must be binary type')