on-zero 0.4.25 → 0.4.27
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/cjs/createUseQuery.cjs +28 -16
- package/dist/cjs/createUseQuery.native.js +42 -30
- package/dist/cjs/createUseQuery.native.js.map +1 -1
- package/dist/cjs/createZeroClient.cjs +13 -1
- package/dist/cjs/createZeroClient.native.js +13 -1
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/httpPull/auth.test.cjs +197 -0
- package/dist/cjs/httpPull/auth.test.native.js +279 -0
- package/dist/cjs/httpPull/auth.test.native.js.map +1 -0
- package/dist/cjs/httpPull/churn.test.cjs +132 -0
- package/dist/cjs/httpPull/churn.test.native.js +155 -0
- package/dist/cjs/httpPull/churn.test.native.js.map +1 -0
- package/dist/cjs/httpPull/fixtureSchema.cjs +76 -0
- package/dist/cjs/httpPull/fixtureSchema.native.js +82 -0
- package/dist/cjs/httpPull/fixtureSchema.native.js.map +1 -0
- package/dist/cjs/httpPull/fixtureServer.cjs +340 -0
- package/dist/cjs/httpPull/fixtureServer.native.js +534 -0
- package/dist/cjs/httpPull/fixtureServer.native.js.map +1 -0
- package/dist/cjs/httpPull/integration.test.cjs +53 -0
- package/dist/cjs/httpPull/integration.test.native.js +60 -0
- package/dist/cjs/httpPull/integration.test.native.js.map +1 -0
- package/dist/cjs/httpPull/rebase.test.cjs +360 -0
- package/dist/cjs/httpPull/rebase.test.native.js +420 -0
- package/dist/cjs/httpPull/rebase.test.native.js.map +1 -0
- package/dist/cjs/httpPull/relations.test.cjs +107 -0
- package/dist/cjs/httpPull/relations.test.native.js +119 -0
- package/dist/cjs/httpPull/relations.test.native.js.map +1 -0
- package/dist/cjs/httpPull/testHarness.cjs +100 -0
- package/dist/cjs/httpPull/testHarness.native.js +112 -0
- package/dist/cjs/httpPull/testHarness.native.js.map +1 -0
- package/dist/cjs/httpPull/transport.test.cjs +568 -0
- package/dist/cjs/httpPull/transport.test.native.js +655 -0
- package/dist/cjs/httpPull/transport.test.native.js.map +1 -0
- package/dist/cjs/httpPullTransport.cjs +432 -0
- package/dist/cjs/httpPullTransport.native.js +695 -0
- package/dist/cjs/httpPullTransport.native.js.map +1 -0
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/index.native.js +1 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/multiInstanceNested.test.cjs +26 -0
- package/dist/cjs/multiInstanceNested.test.native.js +34 -0
- package/dist/cjs/multiInstanceNested.test.native.js.map +1 -1
- package/dist/esm/createUseQuery.mjs +28 -16
- package/dist/esm/createUseQuery.mjs.map +1 -1
- package/dist/esm/createUseQuery.native.js +42 -30
- package/dist/esm/createUseQuery.native.js.map +1 -1
- package/dist/esm/createZeroClient.mjs +13 -1
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +13 -1
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/httpPull/auth.test.mjs +198 -0
- package/dist/esm/httpPull/auth.test.mjs.map +1 -0
- package/dist/esm/httpPull/auth.test.native.js +277 -0
- package/dist/esm/httpPull/auth.test.native.js.map +1 -0
- package/dist/esm/httpPull/churn.test.mjs +133 -0
- package/dist/esm/httpPull/churn.test.mjs.map +1 -0
- package/dist/esm/httpPull/churn.test.native.js +153 -0
- package/dist/esm/httpPull/churn.test.native.js.map +1 -0
- package/dist/esm/httpPull/fixtureSchema.mjs +50 -0
- package/dist/esm/httpPull/fixtureSchema.mjs.map +1 -0
- package/dist/esm/httpPull/fixtureSchema.native.js +53 -0
- package/dist/esm/httpPull/fixtureSchema.native.js.map +1 -0
- package/dist/esm/httpPull/fixtureServer.mjs +315 -0
- package/dist/esm/httpPull/fixtureServer.mjs.map +1 -0
- package/dist/esm/httpPull/fixtureServer.native.js +506 -0
- package/dist/esm/httpPull/fixtureServer.native.js.map +1 -0
- package/dist/esm/httpPull/integration.test.mjs +54 -0
- package/dist/esm/httpPull/integration.test.mjs.map +1 -0
- package/dist/esm/httpPull/integration.test.native.js +58 -0
- package/dist/esm/httpPull/integration.test.native.js.map +1 -0
- package/dist/esm/httpPull/rebase.test.mjs +361 -0
- package/dist/esm/httpPull/rebase.test.mjs.map +1 -0
- package/dist/esm/httpPull/rebase.test.native.js +418 -0
- package/dist/esm/httpPull/rebase.test.native.js.map +1 -0
- package/dist/esm/httpPull/relations.test.mjs +108 -0
- package/dist/esm/httpPull/relations.test.mjs.map +1 -0
- package/dist/esm/httpPull/relations.test.native.js +117 -0
- package/dist/esm/httpPull/relations.test.native.js.map +1 -0
- package/dist/esm/httpPull/testHarness.mjs +72 -0
- package/dist/esm/httpPull/testHarness.mjs.map +1 -0
- package/dist/esm/httpPull/testHarness.native.js +81 -0
- package/dist/esm/httpPull/testHarness.native.js.map +1 -0
- package/dist/esm/httpPull/transport.test.mjs +569 -0
- package/dist/esm/httpPull/transport.test.mjs.map +1 -0
- package/dist/esm/httpPull/transport.test.native.js +653 -0
- package/dist/esm/httpPull/transport.test.native.js.map +1 -0
- package/dist/esm/httpPullTransport.mjs +406 -0
- package/dist/esm/httpPullTransport.mjs.map +1 -0
- package/dist/esm/httpPullTransport.native.js +666 -0
- package/dist/esm/httpPullTransport.native.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +1 -0
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/multiInstanceNested.test.mjs +27 -1
- package/dist/esm/multiInstanceNested.test.mjs.map +1 -1
- package/dist/esm/multiInstanceNested.test.native.js +35 -1
- package/dist/esm/multiInstanceNested.test.native.js.map +1 -1
- package/package.json +2 -2
- package/src/createUseQuery.tsx +40 -22
- package/src/createZeroClient.tsx +19 -0
- package/src/httpPull/auth.test.ts +208 -0
- package/src/httpPull/churn.test.ts +147 -0
- package/src/httpPull/fixtureSchema.ts +82 -0
- package/src/httpPull/fixtureServer.ts +391 -0
- package/src/httpPull/integration.test.ts +57 -0
- package/src/httpPull/rebase.test.ts +368 -0
- package/src/httpPull/relations.test.ts +135 -0
- package/src/httpPull/testHarness.ts +95 -0
- package/src/httpPull/transport.test.ts +577 -0
- package/src/httpPullTransport.ts +559 -0
- package/src/index.ts +1 -0
- package/src/multiInstanceNested.test.tsx +25 -1
- package/types/createUseQuery.d.ts.map +1 -1
- package/types/createZeroClient.d.ts +3 -1
- package/types/createZeroClient.d.ts.map +1 -1
- package/types/httpPull/auth.test.d.ts +2 -0
- package/types/httpPull/auth.test.d.ts.map +1 -0
- package/types/httpPull/churn.test.d.ts +2 -0
- package/types/httpPull/churn.test.d.ts.map +1 -0
- package/types/httpPull/fixtureSchema.d.ts +111 -0
- package/types/httpPull/fixtureSchema.d.ts.map +1 -0
- package/types/httpPull/fixtureServer.d.ts +14 -0
- package/types/httpPull/fixtureServer.d.ts.map +1 -0
- package/types/httpPull/integration.test.d.ts +2 -0
- package/types/httpPull/integration.test.d.ts.map +1 -0
- package/types/httpPull/rebase.test.d.ts +2 -0
- package/types/httpPull/rebase.test.d.ts.map +1 -0
- package/types/httpPull/relations.test.d.ts +2 -0
- package/types/httpPull/relations.test.d.ts.map +1 -0
- package/types/httpPull/testHarness.d.ts +32 -0
- package/types/httpPull/testHarness.d.ts.map +1 -0
- package/types/httpPull/transport.test.d.ts +2 -0
- package/types/httpPull/transport.test.d.ts.map +1 -0
- package/types/httpPullTransport.d.ts +13 -0
- package/types/httpPullTransport.d.ts.map +1 -0
- package/types/index.d.ts +1 -0
- package/types/index.d.ts.map +1 -1
|
@@ -0,0 +1,653 @@
|
|
|
1
|
+
import { Zero } from "@rocicorp/zero";
|
|
2
|
+
import { afterEach, describe, expect, test, vi } from "vitest";
|
|
3
|
+
import { zeroHttpFixtureMutators, zeroHttpFixtureSchema } from "./fixtureSchema.native.js";
|
|
4
|
+
import { ensureHttpPullTransport, installHttpPullTransport } from "../httpPullTransport.native.js";
|
|
5
|
+
function _class_call_check(instance, Constructor) {
|
|
6
|
+
if (!(instance instanceof Constructor)) {
|
|
7
|
+
throw new TypeError("Cannot call a class as a function");
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function _define_property(obj, key, value) {
|
|
11
|
+
if (key in obj) {
|
|
12
|
+
Object.defineProperty(obj, key, {
|
|
13
|
+
value,
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true
|
|
17
|
+
});
|
|
18
|
+
} else {
|
|
19
|
+
obj[key] = value;
|
|
20
|
+
}
|
|
21
|
+
return obj;
|
|
22
|
+
}
|
|
23
|
+
var ORIGIN = "https://zero-http.local";
|
|
24
|
+
var zeros = [];
|
|
25
|
+
var transports = [];
|
|
26
|
+
var storageID = 0;
|
|
27
|
+
afterEach(async function () {
|
|
28
|
+
var _zeros_pop, _transports_pop;
|
|
29
|
+
while (zeros.length) await ((_zeros_pop = zeros.pop()) === null || _zeros_pop === void 0 ? void 0 : _zeros_pop.close());
|
|
30
|
+
while (transports.length) (_transports_pop = transports.pop()) === null || _transports_pop === void 0 ? void 0 : _transports_pop.uninstall();
|
|
31
|
+
vi.useRealTimers();
|
|
32
|
+
});
|
|
33
|
+
describe("zero-http transport", function () {
|
|
34
|
+
test("connect + complete hydrates a stock Zero materialized query", async function () {
|
|
35
|
+
var requests = [];
|
|
36
|
+
var cookie = 0;
|
|
37
|
+
var fetch = vi.fn(async function (input, init) {
|
|
38
|
+
var request = recordRequest(input, init);
|
|
39
|
+
requests.push(request);
|
|
40
|
+
expect(request.path).toBe("/pull");
|
|
41
|
+
expect(request.headers.authorization).toBe("Bearer token-u1");
|
|
42
|
+
return jsonResponse({
|
|
43
|
+
cookie: ++cookie,
|
|
44
|
+
lastMutationIDChanges: {},
|
|
45
|
+
rowsPatch: [{
|
|
46
|
+
op: "clear"
|
|
47
|
+
}, {
|
|
48
|
+
op: "put",
|
|
49
|
+
tableName: "user",
|
|
50
|
+
value: {
|
|
51
|
+
id: "u1",
|
|
52
|
+
name: "ada"
|
|
53
|
+
}
|
|
54
|
+
}, {
|
|
55
|
+
op: "put",
|
|
56
|
+
tableName: "project",
|
|
57
|
+
value: {
|
|
58
|
+
id: "p1",
|
|
59
|
+
ownerId: "u1",
|
|
60
|
+
name: "control"
|
|
61
|
+
}
|
|
62
|
+
}, {
|
|
63
|
+
op: "put",
|
|
64
|
+
tableName: "member",
|
|
65
|
+
value: {
|
|
66
|
+
id: "m1",
|
|
67
|
+
projectId: "p1",
|
|
68
|
+
userId: "u1"
|
|
69
|
+
}
|
|
70
|
+
}]
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
var transport = install(fetch);
|
|
74
|
+
var zero = createZero();
|
|
75
|
+
var view = zero.query.project.related("members").materialize();
|
|
76
|
+
var data = await waitForComplete(view);
|
|
77
|
+
view.destroy();
|
|
78
|
+
expect(transport.connections).toBe(1);
|
|
79
|
+
expect(data).toEqual([{
|
|
80
|
+
id: "p1",
|
|
81
|
+
ownerId: "u1",
|
|
82
|
+
name: "control",
|
|
83
|
+
members: [{
|
|
84
|
+
id: "m1",
|
|
85
|
+
projectId: "p1",
|
|
86
|
+
userId: "u1"
|
|
87
|
+
}]
|
|
88
|
+
}]);
|
|
89
|
+
expect(requests[0].body.cookie).toBeNull();
|
|
90
|
+
expect(requests[0].body.clientID).toEqual(expect.any(String));
|
|
91
|
+
expect(requests[0].body.clientGroupID).toEqual(expect.any(String));
|
|
92
|
+
});
|
|
93
|
+
test("push frames POST to /push, resolve server promises, and schedule a follow-up pull", async function () {
|
|
94
|
+
var requests = [];
|
|
95
|
+
var fetch = vi.fn(async function (input, init) {
|
|
96
|
+
var request = recordRequest(input, init);
|
|
97
|
+
requests.push(request);
|
|
98
|
+
if (request.path === "/pull") {
|
|
99
|
+
return jsonResponse({
|
|
100
|
+
cookie: request.body.cookie,
|
|
101
|
+
unchanged: true
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
expect(request.path).toBe("/push");
|
|
105
|
+
var mutation2 = request.body.mutations[0];
|
|
106
|
+
return jsonResponse({
|
|
107
|
+
pushResponse: {
|
|
108
|
+
mutations: [{
|
|
109
|
+
id: {
|
|
110
|
+
clientID: mutation2.clientID,
|
|
111
|
+
id: mutation2.id
|
|
112
|
+
},
|
|
113
|
+
result: {}
|
|
114
|
+
}]
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
install(fetch);
|
|
119
|
+
var zero = createZero();
|
|
120
|
+
await eventually(function () {
|
|
121
|
+
return expect(requests.filter(function (request) {
|
|
122
|
+
return request.path === "/pull";
|
|
123
|
+
}).length).toBe(1);
|
|
124
|
+
});
|
|
125
|
+
var pullsBeforePush = requests.filter(function (request) {
|
|
126
|
+
return request.path === "/pull";
|
|
127
|
+
}).length;
|
|
128
|
+
var mutation = zero.mutate.project.create({
|
|
129
|
+
id: "p1",
|
|
130
|
+
ownerId: "u1",
|
|
131
|
+
name: "created"
|
|
132
|
+
});
|
|
133
|
+
await mutation.client;
|
|
134
|
+
await mutation.server;
|
|
135
|
+
var push = requests.find(function (request) {
|
|
136
|
+
return request.path === "/push";
|
|
137
|
+
});
|
|
138
|
+
expect(push === null || push === void 0 ? void 0 : push.headers.authorization).toBe("Bearer token-u1");
|
|
139
|
+
expect(push === null || push === void 0 ? void 0 : push.body).toMatchObject({
|
|
140
|
+
clientGroupID: expect.any(String),
|
|
141
|
+
pushVersion: 1,
|
|
142
|
+
requestID: expect.any(String),
|
|
143
|
+
mutations: [{
|
|
144
|
+
type: "custom",
|
|
145
|
+
name: "project|create",
|
|
146
|
+
id: 1,
|
|
147
|
+
clientID: expect.any(String),
|
|
148
|
+
args: [{
|
|
149
|
+
id: "p1",
|
|
150
|
+
ownerId: "u1",
|
|
151
|
+
name: "created"
|
|
152
|
+
}]
|
|
153
|
+
}]
|
|
154
|
+
});
|
|
155
|
+
await eventually(function () {
|
|
156
|
+
return expect(requests.filter(function (request) {
|
|
157
|
+
return request.path === "/pull";
|
|
158
|
+
}).length).toBe(pullsBeforePush + 1);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
test("updateAuth frame updates bearer headers for later requests", async function () {
|
|
162
|
+
var _requests_at;
|
|
163
|
+
var requests = [];
|
|
164
|
+
var fetch = vi.fn(async function (input, init) {
|
|
165
|
+
var request = recordRequest(input, init);
|
|
166
|
+
requests.push(request);
|
|
167
|
+
expect(request.path).toBe("/pull");
|
|
168
|
+
return jsonResponse({
|
|
169
|
+
cookie: request.body.cookie,
|
|
170
|
+
unchanged: true
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
var transport = install(fetch);
|
|
174
|
+
var {
|
|
175
|
+
socket
|
|
176
|
+
} = openRawSocketWithMessages({
|
|
177
|
+
authToken: "token-old"
|
|
178
|
+
});
|
|
179
|
+
await eventually(function () {
|
|
180
|
+
return expect(requests.length).toBe(1);
|
|
181
|
+
});
|
|
182
|
+
expect(requests[0].headers.authorization).toBe("Bearer token-old");
|
|
183
|
+
socket.send(JSON.stringify(["updateAuth", {
|
|
184
|
+
auth: "token-new"
|
|
185
|
+
}]));
|
|
186
|
+
await transport.pull();
|
|
187
|
+
expect((_requests_at = requests.at(-1)) === null || _requests_at === void 0 ? void 0 : _requests_at.headers.authorization).toBe("Bearer token-new");
|
|
188
|
+
});
|
|
189
|
+
test("push frames are serialized per socket", async function () {
|
|
190
|
+
var firstPushStarted = defer();
|
|
191
|
+
var releaseFirstPush = defer();
|
|
192
|
+
var pushIDs = [];
|
|
193
|
+
var fetch = vi.fn(async function (input, init) {
|
|
194
|
+
var request = recordRequest(input, init);
|
|
195
|
+
if (request.path === "/pull") {
|
|
196
|
+
return jsonResponse({
|
|
197
|
+
cookie: request.body.cookie,
|
|
198
|
+
unchanged: true
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
expect(request.path).toBe("/push");
|
|
202
|
+
var mutationID = request.body.mutations[0].id;
|
|
203
|
+
pushIDs.push(mutationID);
|
|
204
|
+
if (mutationID === 1) {
|
|
205
|
+
firstPushStarted.resolve();
|
|
206
|
+
await releaseFirstPush.promise;
|
|
207
|
+
}
|
|
208
|
+
return jsonResponse({
|
|
209
|
+
pushResponse: {
|
|
210
|
+
mutations: request.body.mutations.map(function (mutation) {
|
|
211
|
+
return {
|
|
212
|
+
id: {
|
|
213
|
+
clientID: mutation.clientID,
|
|
214
|
+
id: mutation.id
|
|
215
|
+
},
|
|
216
|
+
result: {}
|
|
217
|
+
};
|
|
218
|
+
})
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
install(fetch);
|
|
223
|
+
var {
|
|
224
|
+
messages,
|
|
225
|
+
socket
|
|
226
|
+
} = openRawSocketWithMessages();
|
|
227
|
+
await eventually(function () {
|
|
228
|
+
return expect(messages.some(function (message) {
|
|
229
|
+
return message[0] === "connected";
|
|
230
|
+
})).toBe(true);
|
|
231
|
+
});
|
|
232
|
+
socket.send(JSON.stringify(["push", pushBody(1)]));
|
|
233
|
+
await firstPushStarted.promise;
|
|
234
|
+
socket.send(JSON.stringify(["push", pushBody(2)]));
|
|
235
|
+
await sleep(25);
|
|
236
|
+
expect(pushIDs).toEqual([1]);
|
|
237
|
+
releaseFirstPush.resolve();
|
|
238
|
+
await eventually(function () {
|
|
239
|
+
return expect(pushIDs).toEqual([1, 2]);
|
|
240
|
+
});
|
|
241
|
+
await eventually(function () {
|
|
242
|
+
return expect(messages.filter(function (message) {
|
|
243
|
+
return message[0] === "pushResponse";
|
|
244
|
+
})).toHaveLength(2);
|
|
245
|
+
});
|
|
246
|
+
expect(messages.filter(function (message) {
|
|
247
|
+
return message[0] === "pushResponse";
|
|
248
|
+
}).map(function (message) {
|
|
249
|
+
return message[1].mutations[0].id.id;
|
|
250
|
+
})).toEqual([1, 2]);
|
|
251
|
+
});
|
|
252
|
+
test("cookie discipline skips unchanged pokes, chains changed pokes, and coalesces concurrent pulls", async function () {
|
|
253
|
+
var requests = [];
|
|
254
|
+
var responses = [{
|
|
255
|
+
cookie: 1,
|
|
256
|
+
lastMutationIDChanges: {},
|
|
257
|
+
rowsPatch: [{
|
|
258
|
+
op: "clear"
|
|
259
|
+
}]
|
|
260
|
+
}, {
|
|
261
|
+
cookie: 1,
|
|
262
|
+
unchanged: true
|
|
263
|
+
}, {
|
|
264
|
+
cookie: 2,
|
|
265
|
+
lastMutationIDChanges: {},
|
|
266
|
+
rowsPatch: [{
|
|
267
|
+
op: "clear"
|
|
268
|
+
}, {
|
|
269
|
+
op: "put",
|
|
270
|
+
tableName: "project",
|
|
271
|
+
value: {
|
|
272
|
+
id: "p2",
|
|
273
|
+
ownerId: "u1",
|
|
274
|
+
name: "second"
|
|
275
|
+
}
|
|
276
|
+
}]
|
|
277
|
+
}, {
|
|
278
|
+
cookie: 3,
|
|
279
|
+
lastMutationIDChanges: {},
|
|
280
|
+
rowsPatch: [{
|
|
281
|
+
op: "clear"
|
|
282
|
+
}, {
|
|
283
|
+
op: "put",
|
|
284
|
+
tableName: "project",
|
|
285
|
+
value: {
|
|
286
|
+
id: "p3",
|
|
287
|
+
ownerId: "u1",
|
|
288
|
+
name: "third"
|
|
289
|
+
}
|
|
290
|
+
}]
|
|
291
|
+
}];
|
|
292
|
+
var deferred = defer();
|
|
293
|
+
responses.push(deferred.promise);
|
|
294
|
+
var inFlight = 0;
|
|
295
|
+
var maxInFlight = 0;
|
|
296
|
+
var fetch = vi.fn(async function (input, init) {
|
|
297
|
+
inFlight++;
|
|
298
|
+
maxInFlight = Math.max(maxInFlight, inFlight);
|
|
299
|
+
try {
|
|
300
|
+
var request = recordRequest(input, init);
|
|
301
|
+
requests.push(request);
|
|
302
|
+
var response = responses.shift();
|
|
303
|
+
if (!response) throw new Error("missing canned response");
|
|
304
|
+
return jsonResponse(await response);
|
|
305
|
+
} finally {
|
|
306
|
+
inFlight--;
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
var transport = install(fetch);
|
|
310
|
+
var messages = openRawSocket();
|
|
311
|
+
await eventually(function () {
|
|
312
|
+
return expect(messages.some(function (message) {
|
|
313
|
+
return message[0] === "pokeEnd";
|
|
314
|
+
})).toBe(true);
|
|
315
|
+
});
|
|
316
|
+
expect(requests[0].body.cookie).toBeNull();
|
|
317
|
+
expect(findMessage(messages, "pokeStart")[1].baseCookie).toBeNull();
|
|
318
|
+
expect(findMessage(messages, "pokeEnd")[1].cookie).toBe("00000000000000000001");
|
|
319
|
+
messages.length = 0;
|
|
320
|
+
await transport.pull();
|
|
321
|
+
expect(messages.filter(function (message) {
|
|
322
|
+
return message[0].startsWith("poke");
|
|
323
|
+
})).toEqual([]);
|
|
324
|
+
expect(requests[1].body.cookie).toBe(1);
|
|
325
|
+
await transport.pull();
|
|
326
|
+
expect(findMessage(messages, "pokeStart")[1].baseCookie).toBe("00000000000000000001");
|
|
327
|
+
expect(findMessage(messages, "pokeEnd")[1].cookie).toBe("00000000000000000002");
|
|
328
|
+
expect(requests[2].body.cookie).toBe(1);
|
|
329
|
+
messages.length = 0;
|
|
330
|
+
await transport.pull();
|
|
331
|
+
expect(findMessage(messages, "pokeStart")[1].baseCookie).toBe("00000000000000000002");
|
|
332
|
+
expect(findMessage(messages, "pokeEnd")[1].cookie).toBe("00000000000000000003");
|
|
333
|
+
expect(requests[3].body.cookie).toBe(2);
|
|
334
|
+
messages.length = 0;
|
|
335
|
+
var concurrentA = transport.pull();
|
|
336
|
+
var concurrentB = transport.pull();
|
|
337
|
+
await eventually(function () {
|
|
338
|
+
return expect(requests.length).toBe(5);
|
|
339
|
+
});
|
|
340
|
+
deferred.resolve({
|
|
341
|
+
cookie: 4,
|
|
342
|
+
lastMutationIDChanges: {},
|
|
343
|
+
rowsPatch: [{
|
|
344
|
+
op: "clear"
|
|
345
|
+
}]
|
|
346
|
+
});
|
|
347
|
+
await Promise.all([concurrentA, concurrentB]);
|
|
348
|
+
expect(requests.length).toBe(5);
|
|
349
|
+
expect(maxInFlight).toBe(1);
|
|
350
|
+
expect(findMessage(messages, "pokeStart")[1].baseCookie).toBe("00000000000000000003");
|
|
351
|
+
expect(findMessage(messages, "pokeEnd")[1].cookie).toBe("00000000000000000004");
|
|
352
|
+
});
|
|
353
|
+
test("unchanged pull flushes late query registration to complete", async function () {
|
|
354
|
+
var _requests_at;
|
|
355
|
+
var requests = [];
|
|
356
|
+
var fetch = vi.fn(async function (input, init) {
|
|
357
|
+
var request = recordRequest(input, init);
|
|
358
|
+
requests.push(request);
|
|
359
|
+
expect(request.path).toBe("/pull");
|
|
360
|
+
if (request.body.cookie === null) {
|
|
361
|
+
return jsonResponse({
|
|
362
|
+
cookie: 1,
|
|
363
|
+
lastMutationIDChanges: {},
|
|
364
|
+
rowsPatch: [{
|
|
365
|
+
op: "clear"
|
|
366
|
+
}, {
|
|
367
|
+
op: "put",
|
|
368
|
+
tableName: "user",
|
|
369
|
+
value: {
|
|
370
|
+
id: "u1",
|
|
371
|
+
name: "ada"
|
|
372
|
+
}
|
|
373
|
+
}, {
|
|
374
|
+
op: "put",
|
|
375
|
+
tableName: "project",
|
|
376
|
+
value: {
|
|
377
|
+
id: "p1",
|
|
378
|
+
ownerId: "u1",
|
|
379
|
+
name: "first"
|
|
380
|
+
}
|
|
381
|
+
}]
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
return jsonResponse({
|
|
385
|
+
cookie: request.body.cookie,
|
|
386
|
+
unchanged: true
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
install(fetch);
|
|
390
|
+
var zero = createZero();
|
|
391
|
+
var projectView = zero.query.project.materialize();
|
|
392
|
+
await waitForComplete(projectView);
|
|
393
|
+
var userView = zero.query.user.materialize();
|
|
394
|
+
var users = await waitForComplete(userView);
|
|
395
|
+
expect(users).toEqual([{
|
|
396
|
+
id: "u1",
|
|
397
|
+
name: "ada"
|
|
398
|
+
}]);
|
|
399
|
+
expect((_requests_at = requests.at(-1)) === null || _requests_at === void 0 ? void 0 : _requests_at.body.cookie).toBe(1);
|
|
400
|
+
projectView.destroy();
|
|
401
|
+
userView.destroy();
|
|
402
|
+
});
|
|
403
|
+
test("ping is answered locally and the stock Zero connection survives idle ping", async function () {
|
|
404
|
+
var fetch = vi.fn(async function (input, init) {
|
|
405
|
+
var request = recordRequest(input, init);
|
|
406
|
+
expect(request.path).toBe("/pull");
|
|
407
|
+
return jsonResponse({
|
|
408
|
+
cookie: request.body.cookie,
|
|
409
|
+
unchanged: true
|
|
410
|
+
});
|
|
411
|
+
});
|
|
412
|
+
var transport = install(fetch);
|
|
413
|
+
var zero = createZero({
|
|
414
|
+
pingTimeoutMs: 10
|
|
415
|
+
});
|
|
416
|
+
await eventually(function () {
|
|
417
|
+
return expect(zero.connection.state.current.name).toBe("connected");
|
|
418
|
+
});
|
|
419
|
+
await sleep(40);
|
|
420
|
+
expect(zero.connection.state.current.name).toBe("connected");
|
|
421
|
+
expect(transport.connections).toBe(1);
|
|
422
|
+
});
|
|
423
|
+
test("401 pull failure closes the fake socket without materializing data", async function () {
|
|
424
|
+
var requests = [];
|
|
425
|
+
var fetch = vi.fn(async function (input, init) {
|
|
426
|
+
var request = recordRequest(input, init);
|
|
427
|
+
requests.push(request);
|
|
428
|
+
expect(request.path).toBe("/pull");
|
|
429
|
+
return jsonResponse({
|
|
430
|
+
error: "unauthorized"
|
|
431
|
+
}, {
|
|
432
|
+
status: 401
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
var transport = install(fetch);
|
|
436
|
+
var zero = createZero();
|
|
437
|
+
var view = zero.query.project.materialize();
|
|
438
|
+
var emissions = [];
|
|
439
|
+
var cleanup = view.addListener(function (data, resultType) {
|
|
440
|
+
emissions.push({
|
|
441
|
+
data: JSON.parse(JSON.stringify(data)),
|
|
442
|
+
resultType
|
|
443
|
+
});
|
|
444
|
+
});
|
|
445
|
+
await eventually(function () {
|
|
446
|
+
return expect(requests.length).toBeGreaterThan(0);
|
|
447
|
+
});
|
|
448
|
+
await eventually(function () {
|
|
449
|
+
return expect(zero.connection.state.current.name).toBe("needs-auth");
|
|
450
|
+
});
|
|
451
|
+
await sleep(25);
|
|
452
|
+
expect(transport.connections).toBe(0);
|
|
453
|
+
expect(emissions.flatMap(function (emission) {
|
|
454
|
+
return emission.data;
|
|
455
|
+
})).toEqual([]);
|
|
456
|
+
expect(view.data).toEqual([]);
|
|
457
|
+
cleanup();
|
|
458
|
+
view.destroy();
|
|
459
|
+
});
|
|
460
|
+
test("non-origin WebSockets pass through to the native implementation", function () {
|
|
461
|
+
var previous = globalThis.WebSocket;
|
|
462
|
+
var NativeWebSocket = function NativeWebSocket2(url, protocols) {
|
|
463
|
+
"use strict";
|
|
464
|
+
|
|
465
|
+
_class_call_check(this, NativeWebSocket2);
|
|
466
|
+
_define_property(this, "url", void 0);
|
|
467
|
+
_define_property(this, "protocols", void 0);
|
|
468
|
+
this.url = url;
|
|
469
|
+
this.protocols = protocols;
|
|
470
|
+
};
|
|
471
|
+
_define_property(NativeWebSocket, "CONNECTING", 0);
|
|
472
|
+
_define_property(NativeWebSocket, "OPEN", 1);
|
|
473
|
+
_define_property(NativeWebSocket, "CLOSING", 2);
|
|
474
|
+
_define_property(NativeWebSocket, "CLOSED", 3);
|
|
475
|
+
globalThis.WebSocket = NativeWebSocket;
|
|
476
|
+
var transport = installHttpPullTransport({
|
|
477
|
+
origin: ORIGIN,
|
|
478
|
+
fetch: vi.fn()
|
|
479
|
+
});
|
|
480
|
+
var socket = new WebSocket("wss://elsewhere.local/socket", "native");
|
|
481
|
+
expect(socket).toBeInstanceOf(NativeWebSocket);
|
|
482
|
+
expect(socket.url).toBe("wss://elsewhere.local/socket");
|
|
483
|
+
transport.uninstall();
|
|
484
|
+
expect(globalThis.WebSocket).toBe(NativeWebSocket);
|
|
485
|
+
globalThis.WebSocket = previous;
|
|
486
|
+
});
|
|
487
|
+
test("ensureHttpPullTransport installs once per origin", function () {
|
|
488
|
+
var origin = "http://127.0.0.1:65501";
|
|
489
|
+
var first = ensureHttpPullTransport({
|
|
490
|
+
origin,
|
|
491
|
+
fetch: vi.fn()
|
|
492
|
+
});
|
|
493
|
+
var second = ensureHttpPullTransport({
|
|
494
|
+
origin,
|
|
495
|
+
fetch: vi.fn()
|
|
496
|
+
});
|
|
497
|
+
expect(second).toBe(first);
|
|
498
|
+
first.uninstall();
|
|
499
|
+
});
|
|
500
|
+
});
|
|
501
|
+
function install(fetch) {
|
|
502
|
+
var transport = installHttpPullTransport({
|
|
503
|
+
origin: ORIGIN,
|
|
504
|
+
fetch
|
|
505
|
+
});
|
|
506
|
+
transports.push(transport);
|
|
507
|
+
return transport;
|
|
508
|
+
}
|
|
509
|
+
function createZero() {
|
|
510
|
+
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
511
|
+
var zero = new Zero({
|
|
512
|
+
server: ORIGIN,
|
|
513
|
+
userID: "u1",
|
|
514
|
+
auth: "token-u1",
|
|
515
|
+
schema: zeroHttpFixtureSchema,
|
|
516
|
+
kvStore: "mem",
|
|
517
|
+
storageKey: `zero-http-test-${++storageID}`,
|
|
518
|
+
mutators: zeroHttpFixtureMutators,
|
|
519
|
+
pingTimeoutMs: options.pingTimeoutMs
|
|
520
|
+
});
|
|
521
|
+
zeros.push(zero);
|
|
522
|
+
return zero;
|
|
523
|
+
}
|
|
524
|
+
function recordRequest(input, init) {
|
|
525
|
+
var url = new URL(String(input));
|
|
526
|
+
var _init_headers;
|
|
527
|
+
var headers = Object.fromEntries(Object.entries((_init_headers = init === null || init === void 0 ? void 0 : init.headers) !== null && _init_headers !== void 0 ? _init_headers : {}).map(function (param) {
|
|
528
|
+
var [key, value] = param;
|
|
529
|
+
return [key.toLowerCase(), value];
|
|
530
|
+
}));
|
|
531
|
+
return {
|
|
532
|
+
url: url.toString(),
|
|
533
|
+
path: url.pathname,
|
|
534
|
+
headers,
|
|
535
|
+
body: (init === null || init === void 0 ? void 0 : init.body) ? JSON.parse(String(init.body)) : void 0
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
function jsonResponse(body, init) {
|
|
539
|
+
var _init_status;
|
|
540
|
+
return new Response(JSON.stringify(body), {
|
|
541
|
+
status: (_init_status = init === null || init === void 0 ? void 0 : init.status) !== null && _init_status !== void 0 ? _init_status : 200,
|
|
542
|
+
statusText: init === null || init === void 0 ? void 0 : init.statusText,
|
|
543
|
+
headers: {
|
|
544
|
+
"content-type": "application/json",
|
|
545
|
+
...(init === null || init === void 0 ? void 0 : init.headers)
|
|
546
|
+
}
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
async function waitForComplete(view) {
|
|
550
|
+
return new Promise(function (resolve, reject) {
|
|
551
|
+
var timeout = setTimeout(function () {
|
|
552
|
+
return reject(new Error("timed out waiting for complete query"));
|
|
553
|
+
}, 5e3);
|
|
554
|
+
var cleanup = function () {};
|
|
555
|
+
cleanup = view.addListener(function (data, resultType) {
|
|
556
|
+
if (resultType !== "complete") return;
|
|
557
|
+
clearTimeout(timeout);
|
|
558
|
+
cleanup();
|
|
559
|
+
resolve(JSON.parse(JSON.stringify(data)));
|
|
560
|
+
});
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
async function eventually(assertion) {
|
|
564
|
+
var timeout = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1e3;
|
|
565
|
+
var started = Date.now();
|
|
566
|
+
var lastError;
|
|
567
|
+
while (Date.now() - started < timeout) {
|
|
568
|
+
try {
|
|
569
|
+
await assertion();
|
|
570
|
+
return;
|
|
571
|
+
} catch (error) {
|
|
572
|
+
lastError = error;
|
|
573
|
+
await sleep(10);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
throw lastError;
|
|
577
|
+
}
|
|
578
|
+
function sleep(ms) {
|
|
579
|
+
return new Promise(function (resolve) {
|
|
580
|
+
return setTimeout(resolve, ms);
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
function openRawSocket() {
|
|
584
|
+
return openRawSocketWithMessages().messages;
|
|
585
|
+
}
|
|
586
|
+
function openRawSocketWithMessages(opts) {
|
|
587
|
+
var url = new URL(`${ORIGIN}/sync/v51/connect`);
|
|
588
|
+
url.protocol = "wss:";
|
|
589
|
+
url.searchParams.set("clientID", "c1");
|
|
590
|
+
url.searchParams.set("clientGroupID", "cg1");
|
|
591
|
+
url.searchParams.set("userID", "u1");
|
|
592
|
+
url.searchParams.set("baseCookie", "");
|
|
593
|
+
url.searchParams.set("lmid", "0");
|
|
594
|
+
url.searchParams.set("wsid", "ws-test");
|
|
595
|
+
var messages = [];
|
|
596
|
+
var _opts_desiredQueriesPatch, _opts_authToken;
|
|
597
|
+
var socket = new WebSocket(url, encodeSecProtocol(["initConnection", {
|
|
598
|
+
desiredQueriesPatch: (_opts_desiredQueriesPatch = opts === null || opts === void 0 ? void 0 : opts.desiredQueriesPatch) !== null && _opts_desiredQueriesPatch !== void 0 ? _opts_desiredQueriesPatch : []
|
|
599
|
+
}], (_opts_authToken = opts === null || opts === void 0 ? void 0 : opts.authToken) !== null && _opts_authToken !== void 0 ? _opts_authToken : "token-u1"));
|
|
600
|
+
socket.addEventListener("message", function (event) {
|
|
601
|
+
messages.push(JSON.parse(String(event.data)));
|
|
602
|
+
});
|
|
603
|
+
return {
|
|
604
|
+
messages,
|
|
605
|
+
socket
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
function pushBody(id) {
|
|
609
|
+
return {
|
|
610
|
+
clientGroupID: "cg1",
|
|
611
|
+
pushVersion: 1,
|
|
612
|
+
requestID: `push-${id}`,
|
|
613
|
+
timestamp: Date.now(),
|
|
614
|
+
mutations: [{
|
|
615
|
+
type: "custom",
|
|
616
|
+
name: "project|create",
|
|
617
|
+
id,
|
|
618
|
+
clientID: "c1",
|
|
619
|
+
args: [{
|
|
620
|
+
id: `p${id}`,
|
|
621
|
+
ownerId: "u1",
|
|
622
|
+
name: `project ${id}`
|
|
623
|
+
}]
|
|
624
|
+
}]
|
|
625
|
+
};
|
|
626
|
+
}
|
|
627
|
+
function findMessage(messages, type) {
|
|
628
|
+
var message = messages.find(function (item) {
|
|
629
|
+
return item[0] === type;
|
|
630
|
+
});
|
|
631
|
+
expect(message).toBeDefined();
|
|
632
|
+
return message;
|
|
633
|
+
}
|
|
634
|
+
function encodeSecProtocol(initConnectionMessage, authToken) {
|
|
635
|
+
return encodeURIComponent(Buffer.from(JSON.stringify({
|
|
636
|
+
initConnectionMessage,
|
|
637
|
+
authToken
|
|
638
|
+
})).toString("base64"));
|
|
639
|
+
}
|
|
640
|
+
function defer() {
|
|
641
|
+
var resolve;
|
|
642
|
+
var reject;
|
|
643
|
+
var promise = new Promise(function (res, rej) {
|
|
644
|
+
resolve = res;
|
|
645
|
+
reject = rej;
|
|
646
|
+
});
|
|
647
|
+
return {
|
|
648
|
+
promise,
|
|
649
|
+
resolve,
|
|
650
|
+
reject
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
//# sourceMappingURL=transport.test.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Zero","afterEach","describe","expect","test","vi","zeroHttpFixtureMutators","zeroHttpFixtureSchema","ensureHttpPullTransport","installHttpPullTransport","_class_call_check","instance","Constructor","TypeError","_define_property","obj","key","value","Object","defineProperty","enumerable","configurable","writable","ORIGIN","zeros","transports","storageID","_zeros_pop","_transports_pop","length","pop","close","uninstall","useRealTimers","requests","cookie","fetch","fn","input","init","request","recordRequest","push","path","toBe","headers","authorization","jsonResponse","lastMutationIDChanges","rowsPatch","op","tableName","id","name","ownerId","projectId","userId","transport","install","zero","createZero","view","query","project","related","materialize","data","waitForComplete","destroy","connections","toEqual","members","body","toBeNull","clientID","any","String","clientGroupID","unchanged","mutation2","mutations","pushResponse","result","eventually","filter","pullsBeforePush","mutation","mutate","create","client","server","find","toMatchObject","pushVersion","requestID","type","args","_requests_at","socket","openRawSocketWithMessages","authToken","send","JSON","stringify","auth","pull","at","firstPushStarted","defer","releaseFirstPush","pushIDs","mutationID","resolve","promise","map","messages","some","message","pushBody","sleep","toHaveLength","responses","deferred","inFlight","maxInFlight","Math","max","response","shift","Error","openRawSocket","findMessage","baseCookie","startsWith","concurrentA","concurrentB","Promise","all","projectView","userView","user","users","pingTimeoutMs","connection","state","current","error","status","emissions","cleanup","addListener","resultType","parse","toBeGreaterThan"],"sources":["../../../src/httpPull/transport.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|