Skip to content

Commit b683b88

Browse files
authored
feat(standard-server-peer)!: use string instead of number for unique ID (#682)
Number range has a limit. We reset when it’s reached, but it’s still more ideal if we can guarantee the ID is always unique by use string. > This is a breaking change, but all features relies on this still experimental <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - None. - **Refactor** - All internal and public APIs now use string-based identifiers instead of numeric IDs for messages, queues, and event iterators. - Updated all related methods, callbacks, and data structures to expect string IDs. - **Tests** - Updated all test cases to use string IDs instead of numbers for request, response, and queue identifiers. - **Documentation** - None. These changes improve consistency and compatibility across the system when handling identifiers. No user-facing functionality or workflows are altered. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent 1b15e8e commit b683b88

File tree

28 files changed

+255
-240
lines changed

28 files changed

+255
-240
lines changed

packages/client/src/adapters/message-port/rpc-link.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ describe('rpcLink', () => {
3434

3535
const [id, , payload] = (await decodeRequestMessage(sentMessages[0]))
3636

37-
expect(id).toBeTypeOf('number')
37+
expect(id).toBeTypeOf('string')
3838
expect(payload).toEqual({
3939
url: new URL('orpc:/ping'),
4040
body: { json: 'input' },
@@ -54,7 +54,7 @@ describe('rpcLink', () => {
5454

5555
const [id, , payload] = (await decodeRequestMessage(sentMessages[0]))
5656

57-
expect(id).toBeTypeOf('number')
57+
expect(id).toBeTypeOf('string')
5858
expect(payload).toEqual({
5959
url: new URL('orpc:/ping'),
6060
body: expect.any(FormData),

packages/client/src/adapters/websocket/rpc-link.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ describe('rpcLink', () => {
3434

3535
const [id,, payload] = (await decodeRequestMessage(websocket.send.mock.calls[0]![0]))
3636

37-
expect(id).toBeTypeOf('number')
37+
expect(id).toBeTypeOf('string')
3838
expect(payload).toEqual({
3939
url: new URL('orpc:/ping'),
4040
body: { json: 'input' },
@@ -54,7 +54,7 @@ describe('rpcLink', () => {
5454

5555
const [id, , payload] = (await decodeRequestMessage(websocket.send.mock.calls[0]![0]))
5656

57-
expect(id).toBeTypeOf('number')
57+
expect(id).toBeTypeOf('string')
5858
expect(payload).toEqual({
5959
url: new URL('orpc:/ping'),
6060
body: { json: 'input' },

packages/durable-event-iterator/src/durable-object/handler.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@ describe('durableEventIteratorRouter', async () => {
4040

4141
expect(output).toBeInstanceOf(HibernationEventIterator)
4242

43-
output.hibernationCallback?.(123)
43+
output.hibernationCallback?.('123')
4444

4545
expect(serializeInternalAttachmentSpy).toHaveBeenCalledWith(currentWebsocket, {
46-
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]: 123,
46+
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]: '123',
4747
})
4848

4949
expect(sendEventsAfterSpy).toHaveBeenCalledWith(
5050
currentWebsocket,
51-
123,
51+
'123',
5252
new Date((date - 1) * 1000),
5353
)
5454
})
@@ -77,15 +77,15 @@ describe('durableEventIteratorRouter', async () => {
7777

7878
expect(output).toBeInstanceOf(HibernationEventIterator)
7979

80-
output.hibernationCallback?.(123)
80+
output.hibernationCallback?.('123')
8181

8282
expect(serializeInternalAttachmentSpy).toHaveBeenCalledWith(currentWebsocket, {
83-
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]: 123,
83+
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]: '123',
8484
})
8585

8686
expect(sendEventsAfterSpy).toHaveBeenCalledWith(
8787
currentWebsocket,
88-
123,
88+
'123',
8989
'3',
9090
)
9191
})

packages/durable-event-iterator/src/durable-object/object.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ describe('durableEventIteratorObject', () => {
8484
const object = new DurableEventIteratorObject(ctx, {})
8585
const currentWebsocket = createCloudflareWebsocket()
8686

87-
const request = await encodeRequestMessage(123, MessageType.REQUEST, {
87+
const request = await encodeRequestMessage('123', MessageType.REQUEST, {
8888
url: new URL('https://example.com'),
8989
headers: {
9090
'content-type': 'text/event-stream',

packages/durable-event-iterator/src/durable-object/websocket-manager.test.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ describe('durableEventIteratorObjectWebsocketManager', () => {
2525
* Usually set hibernation happen after token payload, but this for test coverage
2626
*/
2727
manager.serializeInternalAttachment(websocket, {
28-
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]: 0,
28+
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]: '0',
2929
})
3030
/**
3131
* Initial attachment, executed internally
@@ -41,7 +41,7 @@ describe('durableEventIteratorObjectWebsocketManager', () => {
4141
})
4242
// safely override the hibernation id
4343
manager.serializeInternalAttachment(websocket, {
44-
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]: 123,
44+
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]: '123',
4545
})
4646

4747
manager.serializeAttachment(websocket, {
@@ -58,7 +58,7 @@ describe('durableEventIteratorObjectWebsocketManager', () => {
5858
iat: 1923456780,
5959
rpc: ['test'],
6060
},
61-
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]: 123,
61+
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]: '123',
6262
some: 'data',
6363
})
6464
})
@@ -89,7 +89,7 @@ describe('durableEventIteratorObjectWebsocketManager', () => {
8989
iat: 1923456780,
9090
rpc: ['test'],
9191
},
92-
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]: 123,
92+
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]: '123',
9393
})
9494

9595
manager.serializeInternalAttachment(websocket2, {
@@ -107,8 +107,8 @@ describe('durableEventIteratorObjectWebsocketManager', () => {
107107
manager.publishEvent(wss, { test: 'event2' })
108108

109109
expect(encodeHibernationRPCEventSpy).toHaveBeenCalledTimes(2)
110-
expect(encodeHibernationRPCEventSpy).toHaveBeenNthCalledWith(1, 123, withEventMeta({ test: 'event1' }, { id: '1' }), options)
111-
expect(encodeHibernationRPCEventSpy).toHaveBeenNthCalledWith(2, 123, withEventMeta({ test: 'event2' }, { id: '2' }), options)
110+
expect(encodeHibernationRPCEventSpy).toHaveBeenNthCalledWith(1, '123', withEventMeta({ test: 'event1' }, { id: '1' }), options)
111+
expect(encodeHibernationRPCEventSpy).toHaveBeenNthCalledWith(2, '123', withEventMeta({ test: 'event2' }, { id: '2' }), options)
112112

113113
expect(storage.getEventsAfter('0')).toHaveLength(2)
114114

@@ -138,11 +138,11 @@ describe('durableEventIteratorObjectWebsocketManager', () => {
138138
storage.storeEvent({ test: 'event2' })
139139
storage.storeEvent({ test: 'event3' })
140140

141-
manager.sendEventsAfter(websocket, 123, '1')
141+
manager.sendEventsAfter(websocket, '123', '1')
142142

143143
expect(encodeHibernationRPCEventSpy).toHaveBeenCalledTimes(2)
144-
expect(encodeHibernationRPCEventSpy).toHaveBeenNthCalledWith(1, 123, withEventMeta({ test: 'event2' }, { id: '2' }), options)
145-
expect(encodeHibernationRPCEventSpy).toHaveBeenNthCalledWith(2, 123, withEventMeta({ test: 'event3' }, { id: '3' }), options)
144+
expect(encodeHibernationRPCEventSpy).toHaveBeenNthCalledWith(1, '123', withEventMeta({ test: 'event2' }, { id: '2' }), options)
145+
expect(encodeHibernationRPCEventSpy).toHaveBeenNthCalledWith(2, '123', withEventMeta({ test: 'event3' }, { id: '3' }), options)
146146

147147
expect(websocket.send).toHaveBeenCalledTimes(2)
148148
expect(websocket.send).toHaveBeenNthCalledWith(1, encodeHibernationRPCEventSpy.mock.results[0]!.value)

packages/durable-event-iterator/src/durable-object/websocket-manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export type DurableEventIteratorObjectWebsocketInternalAttachment<
1414
/**
1515
* Internal Hibernation Event Iterator ID.
1616
*/
17-
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]?: number
17+
[DURABLE_EVENT_ITERATOR_HIBERNATION_ID_KEY]?: string
1818

1919
/**
2020
* The payload of the Token used to authenticate the WebSocket connection.
@@ -67,7 +67,7 @@ export class DurableEventIteratorObjectWebsocketManager<
6767
*/
6868
sendEventsAfter(
6969
ws: WebSocket,
70-
hibernationId: number,
70+
hibernationId: string,
7171
after: string | Date,
7272
): void {
7373
const events = this.eventStorage.getEventsAfter(after)

packages/server/src/adapters/bun-ws/rpc-handler.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,30 +28,30 @@ describe('rpcHandler', async () => {
2828
send: vi.fn(),
2929
}
3030

31-
const ping_request_message = await encodeRequestMessage(19, MessageType.REQUEST, {
31+
const ping_request_message = await encodeRequestMessage('19', MessageType.REQUEST, {
3232
url: new URL('orpc:/ping'),
3333
body: { json: 'input' },
3434
headers: {},
3535
method: 'POST',
3636
}) as string
3737

3838
const file_request_message = {
39-
buffer: new TextEncoder().encode(await encodeRequestMessage(19, MessageType.REQUEST, {
39+
buffer: new TextEncoder().encode(await encodeRequestMessage('19', MessageType.REQUEST, {
4040
url: new URL('orpc:/file'),
4141
body: { json: 'input' },
4242
headers: {},
4343
method: 'POST',
4444
}) as string),
4545
}
4646

47-
const not_found_request_message = await encodeRequestMessage(19, MessageType.REQUEST, {
47+
const not_found_request_message = await encodeRequestMessage('19', MessageType.REQUEST, {
4848
url: new URL('orpc:/not-found'),
4949
body: { json: 'input' },
5050
headers: {},
5151
method: 'POST',
5252
}) as string
5353

54-
const abort_message = await encodeRequestMessage(19, MessageType.ABORT_SIGNAL, undefined) as string
54+
const abort_message = await encodeRequestMessage('19', MessageType.ABORT_SIGNAL, undefined) as string
5555

5656
it('on success', async () => {
5757
handler.message(wss, ping_request_message)
@@ -60,7 +60,7 @@ describe('rpcHandler', async () => {
6060

6161
const [id,, payload] = (await decodeResponseMessage(wss.send.mock.calls[0]![0]))
6262

63-
expect(id).toBeTypeOf('number')
63+
expect(id).toBeTypeOf('string')
6464
expect(payload).toEqual({
6565
status: 200,
6666
headers: {},
@@ -74,7 +74,7 @@ describe('rpcHandler', async () => {
7474
await vi.waitFor(() => expect(wss.send).toHaveBeenCalledTimes(1))
7575
const [id, , payload] = (await decodeResponseMessage(wss.send.mock.calls[0]![0]))
7676

77-
expect(id).toBeTypeOf('number')
77+
expect(id).toBeTypeOf('string')
7878
expect(payload).toEqual({
7979
status: 200,
8080
headers: {
@@ -120,7 +120,7 @@ describe('rpcHandler', async () => {
120120

121121
const [id,, payload] = (await decodeResponseMessage(wss.send.mock.calls[0]![0]))
122122

123-
expect(id).toBeTypeOf('number')
123+
expect(id).toBeTypeOf('string')
124124
expect(payload).toEqual({
125125
status: 404,
126126
headers: {},

packages/server/src/adapters/crossws/rpc-handler.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ describe('rpcHandler', async () => {
2929
}
3030

3131
const ping_request_message = {
32-
rawData: await encodeRequestMessage(19, MessageType.REQUEST, {
32+
rawData: await encodeRequestMessage('19', MessageType.REQUEST, {
3333
url: new URL('orpc:/ping'),
3434
body: { json: 'input' },
3535
headers: {},
@@ -38,7 +38,7 @@ describe('rpcHandler', async () => {
3838
} as any
3939

4040
const file_request_message = {
41-
rawData: new TextEncoder().encode(await encodeRequestMessage(19, MessageType.REQUEST, {
41+
rawData: new TextEncoder().encode(await encodeRequestMessage('19', MessageType.REQUEST, {
4242
url: new URL('orpc:/file'),
4343
body: { json: 'input' },
4444
headers: {},
@@ -50,7 +50,7 @@ describe('rpcHandler', async () => {
5050
} as any
5151

5252
const not_found_request_message = {
53-
rawData: await encodeRequestMessage(19, MessageType.REQUEST, {
53+
rawData: await encodeRequestMessage('19', MessageType.REQUEST, {
5454
url: new URL('orpc:/not_found'),
5555
body: { json: 'input' },
5656
headers: {},
@@ -59,7 +59,7 @@ describe('rpcHandler', async () => {
5959
} as any
6060

6161
const abort_message = {
62-
rawData: await encodeRequestMessage(19, MessageType.ABORT_SIGNAL, undefined),
62+
rawData: await encodeRequestMessage('19', MessageType.ABORT_SIGNAL, undefined),
6363
} as any
6464

6565
it('on success', async () => {
@@ -68,7 +68,7 @@ describe('rpcHandler', async () => {
6868
await vi.waitFor(() => expect(wss.send).toHaveBeenCalledTimes(1))
6969
const [id,, payload] = (await decodeResponseMessage(wss.send.mock.calls[0]![0]))
7070

71-
expect(id).toBeTypeOf('number')
71+
expect(id).toBeTypeOf('string')
7272
expect(payload).toEqual({
7373
status: 200,
7474
headers: {},
@@ -82,7 +82,7 @@ describe('rpcHandler', async () => {
8282
await vi.waitFor(() => expect(wss.send).toHaveBeenCalledTimes(1))
8383
const [id, , payload] = (await decodeResponseMessage(wss.send.mock.calls[0]![0]))
8484

85-
expect(id).toBeTypeOf('number')
85+
expect(id).toBeTypeOf('string')
8686
expect(payload).toEqual({
8787
status: 200,
8888
headers: {
@@ -128,7 +128,7 @@ describe('rpcHandler', async () => {
128128

129129
const [id,, payload] = (await decodeResponseMessage(wss.send.mock.calls[0]![0]))
130130

131-
expect(id).toBeTypeOf('number')
131+
expect(id).toBeTypeOf('string')
132132
expect(payload).toEqual({
133133
status: 404,
134134
headers: {},

packages/server/src/adapters/message-port/rpc-handler.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,28 +40,28 @@ describe('rpcHandler', async () => {
4040
handler.upgrade(serverPort)
4141
})
4242

43-
const ping_request_message = await encodeRequestMessage(19, MessageType.REQUEST, {
43+
const ping_request_message = await encodeRequestMessage('19', MessageType.REQUEST, {
4444
url: new URL('orpc:/ping'),
4545
body: { json: 'input' },
4646
headers: {},
4747
method: 'POST',
4848
})
4949

50-
const file_request_message = new TextEncoder().encode(await encodeRequestMessage(19, MessageType.REQUEST, {
50+
const file_request_message = new TextEncoder().encode(await encodeRequestMessage('19', MessageType.REQUEST, {
5151
url: new URL('orpc:/file'),
5252
body: { json: 'input' },
5353
headers: {},
5454
method: 'POST',
5555
}) as string)
5656

57-
const not_found_request_message = await encodeRequestMessage(19, MessageType.REQUEST, {
57+
const not_found_request_message = await encodeRequestMessage('19', MessageType.REQUEST, {
5858
url: new URL('orpc:/not-found'),
5959
body: { json: 'input' },
6060
headers: {},
6161
method: 'POST',
6262
})
6363

64-
const abort_message = await encodeRequestMessage(19, MessageType.ABORT_SIGNAL, undefined)
64+
const abort_message = await encodeRequestMessage('19', MessageType.ABORT_SIGNAL, undefined)
6565

6666
it('on success', async () => {
6767
clientPort.postMessage(ping_request_message)
@@ -70,7 +70,7 @@ describe('rpcHandler', async () => {
7070

7171
const [id,, payload] = (await decodeResponseMessage(sentMessages[0]))
7272

73-
expect(id).toBeTypeOf('number')
73+
expect(id).toBeTypeOf('string')
7474
expect(payload).toEqual({
7575
status: 200,
7676
headers: {},
@@ -85,7 +85,7 @@ describe('rpcHandler', async () => {
8585

8686
const [id, , payload] = (await decodeResponseMessage(sentMessages[0]))
8787

88-
expect(id).toBeTypeOf('number')
88+
expect(id).toBeTypeOf('string')
8989
expect(payload).toEqual({
9090
status: 200,
9191
headers: {
@@ -131,7 +131,7 @@ describe('rpcHandler', async () => {
131131

132132
const [id,, payload] = (await decodeResponseMessage(sentMessages[0]))
133133

134-
expect(id).toBeTypeOf('number')
134+
expect(id).toBeTypeOf('string')
135135
expect(payload).toEqual({
136136
status: 404,
137137
headers: {},

0 commit comments

Comments
 (0)