diff --git a/packages/osc/src/models.ts b/packages/osc/src/models.ts index 6d339d1..e7a5c69 100644 --- a/packages/osc/src/models.ts +++ b/packages/osc/src/models.ts @@ -1,7 +1,7 @@ export type OSCType = 's' | 'i' | 'f' | 'b' | 'T' | 'F' | 't' | 'r' | 'N'; export type OSCArg = { type: OSCType; - value: string | number | Uint8Array | boolean | OSCTimeTag | OSCColor | null; + value: string | number | Uint8Array | boolean | OSCTimeTag | OSCColor | bigint | null; }; export type OSCTimeTag = [number, number]; @@ -24,8 +24,10 @@ export type OSCMessage = { }; export type OSCTypeConverter = { - toBuffer: (value: string | number | Uint8Array | boolean | OSCTimeTag | OSCColor | null) => Uint8Array | undefined; + toBuffer: ( + value: string | number | Uint8Array | boolean | OSCTimeTag | OSCColor | null | bigint + ) => Uint8Array | undefined; fromBuffer: ( buffer: Uint8Array - ) => [string | number | Uint8Array | boolean | OSCTimeTag | OSCColor | null | undefined, Uint8Array]; + ) => [string | number | Uint8Array | boolean | OSCTimeTag | OSCColor | null | bigint | undefined, Uint8Array]; }; diff --git a/packages/osc/src/osc-types.ts b/packages/osc/src/osc-types.ts index a7732c7..613c2bc 100644 --- a/packages/osc/src/osc-types.ts +++ b/packages/osc/src/osc-types.ts @@ -236,4 +236,32 @@ export const oscTypeConverterMap: { [key: string]: OSCTypeConverter } = { return [Number.MAX_SAFE_INTEGER, buffer]; }, }, + h: { + toBuffer: (number) => { + const view = new DataView(new ArrayBuffer(8)); + + if (typeof number === 'number') { + view.setBigInt64(0, BigInt(number)); + } else if (typeof number === 'bigint') { + view.setBigInt64(0, number); + } else { + throw new TypeError('osc type h toBuffer called with non number or bigint value'); + } + return new Uint8Array(view.buffer); + }, + fromBuffer: (buffer) => { + if (buffer.length < 8) { + throw new Error('osc int64 must be at least 8 bytes'); + } + + + + const view = new DataView(new ArrayBuffer(8)); + buffer.subarray(0,8).forEach((byte, index)=>{ + view.setUint8(index,byte) + }) + + return [view.getBigInt64(0), buffer.subarray(8)]; + }, + }, }; diff --git a/packages/osc/tests/message-decode.test.js b/packages/osc/tests/message-decode.test.js index 736277a..fbfebbb 100644 --- a/packages/osc/tests/message-decode.test.js +++ b/packages/osc/tests/message-decode.test.js @@ -53,6 +53,11 @@ const tests = [ bytes: new Uint8Array([47, 104, 101, 108, 108, 111, 0, 0, 44, 73, 0, 0]), expected: { address: '/hello', args: [{ type: 'I', value: Number.MAX_SAFE_INTEGER }] }, }, + { + description: 'simple address int64 arg', + bytes: new Uint8Array([47, 104, 101, 108, 108, 111, 0, 0, 44, 104, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255]), + expected: { address: '/hello', args: [{ type: 'h', value: 281474976710655n }] }, + }, { description: 'osc 1.0 spec example 1', bytes: new Uint8Array([ diff --git a/packages/osc/tests/message-encode.test.js b/packages/osc/tests/message-encode.test.js index f39c58a..95919f3 100644 --- a/packages/osc/tests/message-encode.test.js +++ b/packages/osc/tests/message-encode.test.js @@ -48,6 +48,11 @@ const tests = [ message: { address: '/hello', args: [{ type: 'N', value: null }] }, expected: new Uint8Array([47, 104, 101, 108, 108, 111, 0, 0, 44, 78, 0, 0]), }, + { + description: 'simple address int64 arg', + message: { address: '/hello', args: [{ type: 'h', value: 281474976710655n }] }, + expected: new Uint8Array([47, 104, 101, 108, 108, 111, 0, 0, 44, 104, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255]), + }, { description: 'osc 1.0 spec example 1', message: { address: '/oscillator/4/frequency', args: [{ type: 'f', value: 440 }] },