orez-lite 0.16.7 → 0.16.8

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.
@@ -0,0 +1,425 @@
1
+ /**
2
+ * per-transaction physical write attribution for application SQL.
3
+ *
4
+ * Cloudflare bills Durable Object SQLite by post-consume `rowsWritten`. this
5
+ * module classifies those rows from already-owned statement text and CDC
6
+ * capture metadata. it never logs SQL parameters, row values, or production
7
+ * identifiers, and it never writes SQLite.
8
+ */
9
+ export const WRITE_ATTRIBUTION_EVENT = 'orez_sql_transaction_sample';
10
+ export const WORKERS_LOG_SAMPLING = 'workers_observability_may_sample_or_drop';
11
+ export const FORBIDDEN_ATTRIBUTION_KEYS = [
12
+ 'sql',
13
+ 'params',
14
+ 'bindings',
15
+ 'namespace',
16
+ 'objectId',
17
+ 'objectName',
18
+ 'rowData',
19
+ 'oldData',
20
+ 'email',
21
+ 'token',
22
+ 'secret',
23
+ 'prompt',
24
+ ];
25
+ const INTERNAL_SOURCE = {
26
+ _orez_cdc_buffer: 'cdc_buffer',
27
+ _zero_pending_changes: 'pending_changes',
28
+ _zero_changes: 'zero_changes',
29
+ _orez_tx_manifest: 'bookkeeping',
30
+ _orez_tx_schema: 'bookkeeping',
31
+ _orez_cdc_tables: 'bookkeeping',
32
+ _zero_change_state: 'bookkeeping',
33
+ _zero_schema_tables: 'bookkeeping',
34
+ _zsync_log_segments: 'bookkeeping',
35
+ _zsync_clients: 'bookkeeping',
36
+ _zsync_watermark: 'bookkeeping',
37
+ _zsync_changes: 'bookkeeping',
38
+ _zsync_meta: 'bookkeeping',
39
+ };
40
+ const SQL_IDENTIFIER = '("(?:[^"]|"")*"|`(?:[^`]|``)*`|\\[[^\\]]+\\]|[A-Za-z_][A-Za-z0-9_]*)';
41
+ function sqlWithoutLeadingTrivia(sql) {
42
+ if (!sql.includes('--') && !sql.includes('/*'))
43
+ return sql;
44
+ return sql.replace(/(^|;)\s*(?:(?:--[^\n]*(?:\n|$))|(?:\/\*[\s\S]*?\*\/))\s*/g, '$1');
45
+ }
46
+ function unquoteSqlIdentifier(identifier) {
47
+ if (identifier.startsWith('"') && identifier.endsWith('"')) {
48
+ return identifier.slice(1, -1).replace(/""/g, '"');
49
+ }
50
+ if (identifier.startsWith('`') && identifier.endsWith('`')) {
51
+ return identifier.slice(1, -1).replace(/``/g, '`');
52
+ }
53
+ if (identifier.startsWith('[') && identifier.endsWith(']')) {
54
+ return identifier.slice(1, -1);
55
+ }
56
+ return identifier;
57
+ }
58
+ function physicalTableName(raw) {
59
+ const name = unquoteSqlIdentifier(raw.trim());
60
+ const dot = name.lastIndexOf('.');
61
+ return dot === -1 ? name : name.slice(dot + 1);
62
+ }
63
+ function internalSource(table) {
64
+ if (table.endsWith('_backup_meta'))
65
+ return 'backup_meta';
66
+ const known = INTERNAL_SOURCE[table];
67
+ if (known)
68
+ return known;
69
+ if (table.startsWith('_orez_') ||
70
+ table.startsWith('_zero_') ||
71
+ table.startsWith('_zsync_') ||
72
+ table.startsWith('sqlite_')) {
73
+ return 'bookkeeping';
74
+ }
75
+ return null;
76
+ }
77
+ function matchDml(sql) {
78
+ const insert = sql.match(new RegExp(`\\bINSERT\\s+(?:OR\\s+\\w+\\s+)?INTO\\s+(?:TEMP(?:ORARY)?\\s+)?${SQL_IDENTIFIER}`, 'i'));
79
+ if (insert?.[1])
80
+ return { op: 'INSERT', table: physicalTableName(insert[1]) };
81
+ const replace = sql.match(new RegExp(`\\bREPLACE\\s+INTO\\s+(?:TEMP(?:ORARY)?\\s+)?${SQL_IDENTIFIER}`, 'i'));
82
+ if (replace?.[1])
83
+ return { op: 'INSERT', table: physicalTableName(replace[1]) };
84
+ const update = sql.match(new RegExp(`\\bUPDATE\\s+(?:OR\\s+\\w+\\s+)?${SQL_IDENTIFIER}`, 'i'));
85
+ if (update?.[1])
86
+ return { op: 'UPDATE', table: physicalTableName(update[1]) };
87
+ const del = sql.match(new RegExp(`\\bDELETE\\s+FROM\\s+(?:TEMP(?:ORARY)?\\s+)?${SQL_IDENTIFIER}`, 'i'));
88
+ if (del?.[1])
89
+ return { op: 'DELETE', table: physicalTableName(del[1]) };
90
+ return null;
91
+ }
92
+ function matchDdlTable(sql) {
93
+ const match = sql.match(new RegExp(`\\b(?:CREATE|ALTER|DROP)\\s+TABLE\\s+(?:IF\\s+(?:NOT\\s+)?EXISTS\\s+)?${SQL_IDENTIFIER}`, 'i'));
94
+ return match?.[1] ? physicalTableName(match[1]) : null;
95
+ }
96
+ export function classifyPhysicalStatement(sql) {
97
+ const text = sqlWithoutLeadingTrivia(String(sql ?? ''));
98
+ const dml = matchDml(text);
99
+ if (dml) {
100
+ const source = internalSource(dml.table);
101
+ return {
102
+ source: source ?? 'application',
103
+ table: dml.table,
104
+ op: dml.op,
105
+ };
106
+ }
107
+ const ddlTable = matchDdlTable(text);
108
+ if (ddlTable) {
109
+ const source = internalSource(ddlTable);
110
+ return {
111
+ source: source ?? 'bookkeeping',
112
+ table: ddlTable,
113
+ op: 'DDL',
114
+ };
115
+ }
116
+ if (/\b(?:CREATE|ALTER|DROP|REINDEX|VACUUM|ANALYZE|PRAGMA)\b/i.test(text)) {
117
+ return { source: 'bookkeeping', table: null, op: 'DDL' };
118
+ }
119
+ return { source: 'unclassified', table: null, op: 'OTHER' };
120
+ }
121
+ export function namespaceClassFromObjectName(name) {
122
+ if (name == null || name === '')
123
+ return 'test';
124
+ const n = name.startsWith('ns:') ? name.slice(3) : name;
125
+ if (n === 'singleton' || n === 'soot' || n === 'control')
126
+ return 'control';
127
+ if (n.startsWith('proj-'))
128
+ return 'project';
129
+ return 'test';
130
+ }
131
+ export function physicalBreakdownTotal(breakdown) {
132
+ return (breakdown.application.reduce((sum, row) => sum + row.physicalRows, 0) +
133
+ breakdown.cdcBuffer +
134
+ breakdown.pendingChanges +
135
+ breakdown.zeroChanges +
136
+ breakdown.bookkeeping +
137
+ breakdown.backupMeta +
138
+ breakdown.unclassified);
139
+ }
140
+ export function assertWriteAttributionReconciles(event) {
141
+ const physical = physicalBreakdownTotal(event.breakdown);
142
+ if (physical !== event.physicalTotal) {
143
+ throw new Error(`write attribution physical breakdown ${physical} does not equal physicalTotal ${event.physicalTotal}`);
144
+ }
145
+ const logical = event.breakdown.application.reduce((sum, row) => sum + row.logicalRows, 0);
146
+ if (logical !== event.logicalTotal) {
147
+ throw new Error(`write attribution logical breakdown ${logical} does not equal logicalTotal ${event.logicalTotal}`);
148
+ }
149
+ for (const row of event.breakdown.application) {
150
+ if (row.indexRows < 0 || row.physicalRows < 0 || row.logicalRows < 0) {
151
+ throw new Error(`write attribution ${row.table} ${row.op} has a negative bucket`);
152
+ }
153
+ if (row.indexRows > row.physicalRows) {
154
+ throw new Error(`write attribution ${row.table} ${row.op} indexRows exceed physicalRows`);
155
+ }
156
+ }
157
+ if (event.complete === true && event.breakdown.unclassified > 0) {
158
+ throw new Error('complete write attribution cannot include unclassified rows');
159
+ }
160
+ if (event.breakdown.unclassified > 0 && event.complete !== false) {
161
+ throw new Error('write attribution has unclassified rows but complete is not false');
162
+ }
163
+ }
164
+ export function assertNoForbiddenAttributionFields(event) {
165
+ for (const key of FORBIDDEN_ATTRIBUTION_KEYS) {
166
+ if (Object.hasOwn(event, key)) {
167
+ throw new Error(`write attribution event includes forbidden field ${key}`);
168
+ }
169
+ }
170
+ }
171
+ function keyOf(table, op) {
172
+ return `${table}\0${op}`;
173
+ }
174
+ export class WriteAttributionCollector {
175
+ #physicalTotal = 0;
176
+ #rustVisibleRows = 0;
177
+ #entries = [];
178
+ #logical = new Map();
179
+ recordPhysical(sql, rows) {
180
+ try {
181
+ const count = Number(rows);
182
+ if (!Number.isSafeInteger(count) || count <= 0)
183
+ return;
184
+ this.#physicalTotal += count;
185
+ const classified = classifyPhysicalStatement(sql);
186
+ const last = this.#entries.at(-1);
187
+ if (last &&
188
+ last.source === classified.source &&
189
+ last.table === classified.table &&
190
+ last.op === classified.op) {
191
+ last.rows += count;
192
+ return;
193
+ }
194
+ this.#entries.push({ ...classified, rows: count, triggerCaptureRows: 0 });
195
+ }
196
+ catch {
197
+ const count = Number(rows);
198
+ if (!Number.isSafeInteger(count) || count <= 0)
199
+ return;
200
+ this.#physicalTotal += count;
201
+ this.#entries.push({
202
+ source: 'unclassified',
203
+ table: null,
204
+ op: 'OTHER',
205
+ rows: count,
206
+ triggerCaptureRows: 0,
207
+ });
208
+ }
209
+ }
210
+ noteTriggerCaptures(count) {
211
+ try {
212
+ const n = Number(count);
213
+ if (!Number.isSafeInteger(n) || n <= 0)
214
+ return;
215
+ for (let index = this.#entries.length - 1; index >= 0; index--) {
216
+ const entry = this.#entries[index];
217
+ if (entry.source === 'application') {
218
+ entry.triggerCaptureRows += n;
219
+ return;
220
+ }
221
+ }
222
+ }
223
+ catch { }
224
+ }
225
+ recordLogicalCapture(change) {
226
+ try {
227
+ const table = String(change.table ?? '');
228
+ if (!table || internalSource(table))
229
+ return;
230
+ const op = normalizeOp(change.op);
231
+ if (op !== 'INSERT' && op !== 'UPDATE' && op !== 'DELETE' && op !== 'UPSERT')
232
+ return;
233
+ const rows = Number(change.rows ?? 1);
234
+ if (!Number.isSafeInteger(rows) || rows <= 0)
235
+ return;
236
+ const key = keyOf(table, op);
237
+ const existing = this.#logical.get(key);
238
+ const visibility = existing?.visibility === 'synced' || change.visibility === 'synced'
239
+ ? 'synced'
240
+ : 'private';
241
+ this.#logical.set(key, {
242
+ table,
243
+ op,
244
+ visibility,
245
+ rows: (existing?.rows ?? 0) + rows,
246
+ });
247
+ if (change.publish !== false && change.visibility === 'synced') {
248
+ this.#rustVisibleRows += rows;
249
+ }
250
+ }
251
+ catch { }
252
+ }
253
+ recordUncapturedLogical(rows) {
254
+ try {
255
+ const count = Number(rows);
256
+ if (!Number.isSafeInteger(count) || count <= 0)
257
+ return;
258
+ for (let index = this.#entries.length - 1; index >= 0; index--) {
259
+ const entry = this.#entries[index];
260
+ if (entry.source === 'application' && entry.table) {
261
+ this.recordLogicalCapture({
262
+ table: entry.table,
263
+ op: entry.op,
264
+ visibility: 'private',
265
+ publish: false,
266
+ rows: count,
267
+ });
268
+ return;
269
+ }
270
+ }
271
+ }
272
+ catch { }
273
+ }
274
+ summarize(meta) {
275
+ try {
276
+ return this.#build(meta);
277
+ }
278
+ catch {
279
+ return incompleteAttribution(sanitizeMeta(meta), this.#physicalTotal);
280
+ }
281
+ }
282
+ #build(meta) {
283
+ const breakdown = {
284
+ application: [],
285
+ cdcBuffer: 0,
286
+ pendingChanges: 0,
287
+ zeroChanges: 0,
288
+ bookkeeping: 0,
289
+ backupMeta: 0,
290
+ unclassified: 0,
291
+ };
292
+ const application = new Map();
293
+ for (const entry of this.#entries) {
294
+ const triggerRows = Math.min(Math.max(0, entry.triggerCaptureRows), entry.rows);
295
+ const remaining = entry.rows - triggerRows;
296
+ breakdown.cdcBuffer += triggerRows;
297
+ if (entry.source === 'cdc_buffer') {
298
+ breakdown.cdcBuffer += remaining;
299
+ continue;
300
+ }
301
+ if (entry.source === 'pending_changes') {
302
+ breakdown.pendingChanges += remaining;
303
+ continue;
304
+ }
305
+ if (entry.source === 'zero_changes') {
306
+ breakdown.zeroChanges += remaining;
307
+ continue;
308
+ }
309
+ if (entry.source === 'bookkeeping') {
310
+ breakdown.bookkeeping += remaining;
311
+ continue;
312
+ }
313
+ if (entry.source === 'backup_meta') {
314
+ breakdown.backupMeta += remaining;
315
+ continue;
316
+ }
317
+ if (entry.source === 'application' && entry.table) {
318
+ const logical = this.#logical.get(keyOf(entry.table, entry.op));
319
+ addApplicationRow(application, {
320
+ table: entry.table,
321
+ op: entry.op,
322
+ visibility: logical?.visibility ?? 'private',
323
+ logicalRows: 0,
324
+ physicalRows: remaining,
325
+ indexRows: 0,
326
+ });
327
+ continue;
328
+ }
329
+ breakdown.unclassified += remaining;
330
+ }
331
+ for (const logical of this.#logical.values()) {
332
+ addApplicationRow(application, {
333
+ table: logical.table,
334
+ op: logical.op,
335
+ visibility: logical.visibility,
336
+ logicalRows: logical.rows,
337
+ physicalRows: 0,
338
+ });
339
+ }
340
+ for (const row of application.values()) {
341
+ row.indexRows = Math.max(0, row.physicalRows - row.logicalRows);
342
+ breakdown.application.push(row);
343
+ }
344
+ breakdown.application.sort((a, b) => a.table === b.table ? a.op.localeCompare(b.op) : a.table.localeCompare(b.table));
345
+ const logicalTotal = breakdown.application.reduce((sum, row) => sum + row.logicalRows, 0);
346
+ const rustVisibleRows = meta.outcome === 'rolled_back' || meta.outcome === 'error'
347
+ ? 0
348
+ : this.#rustVisibleRows;
349
+ const fields = {
350
+ ...sanitizeMeta(meta),
351
+ complete: breakdown.unclassified === 0,
352
+ logSampling: WORKERS_LOG_SAMPLING,
353
+ logicalTotal,
354
+ physicalTotal: this.#physicalTotal,
355
+ rustVisibleRows,
356
+ breakdown,
357
+ };
358
+ assertWriteAttributionReconciles(fields);
359
+ return fields;
360
+ }
361
+ }
362
+ function normalizeOp(op) {
363
+ const value = String(op ?? '').toUpperCase();
364
+ if (value === 'INSERT' ||
365
+ value === 'UPDATE' ||
366
+ value === 'DELETE' ||
367
+ value === 'UPSERT') {
368
+ return value;
369
+ }
370
+ if (value === 'DDL')
371
+ return 'DDL';
372
+ return 'OTHER';
373
+ }
374
+ function sanitizeMeta(meta) {
375
+ const sampleRate = Number(meta.sampleRate);
376
+ return {
377
+ workerVersion: String(meta.workerVersion ?? 'local').slice(0, 200),
378
+ namespaceClass: meta.namespaceClass === 'control' || meta.namespaceClass === 'project'
379
+ ? meta.namespaceClass
380
+ : 'test',
381
+ processStartedAt: Number.isFinite(meta.processStartedAt) ? meta.processStartedAt : 0,
382
+ sampleRate: Number.isFinite(sampleRate) && sampleRate >= 0 && sampleRate <= 1 ? sampleRate : 0,
383
+ observedAt: Number.isFinite(meta.observedAt) ? meta.observedAt : 0,
384
+ };
385
+ }
386
+ function addApplicationRow(byKey, row) {
387
+ const key = keyOf(row.table, row.op);
388
+ const existing = byKey.get(key);
389
+ if (!existing) {
390
+ byKey.set(key, {
391
+ table: row.table,
392
+ op: row.op,
393
+ visibility: row.visibility,
394
+ logicalRows: row.logicalRows,
395
+ physicalRows: row.physicalRows,
396
+ indexRows: row.indexRows ?? 0,
397
+ });
398
+ return;
399
+ }
400
+ existing.logicalRows += row.logicalRows;
401
+ existing.physicalRows += row.physicalRows;
402
+ existing.indexRows += row.indexRows ?? 0;
403
+ if (row.visibility === 'synced')
404
+ existing.visibility = 'synced';
405
+ }
406
+ function incompleteAttribution(meta, physicalTotal) {
407
+ return {
408
+ ...meta,
409
+ complete: false,
410
+ logSampling: WORKERS_LOG_SAMPLING,
411
+ logicalTotal: 0,
412
+ physicalTotal,
413
+ rustVisibleRows: 0,
414
+ breakdown: {
415
+ application: [],
416
+ cdcBuffer: 0,
417
+ pendingChanges: 0,
418
+ zeroChanges: 0,
419
+ bookkeeping: 0,
420
+ backupMeta: 0,
421
+ unclassified: physicalTotal,
422
+ },
423
+ };
424
+ }
425
+ //# sourceMappingURL=write-attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-attribution.js","sourceRoot":"","sources":["../../src/cf-do/write-attribution.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,6BAAsC,CAAA;AAE7E,MAAM,CAAC,MAAM,oBAAoB,GAAG,0CAAmD,CAAA;AA4DvF,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,KAAK;IACL,QAAQ;IACR,UAAU;IACV,WAAW;IACX,UAAU;IACV,YAAY;IACZ,SAAS;IACT,SAAS;IACT,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;CACA,CAAA;AAEV,MAAM,eAAe,GAGjB;IACF,gBAAgB,EAAE,YAAY;IAC9B,qBAAqB,EAAE,iBAAiB;IACxC,aAAa,EAAE,cAAc;IAC7B,iBAAiB,EAAE,aAAa;IAChC,eAAe,EAAE,aAAa;IAC9B,gBAAgB,EAAE,aAAa;IAC/B,kBAAkB,EAAE,aAAa;IACjC,mBAAmB,EAAE,aAAa;IAClC,mBAAmB,EAAE,aAAa;IAClC,cAAc,EAAE,aAAa;IAC7B,gBAAgB,EAAE,aAAa;IAC/B,cAAc,EAAE,aAAa;IAC7B,WAAW,EAAE,aAAa;CAC3B,CAAA;AAED,MAAM,cAAc,GAClB,sEAAsE,CAAA;AAExE,SAAS,uBAAuB,CAAC,GAAW;IAC1C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,CAAA;IAC1D,OAAO,GAAG,CAAC,OAAO,CAAC,2DAA2D,EAAE,IAAI,CAAC,CAAA;AACvF,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACpD,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACpD,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACjC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;AAChD,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,aAAa,CAAA;IACxD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACpC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAA;IACvB,IACE,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC1B,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC1B,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QAC3B,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAC3B,CAAC;QACD,OAAO,aAAa,CAAA;IACtB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CACtB,IAAI,MAAM,CACR,kEAAkE,cAAc,EAAE,EAClF,GAAG,CACJ,CACF,CAAA;IACD,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7E,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CACvB,IAAI,MAAM,CAAC,gDAAgD,cAAc,EAAE,EAAE,GAAG,CAAC,CAClF,CAAA;IACD,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CACtB,IAAI,MAAM,CAAC,mCAAmC,cAAc,EAAE,EAAE,GAAG,CAAC,CACrE,CAAA;IACD,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7E,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CACnB,IAAI,MAAM,CAAC,+CAA+C,cAAc,EAAE,EAAE,GAAG,CAAC,CACjF,CAAA;IACD,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACvE,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CACrB,IAAI,MAAM,CACR,yEAAyE,cAAc,EAAE,EACzF,GAAG,CACJ,CACF,CAAA;IACD,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAY;IACpD,MAAM,IAAI,GAAG,uBAAuB,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAA;IACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACxC,OAAO;YACL,MAAM,EAAE,MAAM,IAAI,aAAa;YAC/B,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,EAAE,EAAE,GAAG,CAAC,EAAE;SACX,CAAA;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IACpC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;QACvC,OAAO;YACL,MAAM,EAAE,MAAM,IAAI,aAAa;YAC/B,KAAK,EAAE,QAAQ;YACf,EAAE,EAAE,KAAK;SACV,CAAA;IACH,CAAC;IACD,IAAI,0DAA0D,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1E,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAA;IAC1D,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,IAA+B;IAE/B,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,MAAM,CAAA;IAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACvD,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC1E,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAA;IAC3C,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAoC;IACzE,OAAO,CACL,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QACrE,SAAS,CAAC,SAAS;QACnB,SAAS,CAAC,cAAc;QACxB,SAAS,CAAC,WAAW;QACrB,SAAS,CAAC,WAAW;QACrB,SAAS,CAAC,UAAU;QACpB,SAAS,CAAC,YAAY,CACvB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAKhD;IACC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACxD,IAAI,QAAQ,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,wCAAwC,QAAQ,iCAAiC,KAAK,CAAC,aAAa,EAAE,CACvG,CAAA;IACH,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAChD,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,WAAW,EACnC,CAAC,CACF,CAAA;IACD,IAAI,OAAO,KAAK,KAAK,CAAC,YAAY,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,uCAAuC,OAAO,gCAAgC,KAAK,CAAC,YAAY,EAAE,CACnG,CAAA;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QAC9C,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,CAAC,YAAY,GAAG,CAAC,IAAI,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,wBAAwB,CAAC,CAAA;QACnF,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,qBAAqB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,gCAAgC,CACzE,CAAA;QACH,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAChF,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,CAAC,YAAY,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;IACtF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,KAA8B;IAC/E,KAAK,MAAM,GAAG,IAAI,0BAA0B,EAAE,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,oDAAoD,GAAG,EAAE,CAAC,CAAA;QAC5E,CAAC;IACH,CAAC;AACH,CAAC;AAiBD,SAAS,KAAK,CAAC,KAAa,EAAE,EAAW;IACvC,OAAO,GAAG,KAAK,KAAK,EAAE,EAAE,CAAA;AAC1B,CAAC;AAED,MAAM,OAAO,yBAAyB;IACpC,cAAc,GAAG,CAAC,CAAA;IAClB,gBAAgB,GAAG,CAAC,CAAA;IACX,QAAQ,GAAoB,EAAE,CAAA;IAC9B,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAA;IAEnD,cAAc,CAAC,GAAY,EAAE,IAAa;QACxC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;YAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;gBAAE,OAAM;YACtD,IAAI,CAAC,cAAc,IAAI,KAAK,CAAA;YAC5B,MAAM,UAAU,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAA;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YACjC,IACE,IAAI;gBACJ,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;gBACjC,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK;gBAC/B,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,EACzB,CAAC;gBACD,IAAI,CAAC,IAAI,IAAI,KAAK,CAAA;gBAClB,OAAM;YACR,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC,CAAA;QAC3E,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;YAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;gBAAE,OAAM;YACtD,IAAI,CAAC,cAAc,IAAI,KAAK,CAAA;YAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACjB,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,IAAI;gBACX,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,KAAK;gBACX,kBAAkB,EAAE,CAAC;aACtB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,mBAAmB,CAAC,KAAc;QAChC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YACvB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAM;YAC9C,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;gBAClC,IAAI,KAAK,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;oBACnC,KAAK,CAAC,kBAAkB,IAAI,CAAC,CAAA;oBAC7B,OAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,oBAAoB,CAAC,MAMpB;QACC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;YACxC,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC;gBAAE,OAAM;YAC3C,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACjC,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,QAAQ;gBAAE,OAAM;YACpF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;YACrC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;gBAAE,OAAM;YACpD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACvC,MAAM,UAAU,GACd,QAAQ,EAAE,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,KAAK,QAAQ;gBACjE,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,SAAS,CAAA;YACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;gBACrB,KAAK;gBACL,EAAE;gBACF,UAAU;gBACV,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI;aACnC,CAAC,CAAA;YACF,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC/D,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAA;YAC/B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,uBAAuB,CAAC,IAAa;QACnC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;YAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;gBAAE,OAAM;YACtD,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;gBAClC,IAAI,KAAK,CAAC,MAAM,KAAK,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAClD,IAAI,CAAC,oBAAoB,CAAC;wBACxB,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,UAAU,EAAE,SAAS;wBACrB,OAAO,EAAE,KAAK;wBACd,IAAI,EAAE,KAAK;qBACZ,CAAC,CAAA;oBACF,OAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,SAAS,CAAC,IAA0B;QAClC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAA0B;QAC/B,MAAM,SAAS,GAA8B;YAC3C,WAAW,EAAE,EAAE;YACf,SAAS,EAAE,CAAC;YACZ,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,CAAC;SAChB,CAAA;QACD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAqC,CAAA;QAEhE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAC/E,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,GAAG,WAAW,CAAA;YAC1C,SAAS,CAAC,SAAS,IAAI,WAAW,CAAA;YAClC,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBAClC,SAAS,CAAC,SAAS,IAAI,SAAS,CAAA;gBAChC,SAAQ;YACV,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;gBACvC,SAAS,CAAC,cAAc,IAAI,SAAS,CAAA;gBACrC,SAAQ;YACV,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;gBACpC,SAAS,CAAC,WAAW,IAAI,SAAS,CAAA;gBAClC,SAAQ;YACV,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;gBACnC,SAAS,CAAC,WAAW,IAAI,SAAS,CAAA;gBAClC,SAAQ;YACV,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;gBACnC,SAAS,CAAC,UAAU,IAAI,SAAS,CAAA;gBACjC,SAAQ;YACV,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAClD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC/D,iBAAiB,CAAC,WAAW,EAAE;oBAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,SAAS;oBAC5C,WAAW,EAAE,CAAC;oBACd,YAAY,EAAE,SAAS;oBACvB,SAAS,EAAE,CAAC;iBACb,CAAC,CAAA;gBACF,SAAQ;YACV,CAAC;YACD,SAAS,CAAC,YAAY,IAAI,SAAS,CAAA;QACrC,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,iBAAiB,CAAC,WAAW,EAAE;gBAC7B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,WAAW,EAAE,OAAO,CAAC,IAAI;gBACzB,YAAY,EAAE,CAAC;aAChB,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,WAAW,CAAC,CAAA;YAC/D,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjC,CAAC;QACD,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAChF,CAAA;QAED,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,CAC/C,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,WAAW,EACnC,CAAC,CACF,CAAA;QACD,MAAM,eAAe,GACnB,IAAI,CAAC,OAAO,KAAK,aAAa,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO;YACxD,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAA;QAC3B,MAAM,MAAM,GAA2B;YACrC,GAAG,YAAY,CAAC,IAAI,CAAC;YACrB,QAAQ,EAAE,SAAS,CAAC,YAAY,KAAK,CAAC;YACtC,WAAW,EAAE,oBAAoB;YACjC,YAAY;YACZ,aAAa,EAAE,IAAI,CAAC,cAAc;YAClC,eAAe;YACf,SAAS;SACV,CAAA;QACD,gCAAgC,CAAC,MAAM,CAAC,CAAA;QACxC,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAED,SAAS,WAAW,CAAC,EAAU;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAC5C,IACE,KAAK,KAAK,QAAQ;QAClB,KAAK,KAAK,QAAQ;QAClB,KAAK,KAAK,QAAQ;QAClB,KAAK,KAAK,QAAQ,EAClB,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAA;IACjC,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,IAA0B;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC1C,OAAO;QACL,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAClE,cAAc,EACZ,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;YACpE,CAAC,CAAC,IAAI,CAAC,cAAc;YACrB,CAAC,CAAC,MAAM;QACZ,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpF,UAAU,EACR,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACpF,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KACnE,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,KAA6C,EAC7C,GAA0E;IAE1E,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YACb,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;SAC9B,CAAC,CAAA;QACF,OAAM;IACR,CAAC;IACD,QAAQ,CAAC,WAAW,IAAI,GAAG,CAAC,WAAW,CAAA;IACvC,QAAQ,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,CAAA;IACzC,QAAQ,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,IAAI,CAAC,CAAA;IACxC,IAAI,GAAG,CAAC,UAAU,KAAK,QAAQ;QAAE,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAA;AACjE,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAA0B,EAC1B,aAAqB;IAErB,OAAO;QACL,GAAG,IAAI;QACP,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,oBAAoB;QACjC,YAAY,EAAE,CAAC;QACf,aAAa;QACb,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE;YACT,WAAW,EAAE,EAAE;YACf,SAAS,EAAE,CAAC;YACZ,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,aAAa;SAC5B;KACF,CAAA;AACH,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import type { Transaction } from '@rocicorp/zero';
2
2
  export declare const zeroHttpFixtureSchema: {
3
3
  tables: {
4
- readonly user: {
5
- name: "user";
4
+ readonly project: {
5
+ name: "project";
6
6
  columns: {
7
7
  readonly id: {
8
8
  type: "string";
@@ -11,6 +11,13 @@ export declare const zeroHttpFixtureSchema: {
11
11
  } & {
12
12
  serverName: string;
13
13
  };
14
+ readonly ownerId: {
15
+ type: "string";
16
+ optional: false;
17
+ customType: string;
18
+ } & {
19
+ serverName: string;
20
+ };
14
21
  readonly name: {
15
22
  type: "string";
16
23
  optional: false;
@@ -23,8 +30,8 @@ export declare const zeroHttpFixtureSchema: {
23
30
  } & {
24
31
  primaryKey: ["id"];
25
32
  };
26
- readonly project: {
27
- name: "project";
33
+ readonly user: {
34
+ name: "user";
28
35
  columns: {
29
36
  readonly id: {
30
37
  type: "string";
@@ -33,13 +40,6 @@ export declare const zeroHttpFixtureSchema: {
33
40
  } & {
34
41
  serverName: string;
35
42
  };
36
- readonly ownerId: {
37
- type: "string";
38
- optional: false;
39
- customType: string;
40
- } & {
41
- serverName: string;
42
- };
43
43
  readonly name: {
44
44
  type: "string";
45
45
  optional: false;
@@ -5,6 +5,7 @@ export type QueryTransform = (name: string, args: readonly unknown[]) => unknown
5
5
  export type HttpPullTransport = {
6
6
  pull(): Promise<void>;
7
7
  flush(): Promise<void>;
8
+ subscribeLifecycle(listener: (event: HttpPullLifecycleEvent) => void): () => void;
8
9
  readonly connections: number;
9
10
  readonly pageID: string;
10
11
  readonly transportID: string;
@@ -38,7 +39,7 @@ export type HttpPullTransportOptions = {
38
39
  lifecycle?: (event: HttpPullLifecycleEvent) => void;
39
40
  };
40
41
  export type HttpPullLifecycleEvent = {
41
- type: 'created' | 'listener' | 'open' | 'close' | 'failure' | 'superseded' | 'aborted' | 'push';
42
+ type: 'created' | 'listener' | 'open' | 'pull' | 'close' | 'failure' | 'superseded' | 'aborted' | 'push';
42
43
  pageID: string;
43
44
  transportID: string;
44
45
  zeroInstanceID: string;
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAA6B,MAAM,oBAAoB,CAAA;AAEjF,YAAY,EACV,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,oBAAoB,CAAA;AAG3B,KAAK,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAA;AA+B7D,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,KAAK,OAAO,CAAA;AAoFhF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,SAAS,IAAI,IAAI,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAA;AAEzF,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,GAAG,GAAG,EACtB,IAAI,GAAE,kBAAuB,EAC7B,mBAAmB,GAAE,OAAO,KAAwB,GACnD,MAAM,OAAO,CAAC,MAAM,CAAC,CAwBvB;AAED,MAAM,MAAM,wBAAwB,GAAG;IAGrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IAGd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IAGpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;KAAE,CAAA;IAOhD,cAAc,CAAC,EAAE,cAAc,CAAA;IAG/B,YAAY,CAAC,EAAE,YAAY,CAAA;IAI3B,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAA;CACpD,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EACA,SAAS,GACT,UAAU,GACV,MAAM,GACN,OAAO,GACP,SAAS,GACT,YAAY,GACZ,SAAS,GACT,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IAIf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAyFD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,wBAAwB,GAC7B,iBAAiB,CA2FnB;AAKD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,wBAAwB,GAC7B,iBAAiB,CAgCnB;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAAA;CAC3C,CAAA;AAED,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAM,GACrD,yBAAyB,CAY3B;AAED,wBAAsB,uBAAuB,kBAO5C;AAKD,wBAAsB,sBAAsB,kBAK3C;AA07BD,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,OAAO,KAAK,EACvB,IAAI,EAAE,OAAO,GAAG,OAAO,EACvB,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,QAAQ,CAAC,CAmBnB;AAED,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,OAAO,GAAG,OAAO,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAsCjB"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"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"}
@@ -163,6 +163,7 @@ export function installHttpPullTransport(opts) {
163
163
  activeSocketGenerationByClient: new Map(),
164
164
  activeSocketByClient: new Map(),
165
165
  lifecycle: opts.lifecycle ?? logHttpPullLifecycle,
166
+ lifecycleListeners: new Set(),
166
167
  };
167
168
  const Shim = class {
168
169
  static CONNECTING = 0;
@@ -194,6 +195,10 @@ export function installHttpPullTransport(opts) {
194
195
  throw new Error('transport changed during flush');
195
196
  }
196
197
  },
198
+ subscribeLifecycle: (listener) => {
199
+ state.lifecycleListeners.add(listener);
200
+ return () => state.lifecycleListeners.delete(listener);
201
+ },
197
202
  get connections() {
198
203
  return state.sockets.size;
199
204
  },
@@ -451,9 +456,11 @@ class ZeroHttpSocket {
451
456
  this.applyServerGotQueries(response);
452
457
  if (response.unchanged) {
453
458
  this.emitGotQueriesPatch(response.cookie);
454
- return;
455
459
  }
456
- this.emitPoke(response);
460
+ else {
461
+ this.emitPoke(response);
462
+ }
463
+ this.emitLifecycle('pull');
457
464
  })
458
465
  .catch((error) => {
459
466
  this.fail(error);
@@ -1118,7 +1125,7 @@ class ZeroHttpSocket {
1118
1125
  : performance.now() - this.attemptStartedAt;
1119
1126
  }
1120
1127
  emitLifecycle(type, detail = {}) {
1121
- this.state.lifecycle?.({
1128
+ const event = {
1122
1129
  type,
1123
1130
  pageID: this.state.pageID,
1124
1131
  transportID: this.state.transportID,
@@ -1134,7 +1141,10 @@ class ZeroHttpSocket {
1134
1141
  attemptStartedAt: this.attemptStartedAt,
1135
1142
  attemptAgeMs: this.getAttemptAgeMs(),
1136
1143
  ...detail,
1137
- });
1144
+ };
1145
+ this.state.lifecycle?.(event);
1146
+ for (const listener of this.state.lifecycleListeners)
1147
+ listener(event);
1138
1148
  }
1139
1149
  }
1140
1150
  // abort only when response HEADERS miss the deadline; once they arrive the