on-zero 0.4.26 → 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/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/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/package.json +2 -2
- 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/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,666 @@
|
|
|
1
|
+
function _assert_this_initialized(self) {
|
|
2
|
+
if (self === void 0) {
|
|
3
|
+
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
4
|
+
}
|
|
5
|
+
return self;
|
|
6
|
+
}
|
|
7
|
+
function _call_super(_this, derived, args) {
|
|
8
|
+
derived = _get_prototype_of(derived);
|
|
9
|
+
return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
|
|
10
|
+
}
|
|
11
|
+
function _class_call_check(instance, Constructor) {
|
|
12
|
+
if (!(instance instanceof Constructor)) {
|
|
13
|
+
throw new TypeError("Cannot call a class as a function");
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function _construct(Parent, args, Class) {
|
|
17
|
+
if (_is_native_reflect_construct()) {
|
|
18
|
+
_construct = Reflect.construct;
|
|
19
|
+
} else {
|
|
20
|
+
_construct = function construct(Parent2, args2, Class2) {
|
|
21
|
+
var a = [null];
|
|
22
|
+
a.push.apply(a, args2);
|
|
23
|
+
var Constructor = Function.bind.apply(Parent2, a);
|
|
24
|
+
var instance = new Constructor();
|
|
25
|
+
if (Class2) _set_prototype_of(instance, Class2.prototype);
|
|
26
|
+
return instance;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return _construct.apply(null, arguments);
|
|
30
|
+
}
|
|
31
|
+
function _defineProperties(target, props) {
|
|
32
|
+
for (var i = 0; i < props.length; i++) {
|
|
33
|
+
var descriptor = props[i];
|
|
34
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
35
|
+
descriptor.configurable = true;
|
|
36
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
37
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function _create_class(Constructor, protoProps, staticProps) {
|
|
41
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
42
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
43
|
+
return Constructor;
|
|
44
|
+
}
|
|
45
|
+
function _define_property(obj, key, value) {
|
|
46
|
+
if (key in obj) {
|
|
47
|
+
Object.defineProperty(obj, key, {
|
|
48
|
+
value,
|
|
49
|
+
enumerable: true,
|
|
50
|
+
configurable: true,
|
|
51
|
+
writable: true
|
|
52
|
+
});
|
|
53
|
+
} else {
|
|
54
|
+
obj[key] = value;
|
|
55
|
+
}
|
|
56
|
+
return obj;
|
|
57
|
+
}
|
|
58
|
+
function _get_prototype_of(o) {
|
|
59
|
+
_get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o2) {
|
|
60
|
+
return o2.__proto__ || Object.getPrototypeOf(o2);
|
|
61
|
+
};
|
|
62
|
+
return _get_prototype_of(o);
|
|
63
|
+
}
|
|
64
|
+
function _inherits(subClass, superClass) {
|
|
65
|
+
if (typeof superClass !== "function" && superClass !== null) {
|
|
66
|
+
throw new TypeError("Super expression must either be null or a function");
|
|
67
|
+
}
|
|
68
|
+
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
69
|
+
constructor: {
|
|
70
|
+
value: subClass,
|
|
71
|
+
writable: true,
|
|
72
|
+
configurable: true
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
if (superClass) _set_prototype_of(subClass, superClass);
|
|
76
|
+
}
|
|
77
|
+
function _instanceof(left, right) {
|
|
78
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
79
|
+
return !!right[Symbol.hasInstance](left);
|
|
80
|
+
} else {
|
|
81
|
+
return left instanceof right;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function _is_native_function(fn) {
|
|
85
|
+
return Function.toString.call(fn).indexOf("[native code]") !== -1;
|
|
86
|
+
}
|
|
87
|
+
function _possible_constructor_return(self, call) {
|
|
88
|
+
if (call && (_type_of(call) === "object" || typeof call === "function")) {
|
|
89
|
+
return call;
|
|
90
|
+
}
|
|
91
|
+
return _assert_this_initialized(self);
|
|
92
|
+
}
|
|
93
|
+
function _set_prototype_of(o, p) {
|
|
94
|
+
_set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o2, p2) {
|
|
95
|
+
o2.__proto__ = p2;
|
|
96
|
+
return o2;
|
|
97
|
+
};
|
|
98
|
+
return _set_prototype_of(o, p);
|
|
99
|
+
}
|
|
100
|
+
function _type_of(obj) {
|
|
101
|
+
"@swc/helpers - typeof";
|
|
102
|
+
|
|
103
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
104
|
+
}
|
|
105
|
+
function _wrap_native_super(Class) {
|
|
106
|
+
var _cache = typeof Map === "function" ? /* @__PURE__ */new Map() : void 0;
|
|
107
|
+
_wrap_native_super = function wrapNativeSuper(Class2) {
|
|
108
|
+
if (Class2 === null || !_is_native_function(Class2)) return Class2;
|
|
109
|
+
if (typeof Class2 !== "function") {
|
|
110
|
+
throw new TypeError("Super expression must either be null or a function");
|
|
111
|
+
}
|
|
112
|
+
if (typeof _cache !== "undefined") {
|
|
113
|
+
if (_cache.has(Class2)) return _cache.get(Class2);
|
|
114
|
+
_cache.set(Class2, Wrapper);
|
|
115
|
+
}
|
|
116
|
+
function Wrapper() {
|
|
117
|
+
return _construct(Class2, arguments, _get_prototype_of(this).constructor);
|
|
118
|
+
}
|
|
119
|
+
Wrapper.prototype = Object.create(Class2.prototype, {
|
|
120
|
+
constructor: {
|
|
121
|
+
value: Wrapper,
|
|
122
|
+
enumerable: false,
|
|
123
|
+
writable: true,
|
|
124
|
+
configurable: true
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
return _set_prototype_of(Wrapper, Class2);
|
|
128
|
+
};
|
|
129
|
+
return _wrap_native_super(Class);
|
|
130
|
+
}
|
|
131
|
+
function _is_native_reflect_construct() {
|
|
132
|
+
try {
|
|
133
|
+
var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
|
|
134
|
+
} catch (_) {}
|
|
135
|
+
return (_is_native_reflect_construct = function () {
|
|
136
|
+
return !!result;
|
|
137
|
+
})();
|
|
138
|
+
}
|
|
139
|
+
var COOKIE_WIDTH = 20;
|
|
140
|
+
function installHttpPullTransport(opts) {
|
|
141
|
+
var _class;
|
|
142
|
+
var previousWebSocket = globalThis.WebSocket;
|
|
143
|
+
var _opts_fetch;
|
|
144
|
+
var fetchImpl = (_opts_fetch = opts.fetch) !== null && _opts_fetch !== void 0 ? _opts_fetch : globalThis.fetch;
|
|
145
|
+
if (!fetchImpl) {
|
|
146
|
+
throw new Error("installHttpPullTransport requires a fetch implementation");
|
|
147
|
+
}
|
|
148
|
+
var state = {
|
|
149
|
+
origin: new URL(opts.origin),
|
|
150
|
+
originString: trimTrailingSlash(new URL(opts.origin).toString()),
|
|
151
|
+
fetch: fetchImpl,
|
|
152
|
+
nativeWebSocket: previousWebSocket,
|
|
153
|
+
sockets: /* @__PURE__ */new Set(),
|
|
154
|
+
pullIntervalMs: opts.pullIntervalMs,
|
|
155
|
+
nextPokeID: 0
|
|
156
|
+
};
|
|
157
|
+
var Shim = (_class = function _class2(url, protocols) {
|
|
158
|
+
"use strict";
|
|
159
|
+
|
|
160
|
+
_class_call_check(this, _class2);
|
|
161
|
+
if (shouldIntercept(state.origin, url)) {
|
|
162
|
+
return new ZeroHttpSocket(state, url, protocols);
|
|
163
|
+
}
|
|
164
|
+
if (!state.nativeWebSocket) {
|
|
165
|
+
throw new Error(`No native WebSocket available for ${String(url)}`);
|
|
166
|
+
}
|
|
167
|
+
return new state.nativeWebSocket(url, protocols);
|
|
168
|
+
}, _define_property(_class, "CONNECTING", 0), _define_property(_class, "OPEN", 1), _define_property(_class, "CLOSING", 2), _define_property(_class, "CLOSED", 3), _class);
|
|
169
|
+
globalThis.WebSocket = Shim;
|
|
170
|
+
return {
|
|
171
|
+
pull: async function () {
|
|
172
|
+
await Promise.all([...state.sockets].map(function (socket) {
|
|
173
|
+
return socket.pull();
|
|
174
|
+
}));
|
|
175
|
+
},
|
|
176
|
+
get connections() {
|
|
177
|
+
return state.sockets.size;
|
|
178
|
+
},
|
|
179
|
+
uninstall: function () {
|
|
180
|
+
if (globalThis.WebSocket === Shim) {
|
|
181
|
+
globalThis.WebSocket = previousWebSocket;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
var transportsByOrigin = /* @__PURE__ */new Map();
|
|
187
|
+
function ensureHttpPullTransport(opts) {
|
|
188
|
+
var key = trimTrailingSlash(new URL(opts.origin).toString());
|
|
189
|
+
var existing = transportsByOrigin.get(key);
|
|
190
|
+
if (existing) return existing;
|
|
191
|
+
var transport = installHttpPullTransport(opts);
|
|
192
|
+
transportsByOrigin.set(key, transport);
|
|
193
|
+
return transport;
|
|
194
|
+
}
|
|
195
|
+
var ZeroHttpSocket = /* @__PURE__ */function () {
|
|
196
|
+
"use strict";
|
|
197
|
+
|
|
198
|
+
function ZeroHttpSocket2(state, url, protocols) {
|
|
199
|
+
var _this = this;
|
|
200
|
+
_class_call_check(this, ZeroHttpSocket2);
|
|
201
|
+
var _decoded_initConnectionMessage;
|
|
202
|
+
_define_property(this, "state", void 0);
|
|
203
|
+
_define_property(this, "CONNECTING", void 0);
|
|
204
|
+
_define_property(this, "OPEN", void 0);
|
|
205
|
+
_define_property(this, "CLOSING", void 0);
|
|
206
|
+
_define_property(this, "CLOSED", void 0);
|
|
207
|
+
_define_property(this, "url", void 0);
|
|
208
|
+
_define_property(this, "readyState", void 0);
|
|
209
|
+
_define_property(this, "connectURL", void 0);
|
|
210
|
+
_define_property(this, "authToken", void 0);
|
|
211
|
+
_define_property(this, "listeners", void 0);
|
|
212
|
+
_define_property(this, "clientID", void 0);
|
|
213
|
+
_define_property(this, "clientGroupID", void 0);
|
|
214
|
+
_define_property(this, "wsid", void 0);
|
|
215
|
+
_define_property(this, "cookie", void 0);
|
|
216
|
+
_define_property(this, "pendingGotQueriesPatch", void 0);
|
|
217
|
+
_define_property(this, "pullInFlight", void 0);
|
|
218
|
+
_define_property(this, "pullAfterCurrent", void 0);
|
|
219
|
+
_define_property(this, "pushChain", void 0);
|
|
220
|
+
_define_property(this, "nextLocalCookieID", void 0);
|
|
221
|
+
_define_property(this, "openTimer", void 0);
|
|
222
|
+
_define_property(this, "pullTimer", void 0);
|
|
223
|
+
this.state = state;
|
|
224
|
+
this.CONNECTING = 0;
|
|
225
|
+
this.OPEN = 1;
|
|
226
|
+
this.CLOSING = 2;
|
|
227
|
+
this.CLOSED = 3;
|
|
228
|
+
this.readyState = this.CONNECTING;
|
|
229
|
+
this.listeners = {
|
|
230
|
+
open: /* @__PURE__ */new Set(),
|
|
231
|
+
message: /* @__PURE__ */new Set(),
|
|
232
|
+
close: /* @__PURE__ */new Set(),
|
|
233
|
+
error: /* @__PURE__ */new Set()
|
|
234
|
+
};
|
|
235
|
+
this.pendingGotQueriesPatch = [];
|
|
236
|
+
this.pullAfterCurrent = false;
|
|
237
|
+
this.pushChain = Promise.resolve();
|
|
238
|
+
this.nextLocalCookieID = 0;
|
|
239
|
+
this.connectURL = toHttpURL(url);
|
|
240
|
+
this.url = String(url);
|
|
241
|
+
var _this_connectURL_searchParams_get;
|
|
242
|
+
this.clientID = (_this_connectURL_searchParams_get = this.connectURL.searchParams.get("clientID")) !== null && _this_connectURL_searchParams_get !== void 0 ? _this_connectURL_searchParams_get : "";
|
|
243
|
+
var _this_connectURL_searchParams_get1;
|
|
244
|
+
this.clientGroupID = (_this_connectURL_searchParams_get1 = this.connectURL.searchParams.get("clientGroupID")) !== null && _this_connectURL_searchParams_get1 !== void 0 ? _this_connectURL_searchParams_get1 : "";
|
|
245
|
+
var _this_connectURL_searchParams_get2;
|
|
246
|
+
this.wsid = (_this_connectURL_searchParams_get2 = this.connectURL.searchParams.get("wsid")) !== null && _this_connectURL_searchParams_get2 !== void 0 ? _this_connectURL_searchParams_get2 : `zero-http-${Date.now()}`;
|
|
247
|
+
var baseCookie = this.connectURL.searchParams.get("baseCookie");
|
|
248
|
+
this.cookie = baseCookie ? baseCookie : null;
|
|
249
|
+
var decoded = decodeSecProtocol(protocols);
|
|
250
|
+
this.authToken = decoded.authToken;
|
|
251
|
+
this.queueDesiredQueries((_decoded_initConnectionMessage = decoded.initConnectionMessage) === null || _decoded_initConnectionMessage === void 0 ? void 0 : _decoded_initConnectionMessage[1]);
|
|
252
|
+
this.state.sockets.add(this);
|
|
253
|
+
this.openTimer = setTimeout(function () {
|
|
254
|
+
return _this.open();
|
|
255
|
+
}, 0);
|
|
256
|
+
}
|
|
257
|
+
_create_class(ZeroHttpSocket2, [{
|
|
258
|
+
key: "addEventListener",
|
|
259
|
+
value: function addEventListener(type, listener) {
|
|
260
|
+
var _this_listeners_type;
|
|
261
|
+
if (listener) (_this_listeners_type = this.listeners[type]) === null || _this_listeners_type === void 0 ? void 0 : _this_listeners_type.add(listener);
|
|
262
|
+
}
|
|
263
|
+
}, {
|
|
264
|
+
key: "removeEventListener",
|
|
265
|
+
value: function removeEventListener(type, listener) {
|
|
266
|
+
var _this_listeners_type;
|
|
267
|
+
if (listener) (_this_listeners_type = this.listeners[type]) === null || _this_listeners_type === void 0 ? void 0 : _this_listeners_type.delete(listener);
|
|
268
|
+
}
|
|
269
|
+
}, {
|
|
270
|
+
key: "dispatchEvent",
|
|
271
|
+
value: function dispatchEvent(event) {
|
|
272
|
+
this.emit(event.type, event);
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
}, {
|
|
276
|
+
key: "send",
|
|
277
|
+
value: function send(data) {
|
|
278
|
+
if (this.readyState !== this.OPEN) {
|
|
279
|
+
throw new Error("cannot send on a socket that is not open");
|
|
280
|
+
}
|
|
281
|
+
var message = JSON.parse(data);
|
|
282
|
+
switch (message[0]) {
|
|
283
|
+
case "initConnection":
|
|
284
|
+
case "changeDesiredQueries":
|
|
285
|
+
this.queueDesiredQueries(message[1]);
|
|
286
|
+
this.requestPullAfterCurrent();
|
|
287
|
+
return;
|
|
288
|
+
case "updateAuth":
|
|
289
|
+
this.authToken = message[1].auth;
|
|
290
|
+
return;
|
|
291
|
+
case "push":
|
|
292
|
+
this.enqueuePush(message[1]);
|
|
293
|
+
return;
|
|
294
|
+
case "ping":
|
|
295
|
+
this.emitMessage(["pong", {}]);
|
|
296
|
+
return;
|
|
297
|
+
case "pull":
|
|
298
|
+
this.run(this.answerMutationRecoveryPull(message[1]));
|
|
299
|
+
return;
|
|
300
|
+
case "deleteClients":
|
|
301
|
+
case "ackMutationResponses":
|
|
302
|
+
return;
|
|
303
|
+
default:
|
|
304
|
+
throw new Error(`unsupported zero-http upstream message ${message[0]}`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}, {
|
|
308
|
+
key: "close",
|
|
309
|
+
value: function close() {
|
|
310
|
+
var code = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1e3,
|
|
311
|
+
reason = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "";
|
|
312
|
+
if (this.readyState === this.CLOSED) return;
|
|
313
|
+
if (this.openTimer) clearTimeout(this.openTimer);
|
|
314
|
+
if (this.pullTimer) clearInterval(this.pullTimer);
|
|
315
|
+
this.readyState = this.CLOSED;
|
|
316
|
+
this.state.sockets.delete(this);
|
|
317
|
+
this.emit("close", {
|
|
318
|
+
code,
|
|
319
|
+
reason,
|
|
320
|
+
wasClean: code <= 1001
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
}, {
|
|
324
|
+
key: "pull",
|
|
325
|
+
value: function pull() {
|
|
326
|
+
var _this = this;
|
|
327
|
+
if (this.readyState === this.CLOSED) return Promise.resolve();
|
|
328
|
+
if (this.pullInFlight) return this.pullInFlight;
|
|
329
|
+
this.pullInFlight = this.fetchPull(this.clientGroupID, this.cookie).then(function (response) {
|
|
330
|
+
if (response.unchanged) {
|
|
331
|
+
_this.emitGotQueriesPatch(response.cookie);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
_this.emitPoke(response);
|
|
335
|
+
}).catch(function (error) {
|
|
336
|
+
_this.fail(error);
|
|
337
|
+
throw error;
|
|
338
|
+
}).finally(async function () {
|
|
339
|
+
var pullAgain = _this.pullAfterCurrent;
|
|
340
|
+
_this.pullAfterCurrent = false;
|
|
341
|
+
_this.pullInFlight = void 0;
|
|
342
|
+
if (pullAgain && _this.readyState !== _this.CLOSED) await _this.pull();
|
|
343
|
+
});
|
|
344
|
+
return this.pullInFlight;
|
|
345
|
+
}
|
|
346
|
+
}, {
|
|
347
|
+
key: "open",
|
|
348
|
+
value: function open() {
|
|
349
|
+
var _this = this;
|
|
350
|
+
if (this.readyState !== this.CONNECTING) return;
|
|
351
|
+
this.readyState = this.OPEN;
|
|
352
|
+
this.emit("open", {});
|
|
353
|
+
this.emitMessage(["connected", {
|
|
354
|
+
wsid: this.wsid,
|
|
355
|
+
timestamp: Date.now()
|
|
356
|
+
}]);
|
|
357
|
+
setTimeout(function () {
|
|
358
|
+
return _this.run(_this.pull());
|
|
359
|
+
}, 0);
|
|
360
|
+
if (this.state.pullIntervalMs) {
|
|
361
|
+
this.pullTimer = setInterval(function () {
|
|
362
|
+
_this.run(_this.pull());
|
|
363
|
+
}, this.state.pullIntervalMs);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}, {
|
|
367
|
+
key: "queueDesiredQueries",
|
|
368
|
+
value: function queueDesiredQueries(body) {
|
|
369
|
+
var desiredQueriesPatch = body === null || body === void 0 ? void 0 : body.desiredQueriesPatch;
|
|
370
|
+
if (!Array.isArray(desiredQueriesPatch)) return;
|
|
371
|
+
this.pendingGotQueriesPatch.push(...gotQueriesPatch(desiredQueriesPatch));
|
|
372
|
+
}
|
|
373
|
+
}, {
|
|
374
|
+
key: "push",
|
|
375
|
+
value: async function push(body) {
|
|
376
|
+
var response = await this.postJSON("/push", body);
|
|
377
|
+
this.emitMessage(["pushResponse", response.pushResponse]);
|
|
378
|
+
this.requestPullAfterCurrent();
|
|
379
|
+
}
|
|
380
|
+
}, {
|
|
381
|
+
key: "enqueuePush",
|
|
382
|
+
value: function enqueuePush(body) {
|
|
383
|
+
var _this = this;
|
|
384
|
+
var nextPush = this.pushChain.then(async function () {
|
|
385
|
+
if (_this.readyState === _this.CLOSED) return;
|
|
386
|
+
await _this.push(body);
|
|
387
|
+
});
|
|
388
|
+
this.pushChain = nextPush.catch(function () {});
|
|
389
|
+
this.run(nextPush);
|
|
390
|
+
}
|
|
391
|
+
}, {
|
|
392
|
+
key: "requestPullAfterCurrent",
|
|
393
|
+
value: function requestPullAfterCurrent() {
|
|
394
|
+
if (this.pullInFlight) {
|
|
395
|
+
this.pullAfterCurrent = true;
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
this.run(this.pull());
|
|
399
|
+
}
|
|
400
|
+
}, {
|
|
401
|
+
key: "answerMutationRecoveryPull",
|
|
402
|
+
value: async function answerMutationRecoveryPull(body) {
|
|
403
|
+
var response = await this.fetchPull(body.clientGroupID, body.cookie);
|
|
404
|
+
var cookie = toWebSocketCookie(response.cookie);
|
|
405
|
+
var _ref;
|
|
406
|
+
this.emitMessage(["pull", {
|
|
407
|
+
requestID: body.requestID,
|
|
408
|
+
cookie: (_ref = cookie !== null && cookie !== void 0 ? cookie : this.cookie) !== null && _ref !== void 0 ? _ref : "0",
|
|
409
|
+
lastMutationIDChanges: response.unchanged ? {} : response.lastMutationIDChanges
|
|
410
|
+
}]);
|
|
411
|
+
}
|
|
412
|
+
}, {
|
|
413
|
+
key: "fetchPull",
|
|
414
|
+
value: async function fetchPull(clientGroupID, cookie) {
|
|
415
|
+
return await this.postJSON("/pull", {
|
|
416
|
+
clientID: this.clientID,
|
|
417
|
+
clientGroupID,
|
|
418
|
+
cookie: toHttpCookie(cookie)
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
}, {
|
|
422
|
+
key: "postJSON",
|
|
423
|
+
value: async function postJSON(path, body) {
|
|
424
|
+
var response = await this.state.fetch(`${this.state.originString}${path}`, {
|
|
425
|
+
method: "POST",
|
|
426
|
+
headers: {
|
|
427
|
+
authorization: this.authToken ? `Bearer ${this.authToken}` : "",
|
|
428
|
+
"content-type": "application/json"
|
|
429
|
+
},
|
|
430
|
+
body: JSON.stringify(body)
|
|
431
|
+
});
|
|
432
|
+
if (!response.ok) {
|
|
433
|
+
throw new ZeroHttpResponseError(path, response.status);
|
|
434
|
+
}
|
|
435
|
+
return response.json();
|
|
436
|
+
}
|
|
437
|
+
}, {
|
|
438
|
+
key: "run",
|
|
439
|
+
value: function run(promise) {
|
|
440
|
+
var _this = this;
|
|
441
|
+
void promise.catch(function (error) {
|
|
442
|
+
return _this.fail(error);
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
}, {
|
|
446
|
+
key: "fail",
|
|
447
|
+
value: function fail(error) {
|
|
448
|
+
if (this.readyState === this.CLOSED) return;
|
|
449
|
+
if (isAuthHTTPError(error)) {
|
|
450
|
+
this.emitMessage(["error", {
|
|
451
|
+
kind: "Unauthorized",
|
|
452
|
+
message: error.message,
|
|
453
|
+
origin: "server"
|
|
454
|
+
}]);
|
|
455
|
+
if (this.readyState !== this.CLOSED) this.close(1e3, error.message);
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
this.emit("error", {
|
|
459
|
+
error
|
|
460
|
+
});
|
|
461
|
+
this.close(1011, errorMessage(error));
|
|
462
|
+
}
|
|
463
|
+
}, {
|
|
464
|
+
key: "emitPoke",
|
|
465
|
+
value: function emitPoke(response) {
|
|
466
|
+
var nextCookie = toWebSocketCookie(response.cookie);
|
|
467
|
+
if (isStaleCookie(this.cookie, response.cookie)) {
|
|
468
|
+
throw new Error(`zero-http pull returned stale cookie ${response.cookie} for ${this.cookie}`);
|
|
469
|
+
}
|
|
470
|
+
var pokeID = `zero-http-${++this.state.nextPokeID}`;
|
|
471
|
+
var gotQueries = this.pendingGotQueriesPatch;
|
|
472
|
+
this.pendingGotQueriesPatch = [];
|
|
473
|
+
this.emitMessage(["pokeStart", {
|
|
474
|
+
pokeID,
|
|
475
|
+
baseCookie: this.cookie,
|
|
476
|
+
schemaVersions: {
|
|
477
|
+
minSupportedVersion: 1,
|
|
478
|
+
maxSupportedVersion: 1
|
|
479
|
+
},
|
|
480
|
+
timestamp: Date.now()
|
|
481
|
+
}]);
|
|
482
|
+
this.emitMessage(["pokePart", {
|
|
483
|
+
pokeID,
|
|
484
|
+
lastMutationIDChanges: response.lastMutationIDChanges,
|
|
485
|
+
rowsPatch: response.rowsPatch
|
|
486
|
+
}]);
|
|
487
|
+
if (gotQueries.length > 0) {
|
|
488
|
+
this.emitMessage(["pokePart", {
|
|
489
|
+
pokeID,
|
|
490
|
+
gotQueriesPatch: gotQueries
|
|
491
|
+
}]);
|
|
492
|
+
}
|
|
493
|
+
this.emitMessage(["pokeEnd", {
|
|
494
|
+
pokeID,
|
|
495
|
+
cookie: nextCookie
|
|
496
|
+
}]);
|
|
497
|
+
this.cookie = nextCookie;
|
|
498
|
+
}
|
|
499
|
+
}, {
|
|
500
|
+
key: "emitGotQueriesPatch",
|
|
501
|
+
value: function emitGotQueriesPatch(cookie) {
|
|
502
|
+
if (this.pendingGotQueriesPatch.length === 0) return;
|
|
503
|
+
var serverCookie = cookie !== null && cookie !== void 0 ? cookie : toHttpCookie(this.cookie);
|
|
504
|
+
if (serverCookie === null) return;
|
|
505
|
+
var nextCookie = toLocalWebSocketCookie(serverCookie, ++this.nextLocalCookieID);
|
|
506
|
+
var pokeID = `zero-http-${++this.state.nextPokeID}`;
|
|
507
|
+
var gotQueries = this.pendingGotQueriesPatch;
|
|
508
|
+
this.pendingGotQueriesPatch = [];
|
|
509
|
+
this.emitMessage(["pokeStart", {
|
|
510
|
+
pokeID,
|
|
511
|
+
baseCookie: this.cookie,
|
|
512
|
+
schemaVersions: {
|
|
513
|
+
minSupportedVersion: 1,
|
|
514
|
+
maxSupportedVersion: 1
|
|
515
|
+
},
|
|
516
|
+
timestamp: Date.now()
|
|
517
|
+
}]);
|
|
518
|
+
this.emitMessage(["pokePart", {
|
|
519
|
+
pokeID,
|
|
520
|
+
gotQueriesPatch: gotQueries
|
|
521
|
+
}]);
|
|
522
|
+
this.emitMessage(["pokeEnd", {
|
|
523
|
+
pokeID,
|
|
524
|
+
cookie: nextCookie
|
|
525
|
+
}]);
|
|
526
|
+
this.cookie = nextCookie;
|
|
527
|
+
}
|
|
528
|
+
}, {
|
|
529
|
+
key: "emitMessage",
|
|
530
|
+
value: function emitMessage(message) {
|
|
531
|
+
if (this.readyState !== this.OPEN) return;
|
|
532
|
+
this.emit("message", {
|
|
533
|
+
data: JSON.stringify(message)
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
}, {
|
|
537
|
+
key: "emit",
|
|
538
|
+
value: function emit(type, event) {
|
|
539
|
+
var handler = this[`on${type}`];
|
|
540
|
+
if (typeof handler === "function") handler.call(this, event);
|
|
541
|
+
var _iteratorNormalCompletion = true,
|
|
542
|
+
_didIteratorError = false,
|
|
543
|
+
_iteratorError = void 0;
|
|
544
|
+
try {
|
|
545
|
+
for (var _iterator = this.listeners[type][Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
546
|
+
var listener = _step.value;
|
|
547
|
+
if (typeof listener === "function") listener(event);else listener.handleEvent(event);
|
|
548
|
+
}
|
|
549
|
+
} catch (err) {
|
|
550
|
+
_didIteratorError = true;
|
|
551
|
+
_iteratorError = err;
|
|
552
|
+
} finally {
|
|
553
|
+
try {
|
|
554
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
555
|
+
_iterator.return();
|
|
556
|
+
}
|
|
557
|
+
} finally {
|
|
558
|
+
if (_didIteratorError) {
|
|
559
|
+
throw _iteratorError;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}]);
|
|
565
|
+
return ZeroHttpSocket2;
|
|
566
|
+
}();
|
|
567
|
+
function shouldIntercept(origin, url) {
|
|
568
|
+
var candidate = toHttpURL(url);
|
|
569
|
+
if (candidate.origin !== origin.origin) return false;
|
|
570
|
+
return candidate.pathname === `${trimTrailingSlash(origin.pathname)}/sync/v51/connect`;
|
|
571
|
+
}
|
|
572
|
+
function toHttpURL(url) {
|
|
573
|
+
var parsed = new URL(url);
|
|
574
|
+
if (parsed.protocol === "ws:") parsed.protocol = "http:";
|
|
575
|
+
if (parsed.protocol === "wss:") parsed.protocol = "https:";
|
|
576
|
+
return parsed;
|
|
577
|
+
}
|
|
578
|
+
function trimTrailingSlash(value) {
|
|
579
|
+
return value.endsWith("/") ? value.slice(0, -1) : value;
|
|
580
|
+
}
|
|
581
|
+
function decodeSecProtocol(protocols) {
|
|
582
|
+
var protocol = Array.isArray(protocols) ? protocols[0] : protocols;
|
|
583
|
+
if (!protocol) return {};
|
|
584
|
+
try {
|
|
585
|
+
var decoded = decodeURIComponent(protocol);
|
|
586
|
+
var json = new TextDecoder().decode(Uint8Array.from(globalThis.atob(decoded), function (char) {
|
|
587
|
+
return char.charCodeAt(0);
|
|
588
|
+
}));
|
|
589
|
+
var parsed = JSON.parse(json);
|
|
590
|
+
return {
|
|
591
|
+
authToken: parsed.authToken,
|
|
592
|
+
initConnectionMessage: Array.isArray(parsed.initConnectionMessage) ? parsed.initConnectionMessage : void 0
|
|
593
|
+
};
|
|
594
|
+
} catch (e) {
|
|
595
|
+
return {};
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
function gotQueriesPatch(patch) {
|
|
599
|
+
var got = [];
|
|
600
|
+
var _iteratorNormalCompletion = true,
|
|
601
|
+
_didIteratorError = false,
|
|
602
|
+
_iteratorError = void 0;
|
|
603
|
+
try {
|
|
604
|
+
for (var _iterator = patch[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
605
|
+
var op = _step.value;
|
|
606
|
+
if (op.op === "clear") got.push({
|
|
607
|
+
op: "clear"
|
|
608
|
+
});else if (op.hash) got.push({
|
|
609
|
+
op: op.op,
|
|
610
|
+
hash: op.hash
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
} catch (err) {
|
|
614
|
+
_didIteratorError = true;
|
|
615
|
+
_iteratorError = err;
|
|
616
|
+
} finally {
|
|
617
|
+
try {
|
|
618
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
619
|
+
_iterator.return();
|
|
620
|
+
}
|
|
621
|
+
} finally {
|
|
622
|
+
if (_didIteratorError) {
|
|
623
|
+
throw _iteratorError;
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
return got;
|
|
628
|
+
}
|
|
629
|
+
function toHttpCookie(cookie) {
|
|
630
|
+
if (cookie === null || cookie === "") return null;
|
|
631
|
+
var parsed = Number(cookie.slice(0, COOKIE_WIDTH));
|
|
632
|
+
if (!Number.isFinite(parsed)) {
|
|
633
|
+
throw new Error(`zero-http cookie is not numeric: ${cookie}`);
|
|
634
|
+
}
|
|
635
|
+
return parsed;
|
|
636
|
+
}
|
|
637
|
+
function toWebSocketCookie(cookie) {
|
|
638
|
+
return cookie === null ? null : String(cookie).padStart(COOKIE_WIDTH, "0");
|
|
639
|
+
}
|
|
640
|
+
function toLocalWebSocketCookie(cookie, localID) {
|
|
641
|
+
return `${String(cookie).padStart(COOKIE_WIDTH, "0")}#${String(localID).padStart(6, "0")}`;
|
|
642
|
+
}
|
|
643
|
+
function isStaleCookie(current, next) {
|
|
644
|
+
var currentNumber = toHttpCookie(current);
|
|
645
|
+
return currentNumber !== null && next <= currentNumber;
|
|
646
|
+
}
|
|
647
|
+
function errorMessage(error) {
|
|
648
|
+
return _instanceof(error, Error) ? error.message : String(error);
|
|
649
|
+
}
|
|
650
|
+
var ZeroHttpResponseError = /* @__PURE__ */function (Error1) {
|
|
651
|
+
"use strict";
|
|
652
|
+
|
|
653
|
+
_inherits(ZeroHttpResponseError2, Error1);
|
|
654
|
+
function ZeroHttpResponseError2(path, status) {
|
|
655
|
+
_class_call_check(this, ZeroHttpResponseError2);
|
|
656
|
+
var _this;
|
|
657
|
+
_this = _call_super(this, ZeroHttpResponseError2, [`zero-http ${path} failed with ${status}`]), _define_property(_this, "path", void 0), _define_property(_this, "status", void 0), _this.path = path, _this.status = status;
|
|
658
|
+
return _this;
|
|
659
|
+
}
|
|
660
|
+
return ZeroHttpResponseError2;
|
|
661
|
+
}(_wrap_native_super(Error));
|
|
662
|
+
function isAuthHTTPError(error) {
|
|
663
|
+
return _instanceof(error, ZeroHttpResponseError) && (error.status === 401 || error.status === 403);
|
|
664
|
+
}
|
|
665
|
+
export { ensureHttpPullTransport, installHttpPullTransport };
|
|
666
|
+
//# sourceMappingURL=httpPullTransport.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_assert_this_initialized","self","ReferenceError","_call_super","_this","derived","args","_get_prototype_of","_possible_constructor_return","_is_native_reflect_construct","Reflect","construct","constructor","apply","_class_call_check","instance","Constructor","TypeError","_construct","Parent","Class","Parent2","args2","Class2","a","push","Function","bind","_set_prototype_of","prototype","arguments","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_create_class","protoProps","staticProps","_define_property","obj","value","o","setPrototypeOf","getPrototypeOf","o2","__proto__","_inherits","subClass","superClass","create","_instanceof","left","right","Symbol","hasInstance","_is_native_function","fn","toString","call","indexOf","_type_of","p","p2","_wrap_native_super","_cache","Map","wrapNativeSuper","has","get","set","Wrapper","result","Boolean","valueOf","_","COOKIE_WIDTH","installHttpPullTransport","opts","_class","previousWebSocket","globalThis","WebSocket","_opts_fetch","fetchImpl","fetch","Error","state","origin","URL","originString","trimTrailingSlash","nativeWebSocket","sockets","Set","pullIntervalMs","nextPokeID","Shim","_class2","url","protocols","shouldIntercept","ZeroHttpSocket","String","pull","Promise","all","map","socket","connections","size","uninstall","transportsByOrigin","ensureHttpPullTransport","existing","transport","ZeroHttpSocket2","_decoded_initConnectionMessage","CONNECTING","OPEN","CLOSING","CLOSED","readyState","listeners","open","message","close","error","pendingGotQueriesPatch","pullAfterCurrent","pushChain","resolve","nextLocalCookieID","connectURL","toHttpURL","_this_connectURL_searchParams_get","clientID","searchParams","_this_connectURL_searchParams_get1","clientGroupID","_this_connectURL_searchParams_get2","wsid","Date","now","baseCookie","cookie","decoded","decodeSecProtocol","authToken","queueDesiredQueries","initConnectionMessage","add","openTimer","setTimeout","addEventListener","type","listener","_this_listeners_type","removeEventListener","delete","dispatchEvent","event","emit","send","data","JSON","parse","requestPullAfterCurrent","auth","enqueuePush","emitMessage","run","answerMutationRecoveryPull","code","reason","clearTimeout","pullTimer","clearInterval","wasClean","pullInFlight","fetchPull","then","response","unchanged","emitGotQueriesPatch","emitPoke","catch","fail","finally","pullAgain","timestamp","setInterval","body","desiredQueriesPatch","Array","isArray","gotQueriesPatch","postJSON","pushResponse","nextPush"],"sources":["../../src/httpPullTransport.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|