@fitzzero/quickdraw-core 5.1.1 → 5.1.3

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.
Files changed (152) hide show
  1. package/README.md +1308 -219
  2. package/dist/{admin-DKwkIh5i.d.ts → admin-CS7JB_UH.d.ts} +2 -2
  3. package/dist/{adminSchemas-2DUA_hZ8.d.ts → adminSchemas-29cGgrg5.d.ts} +6 -4
  4. package/dist/{auth-BhWqdyb-.d.ts → auth-DtdYjrZ9.d.ts} +51 -21
  5. package/dist/{caller-CXTFswBO.d.ts → caller-BTwGl7vm.d.ts} +296 -33
  6. package/dist/chunk-2FDSKLBO.js +82 -0
  7. package/dist/chunk-2FDSKLBO.js.map +1 -0
  8. package/dist/{chunk-RT6OILOI.js → chunk-4D2DOGAW.js} +2 -14
  9. package/dist/chunk-4D2DOGAW.js.map +1 -0
  10. package/dist/{chunk-OECZPRPW.js → chunk-64I6MYBC.js} +162 -775
  11. package/dist/chunk-64I6MYBC.js.map +1 -0
  12. package/dist/chunk-7473HK24.js +17 -0
  13. package/dist/chunk-7473HK24.js.map +1 -0
  14. package/dist/chunk-7Y5ROPXL.js +33 -0
  15. package/dist/chunk-7Y5ROPXL.js.map +1 -0
  16. package/dist/chunk-A2RBQD66.js +7 -0
  17. package/dist/chunk-A2RBQD66.js.map +1 -0
  18. package/dist/chunk-AK23XSWD.js +16 -0
  19. package/dist/chunk-AK23XSWD.js.map +1 -0
  20. package/dist/chunk-ASAMUGHG.js +651 -0
  21. package/dist/chunk-ASAMUGHG.js.map +1 -0
  22. package/dist/{chunk-B2P7AZ25.js → chunk-CYE4UBOB.js} +6 -4
  23. package/dist/chunk-CYE4UBOB.js.map +1 -0
  24. package/dist/chunk-DKE6QO26.js +136 -0
  25. package/dist/chunk-DKE6QO26.js.map +1 -0
  26. package/dist/chunk-DNP65TD5.js +832 -0
  27. package/dist/chunk-DNP65TD5.js.map +1 -0
  28. package/dist/{chunk-H23KEFBA.js → chunk-DUBU3BB3.js} +30 -1
  29. package/dist/chunk-DUBU3BB3.js.map +1 -0
  30. package/dist/chunk-GYLWEJHW.js +19 -0
  31. package/dist/chunk-GYLWEJHW.js.map +1 -0
  32. package/dist/{chunk-SHEGLZEP.js → chunk-I3JCFS7H.js} +34 -13
  33. package/dist/chunk-I3JCFS7H.js.map +1 -0
  34. package/dist/{chunk-X5CWPX7H.js → chunk-IIQ3WMJK.js} +13 -2
  35. package/dist/chunk-IIQ3WMJK.js.map +1 -0
  36. package/dist/{chunk-RZTP4IEW.js → chunk-JVTONQFI.js} +6339 -4226
  37. package/dist/chunk-JVTONQFI.js.map +1 -0
  38. package/dist/{chunk-QEKVYG5F.js → chunk-KKQANRLG.js} +2 -2
  39. package/dist/chunk-KKQANRLG.js.map +1 -0
  40. package/dist/{chunk-CDKG4TFA.js → chunk-MPQAT55F.js} +38 -205
  41. package/dist/chunk-MPQAT55F.js.map +1 -0
  42. package/dist/chunk-NO4M6PO5.js +101 -0
  43. package/dist/chunk-NO4M6PO5.js.map +1 -0
  44. package/dist/{chunk-TBMKJ26R.js → chunk-NW6U45HX.js} +3 -1
  45. package/dist/chunk-NW6U45HX.js.map +1 -0
  46. package/dist/chunk-NX2V6SIL.js +202 -0
  47. package/dist/chunk-NX2V6SIL.js.map +1 -0
  48. package/dist/{chunk-ZIVPHYRG.js → chunk-NZHA4TZD.js} +72 -175
  49. package/dist/chunk-NZHA4TZD.js.map +1 -0
  50. package/dist/{chunk-2PWMUVC7.js → chunk-OCZJ4EYV.js} +518 -27
  51. package/dist/chunk-OCZJ4EYV.js.map +1 -0
  52. package/dist/{chunk-REX5YPHX.js → chunk-PHCURHC7.js} +76 -21
  53. package/dist/chunk-PHCURHC7.js.map +1 -0
  54. package/dist/{chunk-4YO5H5ON.js → chunk-Q4OGQM5I.js} +4 -10
  55. package/dist/chunk-Q4OGQM5I.js.map +1 -0
  56. package/dist/chunk-QSU47XEX.js +13 -0
  57. package/dist/chunk-QSU47XEX.js.map +1 -0
  58. package/dist/{chunk-DD4SKCNO.js → chunk-RZXJTDH5.js} +13 -2
  59. package/dist/chunk-RZXJTDH5.js.map +1 -0
  60. package/dist/{chunk-Z2LZ7IZ7.js → chunk-SN3OZVEQ.js} +5 -31
  61. package/dist/chunk-SN3OZVEQ.js.map +1 -0
  62. package/dist/{chunk-4DIQHASK.js → chunk-SQ5VUG77.js} +28 -8
  63. package/dist/chunk-SQ5VUG77.js.map +1 -0
  64. package/dist/chunk-STH5DLQP.js +1192 -0
  65. package/dist/chunk-STH5DLQP.js.map +1 -0
  66. package/dist/{chunk-QCHKWIRS.js → chunk-VZFJTKIW.js} +13 -13
  67. package/dist/{chunk-QCHKWIRS.js.map → chunk-VZFJTKIW.js.map} +1 -1
  68. package/dist/{chunk-VSQBHPWH.js → chunk-X4ZU4QH5.js} +54 -22
  69. package/dist/chunk-X4ZU4QH5.js.map +1 -0
  70. package/dist/chunk-XD7SRDUY.js +188 -0
  71. package/dist/chunk-XD7SRDUY.js.map +1 -0
  72. package/dist/chunk-XH2IZVLT.js +62 -0
  73. package/dist/chunk-XH2IZVLT.js.map +1 -0
  74. package/dist/chunk-Z7I6SONO.js +825 -0
  75. package/dist/chunk-Z7I6SONO.js.map +1 -0
  76. package/dist/cli/quickdraw-docs.js +132 -112
  77. package/dist/cli/quickdraw-docs.js.map +1 -1
  78. package/dist/client/core.d.ts +387 -0
  79. package/dist/client/core.js +109 -0
  80. package/dist/client/index.d.ts +52 -203
  81. package/dist/client/index.js +59 -218
  82. package/dist/client/index.js.map +1 -1
  83. package/dist/{clientTypes-Bc-G8n-U.d.ts → clientTypes-CUUNJwWs.d.ts} +3 -3
  84. package/dist/{connection-Cr1BU07W.d.ts → connection-2EeQ_Et0.d.ts} +22 -11
  85. package/dist/{createServer-CP9eDHZZ.d.ts → createServer-Bx5HOcYK.d.ts} +67 -17
  86. package/dist/{createTestApp-UKVGEmOf.d.ts → createTestApp-DAMANT79.d.ts} +46 -13
  87. package/dist/{envelope-Cp3YcVxC.d.ts → envelope-BMBaxppV.d.ts} +216 -10
  88. package/dist/{http-Djj2Inuu.d.ts → http-YzLAar3w.d.ts} +76 -60
  89. package/dist/index.d.ts +8 -7
  90. package/dist/index.js +82 -25
  91. package/dist/index.js.map +1 -1
  92. package/dist/{infer-Teo1xpsd.d.ts → infer-Br62cnyW.d.ts} +82 -11
  93. package/dist/logger-Yz93KzdV.d.ts +30 -0
  94. package/dist/{metrics-BdBu5o8G.d.ts → metrics-CTVpw0gu.d.ts} +2 -2
  95. package/dist/origins-kvpxnVcW.d.ts +8 -0
  96. package/dist/parser.js +2 -1
  97. package/dist/prisma/index.d.ts +14 -7
  98. package/dist/prisma/index.js +279 -70
  99. package/dist/prisma/index.js.map +1 -1
  100. package/dist/{rateLimit-ZMIZJUZF.js → rateLimit-5RKBFLUR.js} +2 -2
  101. package/dist/rateLimit-5RKBFLUR.js.map +1 -0
  102. package/dist/remote-N7OUAGOW.js +15 -0
  103. package/dist/remote-N7OUAGOW.js.map +1 -0
  104. package/dist/server/auth/index.d.ts +82 -33
  105. package/dist/server/auth/index.js +277 -270
  106. package/dist/server/auth/index.js.map +1 -1
  107. package/dist/server/express/index.d.ts +9 -2
  108. package/dist/server/express/index.js +1 -1
  109. package/dist/server/index.d.ts +268 -84
  110. package/dist/server/index.js +664 -418
  111. package/dist/server/index.js.map +1 -1
  112. package/dist/server/mcp/index.d.ts +89 -27
  113. package/dist/server/mcp/index.js +281 -62
  114. package/dist/server/mcp/index.js.map +1 -1
  115. package/dist/server/otel.d.ts +3 -3
  116. package/dist/{sharing-DVa8W-yR.d.ts → sharing-BrsmlDv_.d.ts} +3 -3
  117. package/dist/testing/client.d.ts +14 -14
  118. package/dist/testing/client.js +19 -10
  119. package/dist/testing/client.js.map +1 -1
  120. package/dist/testing/index.d.ts +50 -13
  121. package/dist/testing/index.js +113 -21
  122. package/dist/testing/index.js.map +1 -1
  123. package/dist/testing/mock.d.ts +5 -5
  124. package/dist/testing/mock.js +17 -9
  125. package/dist/tracked-BR5b2O-U.d.ts +43 -0
  126. package/dist/{types-Cu0vmx7c.d.ts → types-CLRCQGnO.d.ts} +4 -3
  127. package/dist/types-tMagHbjy.d.ts +151 -0
  128. package/dist/utils/index.d.ts +16 -4
  129. package/dist/utils/index.js +6 -3
  130. package/package.json +5 -1
  131. package/dist/chunk-2PWMUVC7.js.map +0 -1
  132. package/dist/chunk-4DIQHASK.js.map +0 -1
  133. package/dist/chunk-4YO5H5ON.js.map +0 -1
  134. package/dist/chunk-B2P7AZ25.js.map +0 -1
  135. package/dist/chunk-CDKG4TFA.js.map +0 -1
  136. package/dist/chunk-DD4SKCNO.js.map +0 -1
  137. package/dist/chunk-H23KEFBA.js.map +0 -1
  138. package/dist/chunk-OECZPRPW.js.map +0 -1
  139. package/dist/chunk-QEKVYG5F.js.map +0 -1
  140. package/dist/chunk-REX5YPHX.js.map +0 -1
  141. package/dist/chunk-RT6OILOI.js.map +0 -1
  142. package/dist/chunk-RZTP4IEW.js.map +0 -1
  143. package/dist/chunk-SHEGLZEP.js.map +0 -1
  144. package/dist/chunk-TBMKJ26R.js.map +0 -1
  145. package/dist/chunk-VSQBHPWH.js.map +0 -1
  146. package/dist/chunk-X5CWPX7H.js.map +0 -1
  147. package/dist/chunk-YSWH776Y.js +0 -13
  148. package/dist/chunk-YSWH776Y.js.map +0 -1
  149. package/dist/chunk-Z2LZ7IZ7.js.map +0 -1
  150. package/dist/chunk-ZIVPHYRG.js.map +0 -1
  151. package/dist/logger-BY28acW-.d.ts +0 -16
  152. /package/dist/{rateLimit-ZMIZJUZF.js.map → client/core.js.map} +0 -0
@@ -0,0 +1,651 @@
1
+ import {
2
+ MAX_SCOPE_LENGTH
3
+ } from "./chunk-X4ZU4QH5.js";
4
+ import {
5
+ utf8ByteLength
6
+ } from "./chunk-7Y5ROPXL.js";
7
+ import {
8
+ isName,
9
+ isRecord
10
+ } from "./chunk-QSU47XEX.js";
11
+
12
+ // src/client/peer/clock.ts
13
+ var CLOCK_WINDOW = 24;
14
+ var CLOCK_SYNC_SAMPLES = 5;
15
+ var CLOCK_SLEW_MS = 5;
16
+ var CLOCK_JUMP_MS = 250;
17
+ var MAX_RTT_MS = 1e4;
18
+ function fastest(samples) {
19
+ let best;
20
+ for (const sample of samples) {
21
+ if (best === void 0 || sample.rtt <= best.rtt) {
22
+ best = sample;
23
+ }
24
+ }
25
+ return best?.offset ?? 0;
26
+ }
27
+ function createClock(local = () => performance.now()) {
28
+ const samples = [];
29
+ let pongs = 0;
30
+ let offset = 0;
31
+ let rtt = 0;
32
+ let jitter = 0;
33
+ return {
34
+ now: () => local() + offset,
35
+ get offset() {
36
+ return offset;
37
+ },
38
+ get rtt() {
39
+ return rtt;
40
+ },
41
+ get jitter() {
42
+ return jitter;
43
+ },
44
+ get synced() {
45
+ return pongs >= CLOCK_SYNC_SAMPLES;
46
+ },
47
+ pong(t, u, at) {
48
+ const trip = at - t;
49
+ if (!(trip >= 0 && trip <= MAX_RTT_MS)) {
50
+ return;
51
+ }
52
+ samples.push({ rtt: trip, offset: u + trip / 2 - at });
53
+ if (samples.length > CLOCK_WINDOW) {
54
+ samples.shift();
55
+ }
56
+ pongs += 1;
57
+ if (pongs === 1) {
58
+ rtt = trip;
59
+ jitter = trip / 2;
60
+ } else {
61
+ jitter += (Math.abs(trip - rtt) - jitter) / 4;
62
+ rtt += (trip - rtt) / 8;
63
+ }
64
+ const target = fastest(samples);
65
+ const step = target - offset;
66
+ offset = pongs <= CLOCK_SYNC_SAMPLES || Math.abs(step) > CLOCK_JUMP_MS ? target : offset + Math.max(-CLOCK_SLEW_MS, Math.min(CLOCK_SLEW_MS, step));
67
+ }
68
+ };
69
+ }
70
+
71
+ // src/client/peer/codec.ts
72
+ function encodeMessage(message) {
73
+ return JSON.stringify(message);
74
+ }
75
+ var messageBytes = utf8ByteLength;
76
+ var decoder;
77
+ function textOf(data) {
78
+ if (typeof data === "string") {
79
+ return data;
80
+ }
81
+ if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {
82
+ decoder ??= new TextDecoder();
83
+ return decoder.decode(data);
84
+ }
85
+ return void 0;
86
+ }
87
+ function isTime(value) {
88
+ return typeof value === "number" && Number.isFinite(value);
89
+ }
90
+ function isHostName(value) {
91
+ return isName(value) && value.length <= MAX_SCOPE_LENGTH;
92
+ }
93
+ function readHostMessage(value) {
94
+ const [kind, service, name, third, fourth, fifth] = value;
95
+ if (!isHostName(service) || !isHostName(name)) {
96
+ return void 0;
97
+ }
98
+ if (kind === 3) {
99
+ return value.length >= 4 ? [3, service, name, third] : void 0;
100
+ }
101
+ if (!isHostName(third)) {
102
+ return void 0;
103
+ }
104
+ switch (kind) {
105
+ case 4:
106
+ case 5:
107
+ return [kind, service, name, third];
108
+ case 6:
109
+ return Array.isArray(fourth) && typeof fifth === "boolean" ? [6, service, name, third, fourth, fifth] : void 0;
110
+ case 7:
111
+ return value.length >= 5 ? [7, service, name, third, fourth] : void 0;
112
+ case 8:
113
+ return isRecord(fourth) && isName(fourth.code) && typeof fourth.message === "string" ? [8, service, name, third, { code: fourth.code, message: fourth.message }] : void 0;
114
+ default:
115
+ return void 0;
116
+ }
117
+ }
118
+ function decodeMessage(data) {
119
+ const text = textOf(data);
120
+ if (text === void 0) {
121
+ return void 0;
122
+ }
123
+ let value;
124
+ try {
125
+ value = JSON.parse(text);
126
+ } catch {
127
+ return void 0;
128
+ }
129
+ if (!Array.isArray(value)) {
130
+ return void 0;
131
+ }
132
+ const [kind, first, second] = value;
133
+ if (kind === 0 && value.length >= 2) {
134
+ return [0, first];
135
+ }
136
+ if (kind === 1 && isTime(first)) {
137
+ return [1, first];
138
+ }
139
+ if (kind === 2) {
140
+ return isTime(first) && isTime(second) ? [2, first, second] : void 0;
141
+ }
142
+ return readHostMessage(value);
143
+ }
144
+
145
+ // src/client/peer/lag.ts
146
+ var LAG_RETRY_MS = 50;
147
+ var MAX_RETRY_MS = 1e3;
148
+ function checkLag(options, owner) {
149
+ const part = (name, max = Number.POSITIVE_INFINITY) => {
150
+ const value = options[name] ?? 0;
151
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0 || value > max) {
152
+ throw new TypeError(`${owner}: ${name} must be a number from 0${max === 1 ? " to 1" : ""}`);
153
+ }
154
+ return value;
155
+ };
156
+ const lag = Object.freeze({ ms: part("ms"), jitter: part("jitter"), loss: part("loss", 1) });
157
+ if (options.random !== void 0 && typeof options.random !== "function") {
158
+ throw new TypeError(`${owner}: random must be a function returning numbers from 0 to 1`);
159
+ }
160
+ return lag;
161
+ }
162
+ function handOn(item) {
163
+ try {
164
+ return item.deliver();
165
+ } catch (error) {
166
+ queueMicrotask(() => {
167
+ throw error;
168
+ });
169
+ return true;
170
+ }
171
+ }
172
+ function deliverRel(queue, item) {
173
+ if (handOn(item) === false && !queue.closed) {
174
+ queue.retry = setTimeout(() => {
175
+ queue.retry = void 0;
176
+ drain(queue);
177
+ }, queue.retryMs);
178
+ queue.retryMs = Math.min(MAX_RETRY_MS, queue.retryMs * 2);
179
+ return false;
180
+ }
181
+ queue.retryMs = LAG_RETRY_MS;
182
+ if (queue.rel[0] === item) {
183
+ queue.rel.shift();
184
+ clearTimeout(item.timer);
185
+ }
186
+ return true;
187
+ }
188
+ function deliverFast(queue, item) {
189
+ if (queue.fast.delete(item)) {
190
+ clearTimeout(item.timer);
191
+ handOn(item);
192
+ }
193
+ }
194
+ function drain(queue) {
195
+ if (queue.delivering || queue.retry !== void 0) {
196
+ return;
197
+ }
198
+ queue.delivering = true;
199
+ try {
200
+ for (let item = queue.rel[0]; item?.ready === true; item = queue.rel[0]) {
201
+ if (queue.closed || !deliverRel(queue, item)) {
202
+ return;
203
+ }
204
+ }
205
+ } finally {
206
+ queue.delivering = false;
207
+ }
208
+ }
209
+ function due(queue, item) {
210
+ item.timer = void 0;
211
+ const at = queue.rel.indexOf(item);
212
+ for (const ahead of queue.rel.slice(0, at + 1)) {
213
+ ahead.ready = true;
214
+ }
215
+ drain(queue);
216
+ }
217
+ function arm(queue, item) {
218
+ item.timer = setTimeout(
219
+ () => {
220
+ if (item.at > performance.now()) {
221
+ arm(queue, item);
222
+ } else if (item.label === "rel") {
223
+ due(queue, item);
224
+ } else {
225
+ deliverFast(queue, item);
226
+ }
227
+ },
228
+ Math.max(0, Math.ceil(item.at - performance.now()))
229
+ );
230
+ }
231
+ function nextHeld(queue) {
232
+ const [first] = queue.fast;
233
+ const rel = queue.retry === void 0 ? queue.rel[0] : void 0;
234
+ return rel !== void 0 && (first === void 0 || rel.seq < first.seq) ? rel : first;
235
+ }
236
+ function flush(queue) {
237
+ clearTimeout(queue.flushing);
238
+ queue.flushing = void 0;
239
+ if (queue.delivering) {
240
+ return;
241
+ }
242
+ const until = queue.seq;
243
+ for (const item of queue.rel) {
244
+ item.ready = true;
245
+ }
246
+ queue.delivering = true;
247
+ try {
248
+ for (let item = nextHeld(queue); item !== void 0; item = nextHeld(queue)) {
249
+ if (queue.closed || item.seq >= until) {
250
+ return;
251
+ }
252
+ if (item.label === "rel") {
253
+ deliverRel(queue, item);
254
+ } else {
255
+ deliverFast(queue, item);
256
+ }
257
+ }
258
+ } finally {
259
+ queue.delivering = false;
260
+ }
261
+ }
262
+ function push(queue, label, deliver) {
263
+ const { lag } = queue;
264
+ if (queue.closed) {
265
+ return true;
266
+ }
267
+ if (lag !== null && label === "fast" && queue.random() < lag.loss) {
268
+ return false;
269
+ }
270
+ let at = performance.now();
271
+ if (lag !== null) {
272
+ at += lag.ms + queue.random() * lag.jitter;
273
+ }
274
+ if (label === "rel") {
275
+ at = Math.max(at, queue.rel.at(-1)?.at ?? at);
276
+ }
277
+ const item = { label, seq: queue.seq, deliver, at, ready: false, timer: void 0 };
278
+ queue.seq += 1;
279
+ if (label === "rel") {
280
+ queue.rel.push(item);
281
+ } else {
282
+ queue.fast.add(item);
283
+ }
284
+ arm(queue, item);
285
+ return true;
286
+ }
287
+ function close(queue) {
288
+ queue.closed = true;
289
+ for (const item of [...queue.rel, ...queue.fast]) {
290
+ clearTimeout(item.timer);
291
+ }
292
+ queue.rel.length = 0;
293
+ queue.fast.clear();
294
+ clearTimeout(queue.retry);
295
+ clearTimeout(queue.flushing);
296
+ queue.retry = void 0;
297
+ queue.flushing = void 0;
298
+ }
299
+ function createLagQueue(lag, random = Math.random) {
300
+ const queue = {
301
+ lag,
302
+ random,
303
+ rel: [],
304
+ fast: /* @__PURE__ */ new Set(),
305
+ seq: 0,
306
+ retry: void 0,
307
+ retryMs: LAG_RETRY_MS,
308
+ flushing: void 0,
309
+ delivering: false,
310
+ closed: false
311
+ };
312
+ return Object.freeze({
313
+ get idle() {
314
+ return queue.lag === null && queue.rel.length === 0 && queue.fast.size === 0;
315
+ },
316
+ get blocked() {
317
+ return queue.retry !== void 0;
318
+ },
319
+ push: (label, deliver) => push(queue, label, deliver),
320
+ set(next, nextRandom = Math.random) {
321
+ if (queue.closed) {
322
+ return;
323
+ }
324
+ queue.lag = next;
325
+ queue.random = nextRandom;
326
+ if (next === null && (queue.rel.length > 0 || queue.fast.size > 0)) {
327
+ queue.flushing ??= setTimeout(() => {
328
+ flush(queue);
329
+ }, 0);
330
+ }
331
+ },
332
+ flush: () => {
333
+ flush(queue);
334
+ },
335
+ close: () => {
336
+ close(queue);
337
+ }
338
+ });
339
+ }
340
+
341
+ // src/client/peer/core.ts
342
+ var QUICK_PINGS = 6;
343
+ var QUICK_PING_MS = 80;
344
+ var PING_MS = 500;
345
+ var WATCHDOG_MS = 8e3;
346
+ function throwLater(error) {
347
+ queueMicrotask(() => {
348
+ throw error;
349
+ });
350
+ }
351
+ function emit(core, event, ...args) {
352
+ for (const listener of [...core.listeners[event]]) {
353
+ try {
354
+ listener(...args);
355
+ } catch (error) {
356
+ throwLater(error);
357
+ }
358
+ }
359
+ }
360
+ function finish(core, reason, fromHere) {
361
+ if (core.state === "closed") {
362
+ return;
363
+ }
364
+ core.state = "closed";
365
+ core.path = void 0;
366
+ core.closeReason = reason;
367
+ clearTimeout(core.timer);
368
+ core.outgoing.close();
369
+ core.incoming.close();
370
+ core.options.hooks.closed(reason, fromHere);
371
+ emit(core, "state", "closed", void 0);
372
+ emit(core, "close", reason);
373
+ for (const set of Object.values(core.listeners)) {
374
+ set.clear();
375
+ }
376
+ core.control.clear();
377
+ }
378
+ function tick(core) {
379
+ core.timer = void 0;
380
+ if (core.state !== "open") {
381
+ return;
382
+ }
383
+ if (core.options.watchdog !== false && core.now() - core.lastHeard > WATCHDOG_MS) {
384
+ finish(core, "lost", true);
385
+ return;
386
+ }
387
+ transmit(core, "fast", encodeMessage([1, core.now()]), false);
388
+ core.pingsLeft = Math.max(0, core.pingsLeft - 1);
389
+ core.timer = setTimeout(
390
+ () => {
391
+ tick(core);
392
+ },
393
+ core.pingsLeft > 0 ? QUICK_PING_MS : PING_MS
394
+ );
395
+ }
396
+ function textOf2(core, message, what) {
397
+ const text = encodeMessage(message);
398
+ const bytes = messageBytes(text);
399
+ const max = core.options.maxMessageBytes();
400
+ if (bytes > max) {
401
+ throw new RangeError(
402
+ `${what}: a message holds at most ${max} bytes as JSON; this one has ${bytes}: split it`
403
+ );
404
+ }
405
+ return text;
406
+ }
407
+ function transmit(core, label, text, app) {
408
+ const { stats, outgoing } = core;
409
+ const put = () => {
410
+ const sent = core.state === "open" && core.options.hooks.send(label, text);
411
+ if (app && sent) {
412
+ stats.sent += 1;
413
+ }
414
+ return sent;
415
+ };
416
+ if (outgoing.idle) {
417
+ const sent = put();
418
+ if (app && !sent) {
419
+ stats.dropped += 1;
420
+ }
421
+ return sent;
422
+ }
423
+ if (label === "rel" && outgoing.blocked) {
424
+ if (app) {
425
+ stats.dropped += 1;
426
+ }
427
+ return false;
428
+ }
429
+ const held = outgoing.push(label, () => {
430
+ const sent = put();
431
+ if (app && !sent && label === "fast") {
432
+ stats.dropped += 1;
433
+ }
434
+ return sent;
435
+ });
436
+ if (app && !held) {
437
+ stats.simulatedLoss += 1;
438
+ }
439
+ return true;
440
+ }
441
+ function send(core, label, data) {
442
+ if (label !== "rel" && label !== "fast") {
443
+ throw new TypeError(`PeerLink.send: label must be "rel" or "fast", not ${String(label)}`);
444
+ }
445
+ const text = textOf2(core, [0, data], "PeerLink.send");
446
+ if (core.state !== "open") {
447
+ core.stats.dropped += 1;
448
+ return false;
449
+ }
450
+ return transmit(core, label, text, true);
451
+ }
452
+ function hear(core, message, label) {
453
+ if (core.state === "closed") {
454
+ return;
455
+ }
456
+ core.lastHeard = core.now();
457
+ if (message[0] === 0) {
458
+ core.stats.received += 1;
459
+ emit(core, "message", message[1], label);
460
+ } else if (message[0] === 1) {
461
+ if (core.state === "open") {
462
+ transmit(core, "fast", encodeMessage([2, message[1], core.now()]), false);
463
+ }
464
+ } else if (message[0] === 2) {
465
+ core.clock.pong(message[1], message[2], core.now());
466
+ } else {
467
+ for (const listener of [...core.control]) {
468
+ try {
469
+ listener(message, label);
470
+ } catch (error) {
471
+ throwLater(error);
472
+ }
473
+ }
474
+ }
475
+ }
476
+ function receive(core, data, label) {
477
+ const message = core.state === "closed" ? void 0 : decodeMessage(data);
478
+ if (message === void 0) {
479
+ return;
480
+ }
481
+ if (core.incoming.idle) {
482
+ hear(core, message, label);
483
+ return;
484
+ }
485
+ const held = core.incoming.push(label, () => {
486
+ hear(core, message, label);
487
+ });
488
+ if (!held && message[0] === 0) {
489
+ core.stats.simulatedLoss += 1;
490
+ }
491
+ }
492
+ function setLag(core, options) {
493
+ if (options !== null && typeof options !== "object") {
494
+ throw new TypeError("PeerLink.setLag: pass { ms, jitter, loss }, or null for none");
495
+ }
496
+ const lag = options === null ? null : checkLag(options, "PeerLink.setLag");
497
+ if (core.state === "closed") {
498
+ return;
499
+ }
500
+ core.lag = lag === null || lag.ms === 0 && lag.jitter === 0 && lag.loss === 0 ? null : lag;
501
+ const random = options?.random ?? Math.random;
502
+ core.outgoing.set(core.lag, random);
503
+ core.incoming.set(core.lag, random);
504
+ }
505
+ function carry(core, path) {
506
+ if (core.state === "closed" || core.state === "open" && core.path === path) {
507
+ return;
508
+ }
509
+ const opening = core.state === "connecting";
510
+ core.state = "open";
511
+ core.path = path;
512
+ if (opening) {
513
+ core.lastHeard = core.now();
514
+ core.pingsLeft = QUICK_PINGS;
515
+ emit(core, "open", path);
516
+ }
517
+ emit(core, "state", "open", path);
518
+ if (opening && core.state === "open") {
519
+ tick(core);
520
+ }
521
+ }
522
+ function clockView(clock) {
523
+ return Object.freeze({
524
+ now: () => clock.now(),
525
+ get offset() {
526
+ return clock.offset;
527
+ },
528
+ get rtt() {
529
+ return clock.rtt;
530
+ },
531
+ get jitter() {
532
+ return clock.jitter;
533
+ },
534
+ get synced() {
535
+ return clock.synced;
536
+ }
537
+ });
538
+ }
539
+ function linkOf(core) {
540
+ const { listeners } = core;
541
+ return Object.freeze({
542
+ room: core.options.room,
543
+ peer: core.options.peer,
544
+ get userId() {
545
+ return core.userId;
546
+ },
547
+ get state() {
548
+ return core.state;
549
+ },
550
+ get path() {
551
+ return core.path;
552
+ },
553
+ get closeReason() {
554
+ return core.closeReason;
555
+ },
556
+ send: (label, data) => send(core, label, data),
557
+ on(event, listener) {
558
+ if (!Object.hasOwn(listeners, event)) {
559
+ throw new TypeError(`PeerLink.on: no event "${String(event)}"`);
560
+ }
561
+ listeners[event].add(listener);
562
+ return () => {
563
+ listeners[event].delete(listener);
564
+ };
565
+ },
566
+ clock: clockView(core.clock),
567
+ get stats() {
568
+ return Object.freeze({ ...core.stats });
569
+ },
570
+ setLag: (options) => {
571
+ setLag(core, options);
572
+ },
573
+ get lag() {
574
+ return core.lag;
575
+ },
576
+ close: () => {
577
+ finish(core, "closed", true);
578
+ }
579
+ });
580
+ }
581
+ var CORES = /* @__PURE__ */ new WeakMap();
582
+ function controlOf(link) {
583
+ const core = CORES.get(link);
584
+ if (core === void 0) {
585
+ return void 0;
586
+ }
587
+ return {
588
+ send: (label, message) => core.state === "open" && transmit(core, label, textOf2(core, message, "host mode"), false),
589
+ on(listener) {
590
+ if (core.state === "closed") {
591
+ return () => void 0;
592
+ }
593
+ core.control.add(listener);
594
+ return () => {
595
+ core.control.delete(listener);
596
+ };
597
+ }
598
+ };
599
+ }
600
+ function createLinkCore(options) {
601
+ const now = options.now ?? (() => performance.now());
602
+ const core = {
603
+ options,
604
+ now,
605
+ clock: createClock(now),
606
+ listeners: { message: /* @__PURE__ */ new Set(), open: /* @__PURE__ */ new Set(), state: /* @__PURE__ */ new Set(), close: /* @__PURE__ */ new Set() },
607
+ state: "connecting",
608
+ path: void 0,
609
+ closeReason: void 0,
610
+ userId: void 0,
611
+ lastHeard: 0,
612
+ pingsLeft: 0,
613
+ timer: void 0,
614
+ stats: { sent: 0, received: 0, dropped: 0, simulatedLoss: 0 },
615
+ control: /* @__PURE__ */ new Set(),
616
+ lag: null,
617
+ outgoing: createLagQueue(null),
618
+ incoming: createLagQueue(null)
619
+ };
620
+ const link = linkOf(core);
621
+ CORES.set(link, core);
622
+ return {
623
+ link,
624
+ receive: (data, label) => {
625
+ receive(core, data, label);
626
+ },
627
+ carry: (path) => {
628
+ carry(core, path);
629
+ },
630
+ end: (reason) => {
631
+ finish(core, reason, false);
632
+ },
633
+ fail: (reason) => {
634
+ finish(core, reason, true);
635
+ },
636
+ identify: (userId) => {
637
+ core.userId ??= userId;
638
+ }
639
+ };
640
+ }
641
+
642
+ export {
643
+ encodeMessage,
644
+ messageBytes,
645
+ checkLag,
646
+ createLagQueue,
647
+ throwLater,
648
+ controlOf,
649
+ createLinkCore
650
+ };
651
+ //# sourceMappingURL=chunk-ASAMUGHG.js.map