rwsdk 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/use-synced-state/shim/__tests__/worker.test.d.mts +1 -0
- package/dist/use-synced-state/shim/__tests__/worker.test.mjs +37 -0
- package/dist/use-synced-state/shim/client.d.ts +2 -0
- package/dist/use-synced-state/shim/client.js +2 -0
- package/dist/use-synced-state/shim/worker.d.mts +2 -0
- package/dist/use-synced-state/shim/worker.mjs +139 -0
- package/package.json +9 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
vi.mock("cloudflare:workers", () => {
|
|
3
|
+
class DurableObject {
|
|
4
|
+
}
|
|
5
|
+
return { DurableObject };
|
|
6
|
+
});
|
|
7
|
+
import { SyncedStateServer, } from "../worker.mjs";
|
|
8
|
+
// This test verifies that the public rwsdk/use-synced-state/worker path, when
|
|
9
|
+
// resolved through the hibernation shim, still accepts capnweb-style handler
|
|
10
|
+
// signatures that read requestInfo.ctx.
|
|
11
|
+
describe("use-synced-state shim", () => {
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
SyncedStateServer.registerKeyHandler(null);
|
|
14
|
+
SyncedStateServer.registerSetStateHandler(null);
|
|
15
|
+
SyncedStateServer.registerGetStateHandler(null);
|
|
16
|
+
SyncedStateServer.registerSubscribeHandler(null);
|
|
17
|
+
SyncedStateServer.registerUnsubscribeHandler(null);
|
|
18
|
+
SyncedStateServer.registerIdentityExtractor(null);
|
|
19
|
+
});
|
|
20
|
+
it("wraps a legacy key handler so it can read requestInfo.ctx", async () => {
|
|
21
|
+
const keyHandler = vi.fn(async (key, _stub) => {
|
|
22
|
+
return `${key}:legacy`;
|
|
23
|
+
});
|
|
24
|
+
SyncedStateServer.registerKeyHandler(keyHandler);
|
|
25
|
+
expect(SyncedStateServer.getIdentityExtractor()).not.toBeNull();
|
|
26
|
+
const extractor = SyncedStateServer.getIdentityExtractor();
|
|
27
|
+
const identity = await extractor({
|
|
28
|
+
ctx: { userId: "42" },
|
|
29
|
+
});
|
|
30
|
+
expect(identity).toEqual({ userId: "42" });
|
|
31
|
+
});
|
|
32
|
+
it("passes through new-style handlers without identity wrapping", () => {
|
|
33
|
+
const newHandler = vi.fn(async (_key, _identity, _stub) => "ok");
|
|
34
|
+
SyncedStateServer.registerKeyHandler(newHandler);
|
|
35
|
+
expect(SyncedStateServer.getIdentityExtractor()).toBeNull();
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { runWithRequestInfo } from "../../runtime/requestInfo/worker";
|
|
2
|
+
import { SyncedStateServer as HibernationSyncedStateServer, } from "../hibernation/worker.mjs";
|
|
3
|
+
export { SyncedStateServer } from "../hibernation/worker.mjs";
|
|
4
|
+
export { syncedStateRoutes } from "../hibernation/worker.mjs";
|
|
5
|
+
// Backwards-compatible wrapper that preserves the capnweb-style handler API.
|
|
6
|
+
//
|
|
7
|
+
// The hibernation transport captures requestInfo.ctx at WebSocket upgrade time
|
|
8
|
+
// and stores it on the socket attachment. When a legacy handler is invoked,
|
|
9
|
+
// we reconstruct a RequestInfo with that captured ctx and run the handler
|
|
10
|
+
// inside runWithRequestInfo so existing code can keep reading requestInfo.ctx.
|
|
11
|
+
const originalRegisterKeyHandler = HibernationSyncedStateServer.registerKeyHandler.bind(HibernationSyncedStateServer);
|
|
12
|
+
const originalRegisterSetStateHandler = HibernationSyncedStateServer.registerSetStateHandler.bind(HibernationSyncedStateServer);
|
|
13
|
+
const originalRegisterGetStateHandler = HibernationSyncedStateServer.registerGetStateHandler.bind(HibernationSyncedStateServer);
|
|
14
|
+
const originalRegisterSubscribeHandler = HibernationSyncedStateServer.registerSubscribeHandler.bind(HibernationSyncedStateServer);
|
|
15
|
+
const originalRegisterUnsubscribeHandler = HibernationSyncedStateServer.registerUnsubscribeHandler.bind(HibernationSyncedStateServer);
|
|
16
|
+
function makeLegacyRequestInfo(identity) {
|
|
17
|
+
return {
|
|
18
|
+
request: new Request("http://internal/use-synced-state"),
|
|
19
|
+
path: "/use-synced-state",
|
|
20
|
+
params: {},
|
|
21
|
+
ctx: identity,
|
|
22
|
+
url: new URL("http://internal/use-synced-state"),
|
|
23
|
+
rw: {
|
|
24
|
+
nonce: "",
|
|
25
|
+
Document: () => null,
|
|
26
|
+
rscPayload: false,
|
|
27
|
+
ssr: false,
|
|
28
|
+
databases: new Map(),
|
|
29
|
+
scriptsToBeLoaded: new Set(),
|
|
30
|
+
entryScripts: new Set(),
|
|
31
|
+
inlineScripts: new Set(),
|
|
32
|
+
pageRouteResolved: Promise.withResolvers(),
|
|
33
|
+
},
|
|
34
|
+
cf: {
|
|
35
|
+
waitUntil: () => { },
|
|
36
|
+
passThroughOnException: () => { },
|
|
37
|
+
},
|
|
38
|
+
response: { headers: new Headers() },
|
|
39
|
+
isAction: false,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function callWithLegacyContext(identity, fn) {
|
|
43
|
+
const requestInfo = makeLegacyRequestInfo(identity);
|
|
44
|
+
return runWithRequestInfo(requestInfo, fn);
|
|
45
|
+
}
|
|
46
|
+
function isLegacyKeyHandler(handler) {
|
|
47
|
+
return handler.length === 2;
|
|
48
|
+
}
|
|
49
|
+
function isLegacySetGetHandler(handler) {
|
|
50
|
+
return handler.length === 3;
|
|
51
|
+
}
|
|
52
|
+
function isLegacySubscribeUnsubscribeHandler(handler) {
|
|
53
|
+
return handler.length === 2;
|
|
54
|
+
}
|
|
55
|
+
HibernationSyncedStateServer.registerKeyHandler = (handler) => {
|
|
56
|
+
if (!handler) {
|
|
57
|
+
originalRegisterKeyHandler(null);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (isLegacyKeyHandler(handler)) {
|
|
61
|
+
if (!HibernationSyncedStateServer.getIdentityExtractor()) {
|
|
62
|
+
HibernationSyncedStateServer.registerIdentityExtractor((requestInfo) => requestInfo.ctx);
|
|
63
|
+
}
|
|
64
|
+
originalRegisterKeyHandler(async (key, identity, stub) => {
|
|
65
|
+
return await callWithLegacyContext(identity, () => handler(key, stub));
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
originalRegisterKeyHandler(handler);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
HibernationSyncedStateServer.registerSetStateHandler = (handler) => {
|
|
73
|
+
if (!handler) {
|
|
74
|
+
originalRegisterSetStateHandler(null);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (isLegacySetGetHandler(handler)) {
|
|
78
|
+
if (!HibernationSyncedStateServer.getIdentityExtractor()) {
|
|
79
|
+
HibernationSyncedStateServer.registerIdentityExtractor((requestInfo) => requestInfo.ctx);
|
|
80
|
+
}
|
|
81
|
+
originalRegisterSetStateHandler((key, value, identity, stub) => {
|
|
82
|
+
callWithLegacyContext(identity, () => handler(key, value, stub));
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
originalRegisterSetStateHandler(handler);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
HibernationSyncedStateServer.registerGetStateHandler = (handler) => {
|
|
90
|
+
if (!handler) {
|
|
91
|
+
originalRegisterGetStateHandler(null);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (isLegacySetGetHandler(handler)) {
|
|
95
|
+
if (!HibernationSyncedStateServer.getIdentityExtractor()) {
|
|
96
|
+
HibernationSyncedStateServer.registerIdentityExtractor((requestInfo) => requestInfo.ctx);
|
|
97
|
+
}
|
|
98
|
+
originalRegisterGetStateHandler((key, value, identity, stub) => {
|
|
99
|
+
callWithLegacyContext(identity, () => handler(key, value, stub));
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
originalRegisterGetStateHandler(handler);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
HibernationSyncedStateServer.registerSubscribeHandler = (handler) => {
|
|
107
|
+
if (!handler) {
|
|
108
|
+
originalRegisterSubscribeHandler(null);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (isLegacySubscribeUnsubscribeHandler(handler)) {
|
|
112
|
+
if (!HibernationSyncedStateServer.getIdentityExtractor()) {
|
|
113
|
+
HibernationSyncedStateServer.registerIdentityExtractor((requestInfo) => requestInfo.ctx);
|
|
114
|
+
}
|
|
115
|
+
originalRegisterSubscribeHandler((key, identity, stub) => {
|
|
116
|
+
callWithLegacyContext(identity, () => handler(key, stub));
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
originalRegisterSubscribeHandler(handler);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
HibernationSyncedStateServer.registerUnsubscribeHandler = (handler) => {
|
|
124
|
+
if (!handler) {
|
|
125
|
+
originalRegisterUnsubscribeHandler(null);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (isLegacySubscribeUnsubscribeHandler(handler)) {
|
|
129
|
+
if (!HibernationSyncedStateServer.getIdentityExtractor()) {
|
|
130
|
+
HibernationSyncedStateServer.registerIdentityExtractor((requestInfo) => requestInfo.ctx);
|
|
131
|
+
}
|
|
132
|
+
originalRegisterUnsubscribeHandler((key, identity, stub) => {
|
|
133
|
+
callWithLegacyContext(identity, () => handler(key, stub));
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
originalRegisterUnsubscribeHandler(handler);
|
|
138
|
+
}
|
|
139
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rwsdk",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -113,6 +113,10 @@
|
|
|
113
113
|
"default": "./dist/runtime/lib/realtime/durableObject.js"
|
|
114
114
|
},
|
|
115
115
|
"./use-synced-state/client": {
|
|
116
|
+
"rwsdk-use-synced-state-hibernation": {
|
|
117
|
+
"types": "./dist/use-synced-state/shim/client.d.ts",
|
|
118
|
+
"default": "./dist/use-synced-state/shim/client.js"
|
|
119
|
+
},
|
|
116
120
|
"types": "./dist/use-synced-state/client.d.ts",
|
|
117
121
|
"default": "./dist/use-synced-state/client.js"
|
|
118
122
|
},
|
|
@@ -121,6 +125,10 @@
|
|
|
121
125
|
"default": "./dist/use-synced-state/hibernation/client.js"
|
|
122
126
|
},
|
|
123
127
|
"./use-synced-state/worker": {
|
|
128
|
+
"rwsdk-use-synced-state-hibernation": {
|
|
129
|
+
"types": "./dist/use-synced-state/shim/worker.d.mts",
|
|
130
|
+
"workerd": "./dist/use-synced-state/shim/worker.mjs"
|
|
131
|
+
},
|
|
124
132
|
"types": "./dist/use-synced-state/worker.d.mts",
|
|
125
133
|
"workerd": "./dist/use-synced-state/worker.mjs"
|
|
126
134
|
},
|