diff --git a/packages/ipc/src/ipc.ts b/packages/ipc/src/ipc.ts index d84174f..0189a55 100644 --- a/packages/ipc/src/ipc.ts +++ b/packages/ipc/src/ipc.ts @@ -196,13 +196,15 @@ export class IPC { } } - once(channel: string, handler: (data: T) => void): () => void { + once(channel: string, handler: (data: T) => void): () => void + once(channel: string, handler: (data: T) => void, options: OnOptions): () => void + once(channel: string, handler: (data: T) => void, options?: OnOptions): () => void { let off: () => void const wrapped = (data: T): void => { off() handler(data) } - off = this.on(channel, wrapped) + off = options ? this.on(channel, wrapped, options) : this.on(channel, wrapped) return off } diff --git a/packages/ipc/test/__snapshots__/tsnapi/@mcbe-mods/ipc/index.snapshot.d.ts b/packages/ipc/test/__snapshots__/tsnapi/@mcbe-mods/ipc/index.snapshot.d.ts index 6586dde..da31d8d 100644 --- a/packages/ipc/test/__snapshots__/tsnapi/@mcbe-mods/ipc/index.snapshot.d.ts +++ b/packages/ipc/test/__snapshots__/tsnapi/@mcbe-mods/ipc/index.snapshot.d.ts @@ -61,6 +61,7 @@ export declare class IPC { on(_: string, _: (_: T) => void): () => void; on(_: string, _: (_: T) => void, _: OnOptions): () => void; once(_: string, _: (_: T) => void): () => void; + once(_: string, _: (_: T) => void, _: OnOptions): () => void; } // #endregion diff --git a/packages/ipc/test/__snapshots__/tsnapi/@mcbe-mods/ipc/index.snapshot.js b/packages/ipc/test/__snapshots__/tsnapi/@mcbe-mods/ipc/index.snapshot.js index 3166165..e873517 100644 --- a/packages/ipc/test/__snapshots__/tsnapi/@mcbe-mods/ipc/index.snapshot.js +++ b/packages/ipc/test/__snapshots__/tsnapi/@mcbe-mods/ipc/index.snapshot.js @@ -23,7 +23,7 @@ export class IPC { dispose() {} send(_, _, _) {} on(_, _, _) {} - once(_, _) {} + once(_, _, _) {} channelUrl(_, _) {} sendBody(_, _, _) {} handleReceive(_, _) {} diff --git a/packages/ipc/test/ipc.test.ts b/packages/ipc/test/ipc.test.ts index 7fd4b41..a827aab 100644 --- a/packages/ipc/test/ipc.test.ts +++ b/packages/ipc/test/ipc.test.ts @@ -92,6 +92,24 @@ describe('IPC', () => { simulateReceive(url('test'), '42') expect(handler).not.toHaveBeenCalled() }) + + it('supports custom deserializer', () => { + const handler = vi.fn() + const deserializer = { + deserialize: (d: string) => Number.parseInt(d.replace('num:', ''), 10), + } + ipc.once('custom', handler, { deserializer }) + simulateReceive(url('custom'), 'num:42') + expect(handler).toHaveBeenCalledWith(42) + }) + + it('with custom deserializer fires only once', () => { + const handler = vi.fn() + ipc.once('test', handler, { deserializer: { deserialize: (d: string) => d } }) + simulateReceive(url('test'), 'a') + simulateReceive(url('test'), 'b') + expect(handler).toHaveBeenCalledTimes(1) + }) }) it('chunks large payloads', () => { diff --git a/packages/utils/README.md b/packages/utils/README.md index 905e03c..b5253ef 100644 --- a/packages/utils/README.md +++ b/packages/utils/README.md @@ -16,14 +16,14 @@ npm install @mcbe-mods/utils ``` ```ts -import { Base64, color, Experience, getCubeRange, getRandomProbability, getRandomRangeValue, getSphereRange, ms2ticks, splitGroups, unique } from '@mcbe-mods/utils' +import { Base64, Color, Experience, getCubeRange, getRandomProbability, getRandomRangeValue, getSphereRange, ms2ticks, splitGroups, unique } from '@mcbe-mods/utils' // splitGroups - split items into stacks splitGroups(65) // => [64, 1] splitGroups(140) // => [64, 64, 12] -// color - Minecraft formatting codes -color.green.italic.bold('Dedicated Ser') + color.reset('ver') + color.red.obfuscated('!!!') +// Color - Minecraft formatting codes +Color.green.italic.bold('Dedicated Ser') + Color.reset('ver') + Color.red.obfuscated('!!!') // => '§a§o§lDedicated Ser§rver§c§k!!!' // Experience - player XP calculation @@ -44,7 +44,7 @@ getSphereRange({ x: 0, y: 0, z: 0 }, 1) // => 27 positions (sphere) | Function | Description | | --- | --- | | `splitGroups(sum, groupSize?)` | Split a number into groups of a given size | -| `color` | Minecraft color/formatting code stylizer | +| `Color` | Minecraft color/formatting code stylizer | | `Experience` | Player experience calculator (leveling up) | | `ms2ticks(ms?, ticksPerSec?, msPerSec?)` | Convert real time to game ticks | | `getCubeRange(location, radius?)` | Get block positions in a cube | diff --git a/packages/utils/test/getRadiusRange.test.ts b/packages/utils/test/range.test.ts similarity index 100% rename from packages/utils/test/getRadiusRange.test.ts rename to packages/utils/test/range.test.ts