@livestore/livestore 0.0.0-snapshot-909cdd1ac2fd591945c2be2b0f53e14d87f3c9d4

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 (131) hide show
  1. package/README.md +1 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/QueryCache.d.ts +20 -0
  4. package/dist/QueryCache.d.ts.map +1 -0
  5. package/dist/QueryCache.js +61 -0
  6. package/dist/QueryCache.js.map +1 -0
  7. package/dist/SynchronousDatabaseWrapper.d.ts +36 -0
  8. package/dist/SynchronousDatabaseWrapper.d.ts.map +1 -0
  9. package/dist/SynchronousDatabaseWrapper.js +176 -0
  10. package/dist/SynchronousDatabaseWrapper.js.map +1 -0
  11. package/dist/effect/LiveStore.d.ts +38 -0
  12. package/dist/effect/LiveStore.d.ts.map +1 -0
  13. package/dist/effect/LiveStore.js +38 -0
  14. package/dist/effect/LiveStore.js.map +1 -0
  15. package/dist/effect/index.d.ts +2 -0
  16. package/dist/effect/index.d.ts.map +1 -0
  17. package/dist/effect/index.js +2 -0
  18. package/dist/effect/index.js.map +1 -0
  19. package/dist/global-state.d.ts +14 -0
  20. package/dist/global-state.d.ts.map +1 -0
  21. package/dist/global-state.js +16 -0
  22. package/dist/global-state.js.map +1 -0
  23. package/dist/index.d.ts +19 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +15 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/reactive.d.ts +163 -0
  28. package/dist/reactive.d.ts.map +1 -0
  29. package/dist/reactive.js +382 -0
  30. package/dist/reactive.js.map +1 -0
  31. package/dist/reactive.test.d.ts +2 -0
  32. package/dist/reactive.test.d.ts.map +1 -0
  33. package/dist/reactive.test.js +345 -0
  34. package/dist/reactive.test.js.map +1 -0
  35. package/dist/reactiveQueries/base-class.d.ts +59 -0
  36. package/dist/reactiveQueries/base-class.d.ts.map +1 -0
  37. package/dist/reactiveQueries/base-class.js +29 -0
  38. package/dist/reactiveQueries/base-class.js.map +1 -0
  39. package/dist/reactiveQueries/graphql.d.ts +52 -0
  40. package/dist/reactiveQueries/graphql.d.ts.map +1 -0
  41. package/dist/reactiveQueries/graphql.js +136 -0
  42. package/dist/reactiveQueries/graphql.js.map +1 -0
  43. package/dist/reactiveQueries/js.d.ts +35 -0
  44. package/dist/reactiveQueries/js.d.ts.map +1 -0
  45. package/dist/reactiveQueries/js.js +57 -0
  46. package/dist/reactiveQueries/js.js.map +1 -0
  47. package/dist/reactiveQueries/sql.d.ts +49 -0
  48. package/dist/reactiveQueries/sql.d.ts.map +1 -0
  49. package/dist/reactiveQueries/sql.js +130 -0
  50. package/dist/reactiveQueries/sql.js.map +1 -0
  51. package/dist/reactiveQueries/sql.test.d.ts +2 -0
  52. package/dist/reactiveQueries/sql.test.d.ts.map +1 -0
  53. package/dist/reactiveQueries/sql.test.js +284 -0
  54. package/dist/reactiveQueries/sql.test.js.map +1 -0
  55. package/dist/row-query.d.ts +33 -0
  56. package/dist/row-query.d.ts.map +1 -0
  57. package/dist/row-query.js +84 -0
  58. package/dist/row-query.js.map +1 -0
  59. package/dist/store-context.d.ts +26 -0
  60. package/dist/store-context.d.ts.map +1 -0
  61. package/dist/store-context.js +6 -0
  62. package/dist/store-context.js.map +1 -0
  63. package/dist/store-devtools.d.ts +19 -0
  64. package/dist/store-devtools.d.ts.map +1 -0
  65. package/dist/store-devtools.js +141 -0
  66. package/dist/store-devtools.js.map +1 -0
  67. package/dist/store.d.ts +175 -0
  68. package/dist/store.d.ts.map +1 -0
  69. package/dist/store.js +507 -0
  70. package/dist/store.js.map +1 -0
  71. package/dist/utils/data-structures.d.ts +10 -0
  72. package/dist/utils/data-structures.d.ts.map +1 -0
  73. package/dist/utils/data-structures.js +32 -0
  74. package/dist/utils/data-structures.js.map +1 -0
  75. package/dist/utils/dev.d.ts +3 -0
  76. package/dist/utils/dev.d.ts.map +1 -0
  77. package/dist/utils/dev.js +17 -0
  78. package/dist/utils/dev.js.map +1 -0
  79. package/dist/utils/otel.d.ts +4 -0
  80. package/dist/utils/otel.d.ts.map +1 -0
  81. package/dist/utils/otel.js +6 -0
  82. package/dist/utils/otel.js.map +1 -0
  83. package/dist/utils/stack-info.d.ts +10 -0
  84. package/dist/utils/stack-info.d.ts.map +1 -0
  85. package/dist/utils/stack-info.js +41 -0
  86. package/dist/utils/stack-info.js.map +1 -0
  87. package/dist/utils/stack-info.test.d.ts +2 -0
  88. package/dist/utils/stack-info.test.d.ts.map +1 -0
  89. package/dist/utils/stack-info.test.js +75 -0
  90. package/dist/utils/stack-info.test.js.map +1 -0
  91. package/dist/utils/tests/fixture.d.ts +259 -0
  92. package/dist/utils/tests/fixture.d.ts.map +1 -0
  93. package/dist/utils/tests/fixture.js +33 -0
  94. package/dist/utils/tests/fixture.js.map +1 -0
  95. package/dist/utils/tests/mod.d.ts +3 -0
  96. package/dist/utils/tests/mod.d.ts.map +1 -0
  97. package/dist/utils/tests/mod.js +3 -0
  98. package/dist/utils/tests/mod.js.map +1 -0
  99. package/dist/utils/tests/otel.d.ts +10 -0
  100. package/dist/utils/tests/otel.d.ts.map +1 -0
  101. package/dist/utils/tests/otel.js +42 -0
  102. package/dist/utils/tests/otel.js.map +1 -0
  103. package/package.json +60 -0
  104. package/src/QueryCache.ts +81 -0
  105. package/src/SynchronousDatabaseWrapper.ts +256 -0
  106. package/src/ambient.d.ts +10 -0
  107. package/src/effect/LiveStore.ts +112 -0
  108. package/src/effect/index.ts +8 -0
  109. package/src/global-state.ts +20 -0
  110. package/src/index.ts +64 -0
  111. package/src/reactive.test.ts +426 -0
  112. package/src/reactive.ts +661 -0
  113. package/src/reactiveQueries/base-class.ts +115 -0
  114. package/src/reactiveQueries/graphql.ts +233 -0
  115. package/src/reactiveQueries/js.ts +108 -0
  116. package/src/reactiveQueries/sql.test.ts +308 -0
  117. package/src/reactiveQueries/sql.ts +226 -0
  118. package/src/row-query.ts +200 -0
  119. package/src/store-context.ts +23 -0
  120. package/src/store-devtools.ts +217 -0
  121. package/src/store.ts +920 -0
  122. package/src/utils/data-structures.ts +36 -0
  123. package/src/utils/dev.ts +24 -0
  124. package/src/utils/otel.ts +9 -0
  125. package/src/utils/stack-info.test.ts +79 -0
  126. package/src/utils/stack-info.ts +54 -0
  127. package/src/utils/tests/fixture.ts +77 -0
  128. package/src/utils/tests/mod.ts +2 -0
  129. package/src/utils/tests/otel.ts +61 -0
  130. package/tsconfig.json +18 -0
  131. package/vitest.config.js +9 -0
package/dist/store.js ADDED
@@ -0,0 +1,507 @@
1
+ import { getExecArgsFromMutation, prepareBindValues, UnexpectedError } from '@livestore/common';
2
+ import { isPartialMutationEvent, makeMutationEventSchemaMemo, SCHEMA_META_TABLE, SCHEMA_MUTATIONS_META_TABLE, SESSION_CHANGESET_META_TABLE, } from '@livestore/common/schema';
3
+ import { assertNever, makeNoopTracer, shouldNeverHappen } from '@livestore/utils';
4
+ import { Cause, Data, Deferred, Duration, Effect, Exit, FiberSet, Inspectable, Layer, Logger, LogLevel, MutableHashMap, OtelTracer, Queue, Runtime, Schema, Scope, Stream, } from '@livestore/utils/effect';
5
+ import * as otel from '@opentelemetry/api';
6
+ import { globalReactivityGraph } from './global-state.js';
7
+ import { connectDevtoolsToStore } from './store-devtools.js';
8
+ import { SynchronousDatabaseWrapper } from './SynchronousDatabaseWrapper.js';
9
+ import { ReferenceCountedSet } from './utils/data-structures.js';
10
+ import { downloadBlob } from './utils/dev.js';
11
+ import { getDurationMsFromSpan } from './utils/otel.js';
12
+ // eslint-disable-next-line unicorn/prefer-global-this
13
+ if (import.meta.env.DEV && typeof window !== 'undefined') {
14
+ // eslint-disable-next-line unicorn/prefer-global-this
15
+ window.__debugDownloadBlob = downloadBlob;
16
+ }
17
+ export class Store extends Inspectable.Class {
18
+ storeId;
19
+ reactivityGraph;
20
+ syncDbWrapper;
21
+ clientSession;
22
+ schema;
23
+ graphQLSchema;
24
+ graphQLContext;
25
+ otel;
26
+ /**
27
+ * Note we're using `Ref<null>` here as we don't care about the value but only about *that* something has changed.
28
+ * This only works in combination with `equal: () => false` which will always trigger a refresh.
29
+ */
30
+ tableRefs;
31
+ fiberSet;
32
+ runtime;
33
+ /** RC-based set to see which queries are currently subscribed to */
34
+ activeQueries;
35
+ // NOTE this is currently exposed for the Devtools databrowser to emit mutation events
36
+ __mutationEventSchema;
37
+ currentMutationEventIdRef;
38
+ unsyncedMutationEvents;
39
+ // #region constructor
40
+ constructor({ clientSession, schema, graphQLOptions, reactivityGraph, otelOptions, disableDevtools, batchUpdates, currentMutationEventIdRef, unsyncedMutationEvents, storeId, fiberSet, runtime, }) {
41
+ super();
42
+ this.storeId = storeId;
43
+ this.currentMutationEventIdRef = currentMutationEventIdRef;
44
+ this.unsyncedMutationEvents = unsyncedMutationEvents;
45
+ this.syncDbWrapper = new SynchronousDatabaseWrapper({ otel: otelOptions, db: clientSession.syncDb });
46
+ this.clientSession = clientSession;
47
+ this.schema = schema;
48
+ this.fiberSet = fiberSet;
49
+ this.runtime = runtime;
50
+ // TODO refactor
51
+ this.__mutationEventSchema = makeMutationEventSchemaMemo(schema);
52
+ // TODO generalize the `tableRefs` concept to allow finer-grained refs
53
+ this.tableRefs = {};
54
+ this.activeQueries = new ReferenceCountedSet();
55
+ const mutationsSpan = otelOptions.tracer.startSpan('LiveStore:mutations', {}, otelOptions.rootSpanContext);
56
+ const otelMuationsSpanContext = otel.trace.setSpan(otel.context.active(), mutationsSpan);
57
+ const queriesSpan = otelOptions.tracer.startSpan('LiveStore:queries', {}, otelOptions.rootSpanContext);
58
+ const otelQueriesSpanContext = otel.trace.setSpan(otel.context.active(), queriesSpan);
59
+ this.reactivityGraph = reactivityGraph;
60
+ this.reactivityGraph.context = {
61
+ store: this,
62
+ otelTracer: otelOptions.tracer,
63
+ rootOtelContext: otelQueriesSpanContext,
64
+ effectsWrapper: batchUpdates,
65
+ };
66
+ this.otel = {
67
+ tracer: otelOptions.tracer,
68
+ mutationsSpanContext: otelMuationsSpanContext,
69
+ queriesSpanContext: otelQueriesSpanContext,
70
+ };
71
+ // TODO find a better way to detect if we're running LiveStore in the LiveStore devtools
72
+ // But for now this is a good enough approximation with little downsides
73
+ const isRunningInDevtools = disableDevtools === true;
74
+ // Need a set here since `schema.tables` might contain duplicates and some componentStateTables
75
+ const allTableNames = new Set(
76
+ // NOTE we're excluding the LiveStore schema and mutations tables as they are not user-facing
77
+ // unless LiveStore is running in the devtools
78
+ isRunningInDevtools
79
+ ? this.schema.tables.keys()
80
+ : Array.from(this.schema.tables.keys()).filter((_) => _ !== SCHEMA_META_TABLE && _ !== SCHEMA_MUTATIONS_META_TABLE && _ !== SESSION_CHANGESET_META_TABLE));
81
+ const existingTableRefs = new Map(Array.from(this.reactivityGraph.atoms.values())
82
+ .filter((_) => _._tag === 'ref' && _.label?.startsWith('tableRef:') === true)
83
+ .map((_) => [_.label.slice('tableRef:'.length), _]));
84
+ for (const tableName of allTableNames) {
85
+ this.tableRefs[tableName] = existingTableRefs.get(tableName) ?? this.makeTableRef(tableName);
86
+ }
87
+ if (graphQLOptions) {
88
+ this.graphQLSchema = graphQLOptions.schema;
89
+ this.graphQLContext = graphQLOptions.makeContext(this.syncDbWrapper, this.otel.tracer, clientSession.coordinator.sessionId);
90
+ }
91
+ Effect.gen(this, function* () {
92
+ yield* this.clientSession.coordinator.syncMutations.pipe(Stream.tapChunk((mutationsEventsDecodedChunk) => Effect.sync(() => {
93
+ this.mutate({ wasSyncMessage: true }, ...mutationsEventsDecodedChunk);
94
+ })), Stream.runDrain, Effect.interruptible, Effect.withSpan('LiveStore:syncMutations'), Effect.forkScoped);
95
+ yield* Effect.addFinalizer(() => Effect.sync(() => {
96
+ for (const tableRef of Object.values(this.tableRefs)) {
97
+ for (const superComp of tableRef.super) {
98
+ this.reactivityGraph.removeEdge(superComp, tableRef);
99
+ }
100
+ }
101
+ otel.trace.getSpan(this.otel.mutationsSpanContext).end();
102
+ otel.trace.getSpan(this.otel.queriesSpanContext).end();
103
+ }));
104
+ yield* Effect.never;
105
+ }).pipe(Effect.scoped, Effect.withSpan('LiveStore:constructor'), this.runEffectFork);
106
+ }
107
+ // #endregion constructor
108
+ static createStore = (storeOptions, parentSpan) => {
109
+ const ctx = otel.trace.setSpan(otel.context.active(), parentSpan);
110
+ return storeOptions.otelOptions.tracer.startActiveSpan('LiveStore:createStore', {}, ctx, (span) => {
111
+ try {
112
+ return new Store(storeOptions);
113
+ }
114
+ finally {
115
+ span.end();
116
+ }
117
+ });
118
+ };
119
+ get sessionId() {
120
+ return this.clientSession.coordinator.sessionId;
121
+ }
122
+ /**
123
+ * Subscribe to the results of a query
124
+ * Returns a function to cancel the subscription.
125
+ */
126
+ subscribe = (query$, onNewValue, onUnsubsubscribe, options) => this.otel.tracer.startActiveSpan(`LiveStore.subscribe`, { attributes: { label: options?.label, queryLabel: query$.label } }, options?.otelContext ?? this.otel.queriesSpanContext, (span) => {
127
+ // console.debug('store sub', query$.id, query$.label)
128
+ const otelContext = otel.trace.setSpan(otel.context.active(), span);
129
+ const label = `subscribe:${options?.label}`;
130
+ const effect = this.reactivityGraph.makeEffect((get) => onNewValue(get(query$.results$)), { label });
131
+ this.activeQueries.add(query$);
132
+ // Running effect right away to get initial value (unless `skipInitialRun` is set)
133
+ if (options?.skipInitialRun !== true) {
134
+ effect.doEffect(otelContext);
135
+ }
136
+ const unsubscribe = () => {
137
+ // console.debug('store unsub', query$.id, query$.label)
138
+ try {
139
+ this.reactivityGraph.destroyNode(effect);
140
+ this.activeQueries.remove(query$);
141
+ onUnsubsubscribe?.();
142
+ }
143
+ finally {
144
+ span.end();
145
+ }
146
+ };
147
+ return unsubscribe;
148
+ });
149
+ // #region mutate
150
+ mutate = (firstMutationOrTxnFnOrOptions, ...restMutations) => {
151
+ let mutationsEvents;
152
+ let options;
153
+ if (typeof firstMutationOrTxnFnOrOptions === 'function') {
154
+ // TODO ensure that function is synchronous and isn't called in a async way (also write tests for this)
155
+ mutationsEvents = firstMutationOrTxnFnOrOptions((arg) => mutationsEvents.push(arg));
156
+ }
157
+ else if (firstMutationOrTxnFnOrOptions?.label !== undefined ||
158
+ firstMutationOrTxnFnOrOptions?.skipRefresh !== undefined ||
159
+ firstMutationOrTxnFnOrOptions?.wasSyncMessage !== undefined ||
160
+ firstMutationOrTxnFnOrOptions?.persisted !== undefined) {
161
+ options = firstMutationOrTxnFnOrOptions;
162
+ mutationsEvents = restMutations;
163
+ }
164
+ else if (firstMutationOrTxnFnOrOptions === undefined) {
165
+ // When `mutate` is called with no arguments (which sometimes happens when dynamically filtering mutations)
166
+ mutationsEvents = [];
167
+ }
168
+ else {
169
+ mutationsEvents = [firstMutationOrTxnFnOrOptions, ...restMutations];
170
+ }
171
+ mutationsEvents = mutationsEvents.filter((_) => _.id === undefined || !MutableHashMap.has(this.unsyncedMutationEvents, Data.struct(_.id)));
172
+ if (mutationsEvents.length === 0) {
173
+ return;
174
+ }
175
+ const label = options?.label ?? 'mutate';
176
+ const skipRefresh = options?.skipRefresh ?? false;
177
+ const wasSyncMessage = options?.wasSyncMessage ?? false;
178
+ const persisted = options?.persisted ?? true;
179
+ const mutationsSpan = otel.trace.getSpan(this.otel.mutationsSpanContext);
180
+ mutationsSpan.addEvent('mutate');
181
+ // console.group('LiveStore.mutate', { skipRefresh, wasSyncMessage, label })
182
+ // mutationsEvents.forEach((_) => console.debug(_.mutation, _.id, _.args))
183
+ // console.groupEnd()
184
+ let durationMs;
185
+ const res = this.otel.tracer.startActiveSpan('LiveStore:mutate', { attributes: { 'livestore.mutateLabel': label } }, this.otel.mutationsSpanContext, (span) => {
186
+ const otelContext = otel.trace.setSpan(otel.context.active(), span);
187
+ try {
188
+ const writeTables = new Set();
189
+ this.otel.tracer.startActiveSpan('LiveStore:processWrites', { attributes: { 'livestore.mutateLabel': label } }, otel.trace.setSpan(otel.context.active(), span), (span) => {
190
+ try {
191
+ const otelContext = otel.trace.setSpan(otel.context.active(), span);
192
+ const applyMutations = () => {
193
+ for (const mutationEvent of mutationsEvents) {
194
+ try {
195
+ const { writeTables: writeTablesForEvent } = this.mutateWithoutRefresh(mutationEvent, {
196
+ otelContext,
197
+ // NOTE if it was a sync message, it's already coming from the coordinator, so we can skip the coordinator
198
+ coordinatorMode: wasSyncMessage ? 'skip-coordinator' : persisted ? 'default' : 'skip-persist',
199
+ });
200
+ for (const tableName of writeTablesForEvent) {
201
+ writeTables.add(tableName);
202
+ }
203
+ }
204
+ catch (e) {
205
+ console.error(e, mutationEvent);
206
+ throw e;
207
+ }
208
+ }
209
+ };
210
+ if (mutationsEvents.length > 1) {
211
+ // TODO: what to do about coordinator transaction here?
212
+ this.syncDbWrapper.txn(applyMutations);
213
+ }
214
+ else {
215
+ applyMutations();
216
+ }
217
+ }
218
+ catch (e) {
219
+ console.error(e);
220
+ span.setStatus({ code: otel.SpanStatusCode.ERROR, message: e.toString() });
221
+ throw e;
222
+ }
223
+ finally {
224
+ span.end();
225
+ }
226
+ });
227
+ const tablesToUpdate = [];
228
+ for (const tableName of writeTables) {
229
+ const tableRef = this.tableRefs[tableName];
230
+ assertNever(tableRef !== undefined, `No table ref found for ${tableName}`);
231
+ tablesToUpdate.push([tableRef, null]);
232
+ }
233
+ const debugRefreshReason = {
234
+ _tag: 'mutate',
235
+ mutations: mutationsEvents,
236
+ writeTables: Array.from(writeTables),
237
+ };
238
+ // Update all table refs together in a batch, to only trigger one reactive update
239
+ this.reactivityGraph.setRefs(tablesToUpdate, { debugRefreshReason, otelContext, skipRefresh });
240
+ }
241
+ catch (e) {
242
+ console.error(e);
243
+ span.setStatus({ code: otel.SpanStatusCode.ERROR, message: e.toString() });
244
+ throw e;
245
+ }
246
+ finally {
247
+ span.end();
248
+ durationMs = getDurationMsFromSpan(span);
249
+ }
250
+ return { durationMs };
251
+ });
252
+ // NOTE we need to add the mutation events to the unsynced mutation events map only after running the code above
253
+ // so the short-circuiting in `mutateWithoutRefresh` doesn't kick in for those events
254
+ for (const mutationEvent of mutationsEvents) {
255
+ if (mutationEvent.id !== undefined) {
256
+ MutableHashMap.set(this.unsyncedMutationEvents, Data.struct(mutationEvent.id), mutationEvent);
257
+ }
258
+ }
259
+ return res;
260
+ };
261
+ /**
262
+ * This can be used in combination with `skipRefresh` when applying mutations.
263
+ * We might need a better solution for this. Let's see.
264
+ */
265
+ manualRefresh = (options) => {
266
+ const { label } = options ?? {};
267
+ this.otel.tracer.startActiveSpan('LiveStore:manualRefresh', { attributes: { 'livestore.manualRefreshLabel': label } }, this.otel.mutationsSpanContext, (span) => {
268
+ const otelContext = otel.trace.setSpan(otel.context.active(), span);
269
+ this.reactivityGraph.runDeferredEffects({ otelContext });
270
+ span.end();
271
+ });
272
+ };
273
+ /**
274
+ * Apply a mutation to the store.
275
+ * Returns the tables that were affected by the event.
276
+ * This is an internal method that doesn't trigger a refresh;
277
+ * the caller must refresh queries after calling this method.
278
+ */
279
+ mutateWithoutRefresh = (mutationEventDecoded_, options) => {
280
+ const mutationDef = this.schema.mutations.get(mutationEventDecoded_.mutation) ??
281
+ shouldNeverHappen(`Unknown mutation type: ${mutationEventDecoded_.mutation}`);
282
+ // Needs to happen only for partial mutation events (thus a function)
283
+ const nextMutationEventId = () => {
284
+ const { id, parentId } = this.clientSession.coordinator
285
+ .nextMutationEventIdPair({ localOnly: mutationDef.options.localOnly })
286
+ .pipe(Effect.runSync);
287
+ this.currentMutationEventIdRef.current = id;
288
+ return { id, parentId };
289
+ };
290
+ const mutationEventDecoded = isPartialMutationEvent(mutationEventDecoded_)
291
+ ? { ...mutationEventDecoded_, ...nextMutationEventId() }
292
+ : mutationEventDecoded_;
293
+ // NOTE we also need this temporary workaround here since some code-paths use `mutateWithoutRefresh` directly
294
+ // e.g. the row-query functionality
295
+ if (MutableHashMap.has(this.unsyncedMutationEvents, Data.struct(mutationEventDecoded.id))) {
296
+ // NOTE this data should never be used
297
+ return { writeTables: new Set(), durationMs: 0 };
298
+ }
299
+ else {
300
+ MutableHashMap.set(this.unsyncedMutationEvents, Data.struct(mutationEventDecoded.id), mutationEventDecoded);
301
+ }
302
+ const { otelContext, coordinatorMode = 'default' } = options;
303
+ return this.otel.tracer.startActiveSpan('LiveStore:mutateWithoutRefresh', {
304
+ attributes: {
305
+ 'livestore.mutation': mutationEventDecoded.mutation,
306
+ 'livestore.args': JSON.stringify(mutationEventDecoded.args, null, 2),
307
+ },
308
+ }, otelContext, (span) => {
309
+ const otelContext = otel.trace.setSpan(otel.context.active(), span);
310
+ const allWriteTables = new Set();
311
+ let durationMsTotal = 0;
312
+ const execArgsArr = getExecArgsFromMutation({ mutationDef, mutationEventDecoded });
313
+ for (const { statementSql, bindValues, writeTables = this.syncDbWrapper.getTablesUsed(statementSql), } of execArgsArr) {
314
+ // TODO when the store doesn't have the lock, we need wait for the coordinator to confirm the mutation
315
+ // before executing the mutation on the main db
316
+ const { durationMs } = this.syncDbWrapper.execute(statementSql, bindValues, writeTables, { otelContext });
317
+ durationMsTotal += durationMs;
318
+ writeTables.forEach((table) => allWriteTables.add(table));
319
+ }
320
+ const mutationEventEncoded = Schema.encodeUnknownSync(this.__mutationEventSchema)(mutationEventDecoded);
321
+ if (coordinatorMode !== 'skip-coordinator') {
322
+ // Asynchronously apply mutation to a persistent storage (we're not awaiting this promise here)
323
+ this.clientSession.coordinator
324
+ .mutate(mutationEventEncoded, { persisted: coordinatorMode !== 'skip-persist' })
325
+ .pipe(this.runEffectFork);
326
+ }
327
+ // Uncomment to print a list of queries currently registered on the store
328
+ // console.debug(JSON.parse(JSON.stringify([...this.queries].map((q) => `${labelForKey(q.componentKey)}/${q.label}`))))
329
+ span.end();
330
+ return { writeTables: allWriteTables, durationMs: durationMsTotal };
331
+ });
332
+ };
333
+ // #endregion mutate
334
+ /**
335
+ * Directly execute a SQL query on the Store.
336
+ * This should only be used for framework-internal purposes;
337
+ * all app writes should go through mutate.
338
+ */
339
+ __execute = (query, params = {}, writeTables, otelContext) => {
340
+ this.syncDbWrapper.execute(query, prepareBindValues(params, query), writeTables, { otelContext });
341
+ this.clientSession.coordinator.execute(query, prepareBindValues(params, query)).pipe(this.runEffectFork);
342
+ };
343
+ __select = (query, params = {}) => {
344
+ return this.syncDbWrapper.select(query, { bindValues: prepareBindValues(params, query) });
345
+ };
346
+ makeTableRef = (tableName) => this.reactivityGraph.makeRef(null, {
347
+ equal: () => false,
348
+ label: `tableRef:${tableName}`,
349
+ meta: { liveStoreRefType: 'table' },
350
+ });
351
+ __devDownloadDb = () => {
352
+ const data = this.syncDbWrapper.export();
353
+ downloadBlob(data, `livestore-${Date.now()}.db`);
354
+ };
355
+ __devDownloadMutationLogDb = () => Effect.gen(this, function* () {
356
+ const data = yield* this.clientSession.coordinator.getMutationLogData;
357
+ downloadBlob(data, `livestore-mutationlog-${Date.now()}.db`);
358
+ }).pipe(this.runEffectFork);
359
+ // NOTE This is needed because when booting a Store via Effect it seems to call `toJSON` in the error path
360
+ toJSON = () => {
361
+ return {
362
+ _tag: 'Store',
363
+ reactivityGraph: this.reactivityGraph.getSnapshot({ includeResults: true }),
364
+ };
365
+ };
366
+ runEffectFork = (effect) => effect.pipe(Effect.tapCauseLogPretty, FiberSet.run(this.fiberSet), Runtime.runFork(this.runtime));
367
+ }
368
+ /** Create a new LiveStore Store */
369
+ export const createStorePromise = async ({ signal, ...options }) => Effect.gen(function* () {
370
+ const scope = yield* Scope.make();
371
+ const runtime = yield* Effect.runtime();
372
+ if (signal !== undefined) {
373
+ signal.addEventListener('abort', () => {
374
+ Scope.close(scope, Exit.void).pipe(Effect.tapCauseLogPretty, Runtime.runFork(runtime));
375
+ });
376
+ }
377
+ return yield* FiberSet.make().pipe(Effect.andThen((fiberSet) => createStore({ ...options, fiberSet })), Scope.extend(scope));
378
+ }).pipe(Effect.withSpan('createStore'), Effect.tapCauseLogPretty, Effect.annotateLogs({ thread: 'window' }), Effect.provide(Logger.pretty), Logger.withMinimumLogLevel(LogLevel.Debug), Effect.runPromise);
379
+ // #region createStore
380
+ export const createStore = ({ schema, adapter, storeId, graphQLOptions, otelOptions, boot, reactivityGraph = globalReactivityGraph, batchUpdates, disableDevtools, onBootStatus, fiberSet, }) => {
381
+ const otelTracer = otelOptions?.tracer ?? makeNoopTracer();
382
+ const otelRootSpanContext = otelOptions?.rootSpanContext ?? otel.context.active();
383
+ const TracingLive = Layer.unwrapEffect(Effect.map(OtelTracer.make, Layer.setTracer)).pipe(Layer.provide(Layer.sync(OtelTracer.Tracer, () => otelTracer)));
384
+ return Effect.gen(function* () {
385
+ const span = yield* OtelTracer.currentOtelSpan.pipe(Effect.orDie);
386
+ const bootStatusQueue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
387
+ yield* Queue.take(bootStatusQueue).pipe(Effect.tapSync((status) => onBootStatus?.(status)), Effect.tap((status) => (status.stage === 'done' ? Queue.shutdown(bootStatusQueue) : Effect.void)), Effect.forever, Effect.tapCauseLogPretty, Effect.forkScoped);
388
+ const storeDeferred = yield* Deferred.make();
389
+ const connectDevtoolsToStore_ = (storeDevtoolsChannel) => Effect.gen(function* () {
390
+ const store = yield* Deferred.await(storeDeferred);
391
+ yield* connectDevtoolsToStore({ storeDevtoolsChannel, store });
392
+ });
393
+ const runtime = yield* Effect.runtime();
394
+ const runEffectFork = (effect) => effect.pipe(Effect.tapCauseLogPretty, FiberSet.run(fiberSet), Runtime.runFork(runtime));
395
+ // TODO close parent scope? (Needs refactor with Mike A)
396
+ const shutdown = (cause) => Effect.gen(function* () {
397
+ // NOTE we're calling `cause.toString()` here to avoid triggering a `console.error` in the grouped log
398
+ const logCause = Cause.isFailType(cause) && cause.error._tag === 'LiveStore.IntentionalShutdownCause'
399
+ ? cause.toString()
400
+ : cause;
401
+ yield* Effect.logDebug(`Shutting down LiveStore`, logCause);
402
+ FiberSet.clear(fiberSet).pipe(Effect.andThen(() => FiberSet.run(fiberSet, Effect.failCause(cause))), Effect.timeout(Duration.seconds(1)), Effect.logWarnIfTakesLongerThan({ label: '@livestore/livestore:shutdown:clear-fiber-set', duration: 500 }), Effect.catchTag('TimeoutException', (err) => Effect.logError('Store shutdown timed out. Forcing shutdown.', err).pipe(Effect.andThen(FiberSet.run(fiberSet, Effect.failCause(cause))))), Runtime.runFork(runtime));
403
+ }).pipe(Effect.withSpan('livestore:shutdown'));
404
+ const clientSession = yield* adapter({
405
+ schema,
406
+ storeId,
407
+ devtoolsEnabled: disableDevtools !== true,
408
+ bootStatusQueue,
409
+ shutdown,
410
+ connectDevtoolsToStore: connectDevtoolsToStore_,
411
+ }).pipe(Effect.withPerformanceMeasure('livestore:makeAdapter'), Effect.withSpan('createStore:makeAdapter'));
412
+ const mutationEventSchema = makeMutationEventSchemaMemo(schema);
413
+ // TODO get rid of this
414
+ // const __processedMutationIds = new Set<number>()
415
+ const currentMutationEventIdRef = { current: yield* clientSession.coordinator.getCurrentMutationEventId };
416
+ // TODO fill up with unsynced mutation events from the coordinator
417
+ const unsyncedMutationEvents = MutableHashMap.empty();
418
+ // TODO consider moving booting into the storage backend
419
+ if (boot !== undefined) {
420
+ let isInTxn = false;
421
+ let txnExecuteStmnts = [];
422
+ const bootDbImpl = {
423
+ _tag: 'BootDb',
424
+ execute: (queryStr, bindValues) => {
425
+ const stmt = clientSession.syncDb.prepare(queryStr);
426
+ stmt.execute(bindValues);
427
+ if (isInTxn === true) {
428
+ txnExecuteStmnts.push([queryStr, bindValues]);
429
+ }
430
+ else {
431
+ clientSession.coordinator.execute(queryStr, bindValues).pipe(runEffectFork);
432
+ }
433
+ },
434
+ mutate: (...list) => {
435
+ for (const mutationEventDecoded_ of list) {
436
+ const mutationDef = schema.mutations.get(mutationEventDecoded_.mutation) ??
437
+ shouldNeverHappen(`Unknown mutation type: ${mutationEventDecoded_.mutation}`);
438
+ const { id, parentId } = clientSession.coordinator
439
+ .nextMutationEventIdPair({ localOnly: mutationDef.options.localOnly })
440
+ .pipe(Effect.runSync);
441
+ currentMutationEventIdRef.current = id;
442
+ const mutationEventDecoded = { ...mutationEventDecoded_, id, parentId };
443
+ MutableHashMap.set(unsyncedMutationEvents, Data.struct(mutationEventDecoded.id), mutationEventDecoded);
444
+ // __processedMutationIds.add(mutationEventDecoded.id.global)
445
+ const execArgsArr = getExecArgsFromMutation({ mutationDef, mutationEventDecoded });
446
+ // const { bindValues, statementSql } = getExecArgsFromMutation({ mutationDef, mutationEventDecoded })
447
+ for (const { statementSql, bindValues } of execArgsArr) {
448
+ clientSession.syncDb.execute(statementSql, bindValues);
449
+ }
450
+ const mutationEventEncoded = Schema.encodeUnknownSync(mutationEventSchema)(mutationEventDecoded);
451
+ clientSession.coordinator
452
+ .mutate(mutationEventEncoded, { persisted: true })
453
+ .pipe(runEffectFork);
454
+ }
455
+ },
456
+ select: (queryStr, bindValues) => {
457
+ const stmt = clientSession.syncDb.prepare(queryStr);
458
+ return stmt.select(bindValues);
459
+ },
460
+ txn: (callback) => {
461
+ try {
462
+ isInTxn = true;
463
+ // clientSession.syncDb.execute('BEGIN TRANSACTION', undefined)
464
+ callback();
465
+ // clientSession.syncDb.execute('COMMIT', undefined)
466
+ // clientSession.coordinator.execute('BEGIN', undefined, undefined)
467
+ for (const [queryStr, bindValues] of txnExecuteStmnts) {
468
+ clientSession.coordinator.execute(queryStr, bindValues).pipe(runEffectFork);
469
+ }
470
+ // clientSession.coordinator.execute('COMMIT', undefined, undefined)
471
+ }
472
+ catch (e) {
473
+ // clientSession.syncDb.execute('ROLLBACK', undefined)
474
+ throw e;
475
+ }
476
+ finally {
477
+ isInTxn = false;
478
+ txnExecuteStmnts = [];
479
+ }
480
+ },
481
+ };
482
+ yield* Effect.tryAll(() => boot(bootDbImpl, span)).pipe(UnexpectedError.mapToUnexpectedError, Effect.withSpan('createStore:boot'));
483
+ }
484
+ const store = Store.createStore({
485
+ clientSession,
486
+ schema,
487
+ graphQLOptions,
488
+ otelOptions: { tracer: otelTracer, rootSpanContext: otelRootSpanContext },
489
+ reactivityGraph,
490
+ disableDevtools,
491
+ currentMutationEventIdRef,
492
+ unsyncedMutationEvents,
493
+ fiberSet,
494
+ runtime,
495
+ batchUpdates: batchUpdates ?? ((run) => run()),
496
+ storeId,
497
+ }, span);
498
+ yield* Deferred.succeed(storeDeferred, store);
499
+ return store;
500
+ }).pipe(Effect.withSpan('createStore', {
501
+ parent: otelOptions?.rootSpanContext
502
+ ? OtelTracer.makeExternalSpan(otel.trace.getSpanContext(otelOptions.rootSpanContext))
503
+ : undefined,
504
+ }), Effect.provide(TracingLive));
505
+ };
506
+ // #endregion createStore
507
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAE/F,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,iBAAiB,EACjB,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACjF,OAAO,EACL,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,WAAW,EACX,KAAK,EACL,MAAM,EACN,QAAQ,EACR,cAAc,EACd,UAAU,EACV,KAAK,EACL,OAAO,EACP,MAAM,EACN,KAAK,EACL,MAAM,GACP,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAG1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAGzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAA;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAmFvD,sDAAsD;AACtD,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACzD,sDAAsD;IACtD,MAAM,CAAC,mBAAmB,GAAG,YAAY,CAAA;AAC3C,CAAC;AAED,MAAM,OAAO,KAGX,SAAQ,WAAW,CAAC,KAAK;IAChB,OAAO,CAAQ;IACxB,eAAe,CAAiB;IAChC,aAAa,CAA4B;IACzC,aAAa,CAAe;IAC5B,MAAM,CAAiB;IACvB,aAAa,CAAgB;IAC7B,cAAc,CAAkB;IAChC,IAAI,CAAW;IACf;;;OAGG;IACH,SAAS,CAA2D;IAE5D,QAAQ,CAAmB;IAC3B,OAAO,CAA8B;IAE7C,oEAAoE;IACpE,aAAa,CAAqC;IAElD,sFAAsF;IAC7E,qBAAqB,CAAA;IAEtB,yBAAyB,CAAA;IACzB,sBAAsB,CAAA;IAE9B,sBAAsB;IACtB,YAAoB,EAClB,aAAa,EACb,MAAM,EACN,cAAc,EACd,eAAe,EACf,WAAW,EACX,eAAe,EACf,YAAY,EACZ,yBAAyB,EACzB,sBAAsB,EACtB,OAAO,EACP,QAAQ,EACR,OAAO,GACgC;QACvC,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAEtB,IAAI,CAAC,yBAAyB,GAAG,yBAAyB,CAAA;QAC1D,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAA;QAEpD,IAAI,CAAC,aAAa,GAAG,IAAI,0BAA0B,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,CAAA;QACpG,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QAEpB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAEtB,gBAAgB;QAChB,IAAI,CAAC,qBAAqB,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAA;QAEhE,sEAAsE;QACtE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QACnB,IAAI,CAAC,aAAa,GAAG,IAAI,mBAAmB,EAAE,CAAA;QAE9C,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,EAAE,EAAE,WAAW,CAAC,eAAe,CAAC,CAAA;QAC1G,MAAM,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAA;QAExF,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,mBAAmB,EAAE,EAAE,EAAE,WAAW,CAAC,eAAe,CAAC,CAAA;QACtG,MAAM,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAA;QAErF,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;QACtC,IAAI,CAAC,eAAe,CAAC,OAAO,GAAG;YAC7B,KAAK,EAAE,IAA6D;YACpE,UAAU,EAAE,WAAW,CAAC,MAAM;YAC9B,eAAe,EAAE,sBAAsB;YACvC,cAAc,EAAE,YAAY;SAC7B,CAAA;QAED,IAAI,CAAC,IAAI,GAAG;YACV,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,oBAAoB,EAAE,uBAAuB;YAC7C,kBAAkB,EAAE,sBAAsB;SAC3C,CAAA;QAED,wFAAwF;QACxF,wEAAwE;QACxE,MAAM,mBAAmB,GAAG,eAAe,KAAK,IAAI,CAAA;QAEpD,+FAA+F;QAC/F,MAAM,aAAa,GAAG,IAAI,GAAG;QAC3B,6FAA6F;QAC7F,8CAA8C;QAC9C,mBAAmB;YACjB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YAC3B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,iBAAiB,IAAI,CAAC,KAAK,2BAA2B,IAAI,CAAC,KAAK,4BAA4B,CAC1G,CACN,CAAA;QACD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;aAC5C,MAAM,CAAC,CAAC,CAAC,EAA2B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;aACrG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAU,CAAC,CAChE,CAAA;QACD,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;YACtC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;QAC9F,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC,MAAM,CAAA;YAC1C,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,WAAW,CAC9C,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,IAAI,CAAC,MAAM,EAChB,aAAa,CAAC,WAAW,CAAC,SAAS,CACpC,CAAA;QACH,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;YACxB,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CACtD,MAAM,CAAC,QAAQ,CAAC,CAAC,2BAA2B,EAAE,EAAE,CAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACf,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,GAAG,2BAA2B,CAAC,CAAA;YACvE,CAAC,CAAC,CACH,EACD,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAC1C,MAAM,CAAC,UAAU,CAClB,CAAA;YAED,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACf,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBACrD,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;wBACvC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;oBACtD,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAE,CAAC,GAAG,EAAE,CAAA;gBACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAE,CAAC,GAAG,EAAE,CAAA;YACzD,CAAC,CAAC,CACH,CAAA;YAED,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAA;QACrB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;IACtF,CAAC;IACD,yBAAyB;IAEzB,MAAM,CAAC,WAAW,GAAG,CACnB,YAAoD,EACpD,UAAqB,EACY,EAAE;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAA;QACjE,OAAO,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,uBAAuB,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YAChG,IAAI,CAAC;gBACH,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;YAChC,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAA;YACZ,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,CAAA;IACjD,CAAC;IAED;;;OAGG;IACH,SAAS,GAAG,CACV,MAA+B,EAC/B,UAAoC,EACpC,gBAA6B,EAC7B,OAA8F,EAChF,EAAE,CAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAC9B,qBAAqB,EACrB,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,EACnE,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,EACpD,CAAC,IAAI,EAAE,EAAE;QACP,sDAAsD;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;QAEnE,MAAM,KAAK,GAAG,aAAa,OAAO,EAAE,KAAK,EAAE,CAAA;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QAEpG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAA4B,CAAC,CAAA;QAEpD,kFAAkF;QAClF,IAAI,OAAO,EAAE,cAAc,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QAC9B,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,wDAAwD;YACxD,IAAI,CAAC;gBACH,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;gBACxC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAA4B,CAAC,CAAA;gBACvD,gBAAgB,EAAE,EAAE,CAAA;YACtB,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAA;YACZ,CAAC;QACH,CAAC,CAAA;QAED,OAAO,WAAW,CAAA;IACpB,CAAC,CACF,CAAA;IAEH,iBAAiB;IACjB,MAAM,GAiBF,CAAC,6BAAkC,EAAE,GAAG,aAAoB,EAAE,EAAE;QAClE,IAAI,eAAmD,CAAA;QACvD,IAAI,OAAuC,CAAA;QAE3C,IAAI,OAAO,6BAA6B,KAAK,UAAU,EAAE,CAAC;YACxD,uGAAuG;YACvG,eAAe,GAAG,6BAA6B,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC1F,CAAC;aAAM,IACL,6BAA6B,EAAE,KAAK,KAAK,SAAS;YAClD,6BAA6B,EAAE,WAAW,KAAK,SAAS;YACxD,6BAA6B,EAAE,cAAc,KAAK,SAAS;YAC3D,6BAA6B,EAAE,SAAS,KAAK,SAAS,EACtD,CAAC;YACD,OAAO,GAAG,6BAA6B,CAAA;YACvC,eAAe,GAAG,aAAa,CAAA;QACjC,CAAC;aAAM,IAAI,6BAA6B,KAAK,SAAS,EAAE,CAAC;YACvD,2GAA2G;YAC3G,eAAe,GAAG,EAAE,CAAA;QACtB,CAAC;aAAM,CAAC;YACN,eAAe,GAAG,CAAC,6BAA6B,EAAE,GAAG,aAAa,CAAC,CAAA;QACrE,CAAC;QAED,eAAe,GAAG,eAAe,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CACjG,CAAA;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAM;QACR,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,QAAQ,CAAA;QACxC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,KAAK,CAAA;QACjD,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,KAAK,CAAA;QACvD,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAA;QAE5C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAE,CAAA;QACzE,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAEhC,4EAA4E;QAC5E,0EAA0E;QAC1E,qBAAqB;QAErB,IAAI,UAAkB,CAAA;QAEtB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAC1C,kBAAkB,EAClB,EAAE,UAAU,EAAE,EAAE,uBAAuB,EAAE,KAAK,EAAE,EAAE,EAClD,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAC9B,CAAC,IAAI,EAAE,EAAE;YACP,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;YAEnE,IAAI,CAAC;gBACH,MAAM,WAAW,GAAgB,IAAI,GAAG,EAAE,CAAA;gBAE1C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAC9B,yBAAyB,EACzB,EAAE,UAAU,EAAE,EAAE,uBAAuB,EAAE,KAAK,EAAE,EAAE,EAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,EAC/C,CAAC,IAAI,EAAE,EAAE;oBACP,IAAI,CAAC;wBACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;wBAEnE,MAAM,cAAc,GAAG,GAAG,EAAE;4BAC1B,KAAK,MAAM,aAAa,IAAI,eAAe,EAAE,CAAC;gCAC5C,IAAI,CAAC;oCACH,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE;wCACpF,WAAW;wCACX,0GAA0G;wCAC1G,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc;qCAC9F,CAAC,CAAA;oCACF,KAAK,MAAM,SAAS,IAAI,mBAAmB,EAAE,CAAC;wCAC5C,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;oCAC5B,CAAC;gCACH,CAAC;gCAAC,OAAO,CAAM,EAAE,CAAC;oCAChB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;oCAC/B,MAAM,CAAC,CAAA;gCACT,CAAC;4BACH,CAAC;wBACH,CAAC,CAAA;wBAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC/B,uDAAuD;4BACvD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;wBACxC,CAAC;6BAAM,CAAC;4BACN,cAAc,EAAE,CAAA;wBAClB,CAAC;oBACH,CAAC;oBAAC,OAAO,CAAM,EAAE,CAAC;wBAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;wBAChB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;wBAC1E,MAAM,CAAC,CAAA;oBACT,CAAC;4BAAS,CAAC;wBACT,IAAI,CAAC,GAAG,EAAE,CAAA;oBACZ,CAAC;gBACH,CAAC,CACF,CAAA;gBAED,MAAM,cAAc,GAAG,EAAsD,CAAA;gBAC7E,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;oBACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;oBAC1C,WAAW,CAAC,QAAQ,KAAK,SAAS,EAAE,0BAA0B,SAAS,EAAE,CAAC,CAAA;oBAC1E,cAAc,CAAC,IAAI,CAAC,CAAC,QAAS,EAAE,IAAI,CAAC,CAAC,CAAA;gBACxC,CAAC;gBAED,MAAM,kBAAkB,GAAG;oBACzB,IAAI,EAAE,QAAiB;oBACvB,SAAS,EAAE,eAAe;oBAC1B,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;iBACrC,CAAA;gBAED,iFAAiF;gBACjF,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAA;YAChG,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBAChB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;gBAC1E,MAAM,CAAC,CAAA;YACT,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAA;gBAEV,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;YAC1C,CAAC;YAED,OAAO,EAAE,UAAU,EAAE,CAAA;QACvB,CAAC,CACF,CAAA;QAED,gHAAgH;QAChH,qFAAqF;QACrF,KAAK,MAAM,aAAa,IAAI,eAAe,EAAE,CAAC;YAC5C,IAAI,aAAa,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;gBACnC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAA;YAC/F,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAA;IACZ,CAAC,CAAA;IAED;;;OAGG;IACH,aAAa,GAAG,CAAC,OAA4B,EAAE,EAAE;QAC/C,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAC9B,yBAAyB,EACzB,EAAE,UAAU,EAAE,EAAE,8BAA8B,EAAE,KAAK,EAAE,EAAE,EACzD,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAC9B,CAAC,IAAI,EAAE,EAAE;YACP,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;YACnE,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAA;YACxD,IAAI,CAAC,GAAG,EAAE,CAAA;QACZ,CAAC,CACF,CAAA;IACH,CAAC,CAAA;IAED;;;;;OAKG;IACH,oBAAoB,GAAG,CACrB,qBAAiG,EACjG,OAIC,EACyD,EAAE;QAC5D,MAAM,WAAW,GACf,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,QAAQ,CAAC;YACzD,iBAAiB,CAAC,0BAA0B,qBAAqB,CAAC,QAAQ,EAAE,CAAC,CAAA;QAE/E,qEAAqE;QACrE,MAAM,mBAAmB,GAAG,GAAG,EAAE;YAC/B,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW;iBACpD,uBAAuB,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;iBACrE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAEvB,IAAI,CAAC,yBAAyB,CAAC,OAAO,GAAG,EAAE,CAAA;YAE3C,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,MAAM,oBAAoB,GAAqC,sBAAsB,CAAC,qBAAqB,CAAC;YAC1G,CAAC,CAAC,EAAE,GAAG,qBAAqB,EAAE,GAAG,mBAAmB,EAAE,EAAE;YACxD,CAAC,CAAC,qBAAqB,CAAA;QAEzB,6GAA6G;QAC7G,mCAAmC;QACnC,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC1F,sCAAsC;YACtC,OAAO,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAA;QAClD,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC,CAAA;QAC7G,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,eAAe,GAAG,SAAS,EAAE,GAAG,OAAO,CAAA;QAE5D,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CACrC,gCAAgC,EAChC;YACE,UAAU,EAAE;gBACV,oBAAoB,EAAE,oBAAoB,CAAC,QAAQ;gBACnD,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACrE;SACF,EACD,WAAW,EACX,CAAC,IAAI,EAAE,EAAE;YACP,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;YAEnE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAA;YACxC,IAAI,eAAe,GAAG,CAAC,CAAA;YAEvB,MAAM,WAAW,GAAG,uBAAuB,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,CAAA;YAElF,KAAK,MAAM,EACT,YAAY,EACZ,UAAU,EACV,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,YAAY,CAAC,GAC7D,IAAI,WAAW,EAAE,CAAC;gBACjB,sGAAsG;gBACtG,+CAA+C;gBAC/C,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;gBAEzG,eAAe,IAAI,UAAU,CAAA;gBAC7B,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;YAC3D,CAAC;YAED,MAAM,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,CAAA;YAEvG,IAAI,eAAe,KAAK,kBAAkB,EAAE,CAAC;gBAC3C,+FAA+F;gBAC/F,IAAI,CAAC,aAAa,CAAC,WAAW;qBAC3B,MAAM,CAAC,oBAAgD,EAAE,EAAE,SAAS,EAAE,eAAe,KAAK,cAAc,EAAE,CAAC;qBAC3G,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YAC7B,CAAC;YAED,yEAAyE;YACzE,uHAAuH;YAEvH,IAAI,CAAC,GAAG,EAAE,CAAA;YAEV,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,CAAA;QACrE,CAAC,CACF,CAAA;IACH,CAAC,CAAA;IACD,oBAAoB;IAEpB;;;;OAIG;IACH,SAAS,GAAG,CACV,KAAa,EACb,SAAuB,EAAE,EACzB,WAAiC,EACjC,WAA0B,EAC1B,EAAE;QACF,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAEjG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC1G,CAAC,CAAA;IAED,QAAQ,GAAG,CAAC,KAAa,EAAE,SAAuB,EAAE,EAAE,EAAE;QACtD,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;IAC3F,CAAC,CAAA;IAEO,YAAY,GAAG,CAAC,SAAiB,EAAE,EAAE,CAC3C,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE;QACjC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK;QAClB,KAAK,EAAE,YAAY,SAAS,EAAE;QAC9B,IAAI,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE;KACpC,CAAC,CAAA;IAEJ,eAAe,GAAG,GAAG,EAAE;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAA;QACxC,YAAY,CAAC,IAAI,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAClD,CAAC,CAAA;IAED,0BAA0B,GAAG,GAAG,EAAE,CAChC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,kBAAkB,CAAA;QACrE,YAAY,CAAC,IAAI,EAAE,yBAAyB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAE7B,0GAA0G;IAC1G,MAAM,GAAG,GAAG,EAAE;QACZ,OAAO;YACL,IAAI,EAAE,OAAO;YACb,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;SAC5E,CAAA;IACH,CAAC,CAAA;IAEO,aAAa,GAAG,CAAO,MAAkC,EAAE,EAAE,CACnE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;;AAgBrG,mCAAmC;AACnC,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAGrC,EACA,MAAM,EACN,GAAG,OAAO,EAC8D,EAA4C,EAAE,CACtH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAEvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACpC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;QACxF,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAChC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,EACnE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CACpB,CAAA;AACH,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAC9B,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EACzC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAC7B,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC1C,MAAM,CAAC,UAAU,CAClB,CAAA;AAEH,sBAAsB;AACtB,MAAM,CAAC,MAAM,WAAW,GAAG,CAGzB,EACA,MAAM,EACN,OAAO,EACP,OAAO,EACP,cAAc,EACd,WAAW,EACX,IAAI,EACJ,eAAe,GAAG,qBAAqB,EACvC,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,QAAQ,GACuE,EAI/E,EAAE;IACF,MAAM,UAAU,GAAG,WAAW,EAAE,MAAM,IAAI,cAAc,EAAE,CAAA;IAC1D,MAAM,mBAAmB,GAAG,WAAW,EAAE,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;IAEjF,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CACvF,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAC/D,CAAA;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAEjE,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,EAAc,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;QAExG,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CACrC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,EAClD,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EACjG,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,UAAU,CAClB,CAAA;QAED,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAS,CAAA;QAEnD,MAAM,uBAAuB,GAAG,CAAC,oBAA0C,EAAE,EAAE,CAC7E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;YAClD,KAAK,CAAC,CAAC,sBAAsB,CAAC,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QAEJ,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAe,CAAA;QAEpD,MAAM,aAAa,GAAG,CAAC,MAAsC,EAAE,EAAE,CAC/D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;QAEzF,wDAAwD;QACxD,MAAM,QAAQ,GAAG,CAAC,KAA8D,EAAE,EAAE,CAClF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,sGAAsG;YACtG,MAAM,QAAQ,GACZ,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,oCAAoC;gBAClF,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE;gBAClB,CAAC,CAAC,KAAK,CAAA;YACX,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAA;YAE3D,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC3B,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EACrE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EACnC,MAAM,CAAC,wBAAwB,CAAC,EAAE,KAAK,EAAE,+CAA+C,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAC1G,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,GAAG,EAAE,EAAE,CAC1C,MAAM,CAAC,QAAQ,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAC,IAAI,CACtE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAChE,CACF,EACD,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CACzB,CAAA;QACH,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAA;QAEhD,MAAM,aAAa,GAAkB,KAAK,CAAC,CAAC,OAAO,CAAC;YAClD,MAAM;YACN,OAAO;YACP,eAAe,EAAE,eAAe,KAAK,IAAI;YACzC,eAAe;YACf,QAAQ;YACR,sBAAsB,EAAE,uBAAuB;SAChD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAA;QAE3G,MAAM,mBAAmB,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAA;QAE/D,uBAAuB;QACvB,mDAAmD;QAEnD,MAAM,yBAAyB,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,yBAAyB,EAAE,CAAA;QAEzG,kEAAkE;QAClE,MAAM,sBAAsB,GAAG,cAAc,CAAC,KAAK,EAA6C,CAAA;QAEhG,wDAAwD;QACxD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,OAAO,GAAG,KAAK,CAAA;YACnB,IAAI,gBAAgB,GAA+C,EAAE,CAAA;YAErE,MAAM,UAAU,GAAW;gBACzB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE;oBAChC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;oBACnD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;oBAExB,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;wBACrB,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA;oBAC/C,CAAC;yBAAM,CAAC;wBACN,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;oBAC7E,CAAC;gBACH,CAAC;gBACD,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;oBAClB,KAAK,MAAM,qBAAqB,IAAI,IAAI,EAAE,CAAC;wBACzC,MAAM,WAAW,GACf,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,QAAQ,CAAC;4BACpD,iBAAiB,CAAC,0BAA0B,qBAAqB,CAAC,QAAQ,EAAE,CAAC,CAAA;wBAE/E,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,WAAW;6BAC/C,uBAAuB,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;6BACrE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;wBAEvB,yBAAyB,CAAC,OAAO,GAAG,EAAE,CAAA;wBAEtC,MAAM,oBAAoB,GAAG,EAAE,GAAG,qBAAqB,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAA;wBAEvE,cAAc,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC,CAAA;wBAEtG,6DAA6D;wBAE7D,MAAM,WAAW,GAAG,uBAAuB,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,CAAA;wBAClF,sGAAsG;wBAEtG,KAAK,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,WAAW,EAAE,CAAC;4BACvD,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;wBACxD,CAAC;wBAED,MAAM,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,oBAAoB,CAAC,CAAA;wBAEhG,aAAa,CAAC,WAAW;6BACtB,MAAM,CAAC,oBAAgD,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;6BAC7E,IAAI,CAAC,aAAa,CAAC,CAAA;oBACxB,CAAC;gBACH,CAAC;gBACD,MAAM,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE;oBAC/B,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;oBACnD,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;gBAChC,CAAC;gBACD,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;oBAChB,IAAI,CAAC;wBACH,OAAO,GAAG,IAAI,CAAA;wBACd,+DAA+D;wBAE/D,QAAQ,EAAE,CAAA;wBAEV,oDAAoD;wBAEpD,mEAAmE;wBACnE,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,gBAAgB,EAAE,CAAC;4BACtD,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;wBAC7E,CAAC;wBACD,oEAAoE;oBACtE,CAAC;oBAAC,OAAO,CAAM,EAAE,CAAC;wBAChB,sDAAsD;wBACtD,MAAM,CAAC,CAAA;oBACT,CAAC;4BAAS,CAAC;wBACT,OAAO,GAAG,KAAK,CAAA;wBACf,gBAAgB,GAAG,EAAE,CAAA;oBACvB,CAAC;gBACH,CAAC;aACF,CAAA;YAED,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CACrD,eAAe,CAAC,oBAAoB,EACpC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CACpC,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAC7B;YACE,aAAa;YACb,MAAM;YACN,cAAc;YACd,WAAW,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,EAAE;YACzE,eAAe;YACf,eAAe;YACf,yBAAyB;YACzB,sBAAsB;YACtB,QAAQ;YACR,OAAO;YACP,YAAY,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;YAC9C,OAAO;SACR,EACD,IAAI,CACL,CAAA;QAED,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,KAAqB,CAAC,CAAA;QAE7D,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE;QAC7B,MAAM,EAAE,WAAW,EAAE,eAAe;YAClC,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,eAAe,CAAE,CAAC;YACtF,CAAC,CAAC,SAAS;KACd,CAAC,EACF,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAC5B,CAAA;AACH,CAAC,CAAA;AACD,yBAAyB"}
@@ -0,0 +1,10 @@
1
+ export declare class ReferenceCountedSet<T> {
2
+ private map;
3
+ constructor();
4
+ add: (key: T) => void;
5
+ remove: (key: T) => void;
6
+ has: (key: T) => boolean;
7
+ get size(): number;
8
+ [Symbol.iterator](): Generator<T, void, unknown>;
9
+ }
10
+ //# sourceMappingURL=data-structures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-structures.d.ts","sourceRoot":"","sources":["../../src/utils/data-structures.ts"],"names":[],"mappings":"AACA,qBAAa,mBAAmB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAgB;;IAM3B,GAAG,QAAS,CAAC,UAGZ;IAED,MAAM,QAAS,CAAC,UAOf;IAED,GAAG,QAAS,CAAC,aAEZ;IAED,IAAI,IAAI,WAEP;IAEA,CAAC,MAAM,CAAC,QAAQ,CAAC;CAKnB"}
@@ -0,0 +1,32 @@
1
+ // TODO consider replacing with Effect's RC data structures
2
+ export class ReferenceCountedSet {
3
+ map;
4
+ constructor() {
5
+ this.map = new Map();
6
+ }
7
+ add = (key) => {
8
+ const count = this.map.get(key) ?? 0;
9
+ this.map.set(key, count + 1);
10
+ };
11
+ remove = (key) => {
12
+ const count = this.map.get(key) ?? 0;
13
+ if (count === 1) {
14
+ this.map.delete(key);
15
+ }
16
+ else {
17
+ this.map.set(key, count - 1);
18
+ }
19
+ };
20
+ has = (key) => {
21
+ return this.map.has(key);
22
+ };
23
+ get size() {
24
+ return this.map.size;
25
+ }
26
+ *[Symbol.iterator]() {
27
+ for (const key of this.map.keys()) {
28
+ yield key;
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=data-structures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-structures.js","sourceRoot":"","sources":["../../src/utils/data-structures.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,OAAO,mBAAmB;IACtB,GAAG,CAAgB;IAE3B;QACE,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,EAAa,CAAA;IACjC,CAAC;IAED,GAAG,GAAG,CAAC,GAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;IAC9B,CAAC,CAAA;IAED,MAAM,GAAG,CAAC,GAAM,EAAE,EAAE;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC,CAAA;IAED,GAAG,GAAG,CAAC,GAAM,EAAE,EAAE;QACf,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC,CAAA;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAA;IACtB,CAAC;IAED,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export declare const downloadBlob: (data: Uint8Array | Blob | string, fileName: string, mimeType?: string) => void;
2
+ export declare const downloadURL: (data: string, fileName: string) => void;
3
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/utils/dev.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,YAAY,SACjB,UAAU,GAAG,IAAI,GAAG,MAAM,YACtB,MAAM,4BAUjB,CAAA;AAED,eAAO,MAAM,WAAW,SAAU,MAAM,YAAY,MAAM,SAQzD,CAAA"}
@@ -0,0 +1,17 @@
1
+ /* eslint-disable unicorn/prefer-global-this */
2
+ export const downloadBlob = (data, fileName, mimeType = 'application/octet-stream') => {
3
+ const blob = data instanceof Blob ? data : new Blob([data], { type: mimeType });
4
+ const url = window.URL.createObjectURL(blob);
5
+ downloadURL(url, fileName);
6
+ setTimeout(() => window.URL.revokeObjectURL(url), 1000);
7
+ };
8
+ export const downloadURL = (data, fileName) => {
9
+ const a = document.createElement('a');
10
+ a.href = data;
11
+ a.download = fileName;
12
+ document.body.append(a);
13
+ a.style.display = 'none';
14
+ a.click();
15
+ a.remove();
16
+ };
17
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/utils/dev.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,IAAgC,EAChC,QAAgB,EAChB,QAAQ,GAAG,0BAA0B,EACrC,EAAE;IACF,MAAM,IAAI,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;IAE/E,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAE5C,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IAE1B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;AACzD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,EAAE;IAC5D,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACrC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAA;IACb,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAA;IACrB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACvB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAA;IACxB,CAAC,CAAC,KAAK,EAAE,CAAA;IACT,CAAC,CAAC,MAAM,EAAE,CAAA;AACZ,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type * as otel from '@opentelemetry/api';
2
+ export declare const getDurationMsFromSpan: (span: otel.Span) => number;
3
+ export declare const getStartTimeHighResFromSpan: (span: otel.Span) => DOMHighResTimeStamp;
4
+ //# sourceMappingURL=otel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../../src/utils/otel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,eAAO,MAAM,qBAAqB,SAAU,IAAI,CAAC,IAAI,KAAG,MAGvD,CAAA;AAED,eAAO,MAAM,2BAA2B,SAAU,IAAI,CAAC,IAAI,KAAG,mBACF,CAAA"}