flightdeck 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lib.js CHANGED
@@ -1,3684 +1,11 @@
1
1
  // src/flightdeck.ts
2
- import {execSync, spawn as spawn2} from "node:child_process";
2
+ import {execSync, spawn} from "node:child_process";
3
3
  import {existsSync, mkdirSync, renameSync, rmSync} from "node:fs";
4
4
  import {createServer} from "node:http2";
5
5
  import {homedir} from "node:os";
6
6
  import {resolve} from "node:path";
7
-
8
- // ../atom.io/internal/src/arbitrary.ts
9
- function arbitrary(random = Math.random) {
10
- return random().toString(36).slice(2);
11
- }
12
- // ../atom.io/internal/src/future.ts
13
- class Future extends Promise {
14
- fate;
15
- resolve;
16
- reject;
17
- constructor(executor) {
18
- let superResolve;
19
- let superReject;
20
- super((resolve, reject) => {
21
- superResolve = resolve;
22
- superReject = reject;
23
- });
24
- this.resolve = superResolve;
25
- this.reject = superReject;
26
- this.use(executor instanceof Promise ? executor : new Promise(executor));
27
- }
28
- pass(promise, value) {
29
- if (promise === this.fate) {
30
- this.resolve(value);
31
- }
32
- }
33
- fail(promise, reason) {
34
- if (promise === this.fate) {
35
- this.reject(reason);
36
- }
37
- }
38
- use(value) {
39
- if (value instanceof Promise) {
40
- const promise = value;
41
- this.fate = promise;
42
- promise.then((resolved) => {
43
- this.pass(promise, resolved);
44
- }, (reason) => {
45
- this.fail(promise, reason);
46
- });
47
- } else {
48
- this.resolve(value);
49
- this.fate = undefined;
50
- }
51
- }
52
- }
53
- // ../atom.io/json/src/select-json.ts
54
- var selectJson = (atom, transform, store = IMPLICIT.STORE) => {
55
- return createStandaloneSelector(store, {
56
- key: `${atom.key}:JSON`,
57
- get: ({ get }) => transform.toJson(get(atom)),
58
- set: ({ set }, newValue) => {
59
- set(atom, transform.fromJson(newValue));
60
- }
61
- });
62
- };
63
- // ../atom.io/internal/src/lineage.ts
64
- function newest(scion) {
65
- while (scion.child !== null) {
66
- scion = scion.child;
67
- }
68
- return scion;
69
- }
70
- function eldest(scion) {
71
- while (scion.parent !== null) {
72
- scion = scion.parent;
73
- }
74
- return scion;
75
- }
76
-
77
- // ../atom.io/internal/src/subject.ts
78
- class Subject {
79
- Subscriber;
80
- subscribers = new Map;
81
- subscribe(key, subscriber) {
82
- this.subscribers.set(key, subscriber);
83
- const unsubscribe = () => {
84
- this.unsubscribe(key);
85
- };
86
- return unsubscribe;
87
- }
88
- unsubscribe(key) {
89
- this.subscribers.delete(key);
90
- }
91
- next(value) {
92
- const subscribers = this.subscribers.values();
93
- for (const subscriber of subscribers) {
94
- subscriber(value);
95
- }
96
- }
97
- }
98
-
99
- class StatefulSubject extends Subject {
100
- state;
101
- constructor(initialState) {
102
- super();
103
- this.state = initialState;
104
- }
105
- next(value) {
106
- this.state = value;
107
- super.next(value);
108
- }
109
- }
110
-
111
- // ../atom.io/internal/src/families/create-regular-atom-family.ts
112
- function createRegularAtomFamily(store, options, internalRoles) {
113
- const familyToken = {
114
- key: options.key,
115
- type: `atom_family`
116
- };
117
- const existing = store.families.get(options.key);
118
- if (existing) {
119
- store.logger.error(`\u2757`, `atom_family`, options.key, `Overwriting an existing ${prettyPrintTokenType(existing)} "${existing.key}" in store "${store.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);
120
- }
121
- const subject2 = new Subject;
122
- const familyFunction = (key) => {
123
- const subKey = stringifyJson(key);
124
- const family = { key: options.key, subKey };
125
- const fullKey = `${options.key}(${subKey})`;
126
- const target = newest(store);
127
- const def = options.default;
128
- const individualOptions = {
129
- key: fullKey,
130
- default: def instanceof Function ? def(key) : def
131
- };
132
- if (options.effects) {
133
- individualOptions.effects = options.effects(key);
134
- }
135
- const token = createRegularAtom(target, individualOptions, family);
136
- subject2.next({ type: `state_creation`, token });
137
- return token;
138
- };
139
- const atomFamily = Object.assign(familyFunction, familyToken, {
140
- subject: subject2,
141
- install: (s) => createRegularAtomFamily(s, options),
142
- internalRoles
143
- });
144
- store.families.set(options.key, atomFamily);
145
- store.defaults.set(options.key, options.default);
146
- return familyToken;
147
- }
148
-
149
- // ../atom.io/internal/src/families/create-atom-family.ts
150
- function createAtomFamily(store, options) {
151
- const isMutable = `mutable` in options;
152
- if (isMutable) {
153
- return createMutableAtomFamily(store, options);
154
- }
155
- return createRegularAtomFamily(store, options);
156
- }
157
- // ../atom.io/internal/src/families/create-readonly-selector-family.ts
158
- function createReadonlySelectorFamily(store, options, internalRoles) {
159
- const familyToken = {
160
- key: options.key,
161
- type: `readonly_selector_family`
162
- };
163
- const existing = store.families.get(options.key);
164
- if (existing) {
165
- store.logger.error(`\u2757`, `readonly_selector_family`, options.key, `Overwriting an existing ${prettyPrintTokenType(existing)} "${existing.key}" in store "${store.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);
166
- }
167
- const subject3 = new Subject;
168
- const familyFunction = (key) => {
169
- const subKey = stringifyJson(key);
170
- const family = { key: options.key, subKey };
171
- const fullKey = `${options.key}(${subKey})`;
172
- const target = newest(store);
173
- const token = createReadonlySelector(target, {
174
- key: fullKey,
175
- get: options.get(key)
176
- }, family);
177
- subject3.next({ type: `state_creation`, token });
178
- return token;
179
- };
180
- const readonlySelectorFamily = Object.assign(familyFunction, familyToken, {
181
- internalRoles,
182
- subject: subject3,
183
- install: (s) => createReadonlySelectorFamily(s, options),
184
- default: (key) => {
185
- const getFn = options.get(key);
186
- return getFn({
187
- get: (...ps) => getFromStore(store, ...ps),
188
- find: (token, k) => findInStore(store, token, k),
189
- seek: (token, k) => seekInStore(store, token, k),
190
- json: (token) => getJsonToken(store, token)
191
- });
192
- }
193
- });
194
- store.families.set(options.key, readonlySelectorFamily);
195
- return familyToken;
196
- }
197
- // ../atom.io/internal/src/families/create-selector-family.ts
198
- function createSelectorFamily(store, options) {
199
- const isWritable = `set` in options;
200
- if (isWritable) {
201
- return createWritableSelectorFamily(store, options);
202
- }
203
- return createReadonlySelectorFamily(store, options);
204
- }
205
- // ../atom.io/internal/src/store/counterfeit.ts
206
- function counterfeit(token, key) {
207
- const subKey = stringifyJson(key);
208
- const fullKey = `${token.key}(${subKey})`;
209
- const type = FAMILY_MEMBER_TOKEN_TYPES[token.type];
210
- const stateToken = {
211
- key: fullKey,
212
- type
213
- };
214
- if (type === `molecule`) {
215
- Object.assign(stateToken, {
216
- key,
217
- family: token
218
- });
219
- } else {
220
- Object.assign(stateToken, {
221
- family: {
222
- key: token.key,
223
- subKey
224
- }
225
- });
226
- }
227
- Object.assign(stateToken, { counterfeit: true });
228
- return stateToken;
229
- }
230
- var FAMILY_MEMBER_TOKEN_TYPES = {
231
- atom_family: `atom`,
232
- mutable_atom_family: `mutable_atom`,
233
- selector_family: `selector`,
234
- readonly_selector_family: `readonly_selector`,
235
- molecule_family: `molecule`
236
- };
237
- // ../atom.io/internal/src/store/deposit.ts
238
- function deposit(state) {
239
- const token = {
240
- key: state.key,
241
- type: state.type
242
- };
243
- if (`family` in state) {
244
- token.family = state.family;
245
- }
246
- return token;
247
- }
248
- // ../atom.io/src/atom.ts
249
- function atom2(options) {
250
- return createStandaloneAtom(IMPLICIT.STORE, options);
251
- }
252
- function atomFamily(options) {
253
- return createAtomFamily(IMPLICIT.STORE, options);
254
- }
255
-
256
- // ../atom.io/src/logger.ts
257
- var simpleLog = (logLevel) => (icon, denomination, tokenKey, message, ...rest) => {
258
- console[logLevel](`${icon} ${denomination} "${tokenKey}" ${message}`, ...rest);
259
- };
260
- var simpleLogger = {
261
- error: simpleLog(`error`),
262
- info: simpleLog(`info`),
263
- warn: simpleLog(`warn`)
264
- };
265
-
266
- class AtomIOLogger {
267
- logLevel;
268
- filter;
269
- logger;
270
- constructor(logLevel, filter, logger = simpleLogger) {
271
- this.logLevel = logLevel;
272
- this.filter = filter;
273
- this.logger = logger;
274
- }
275
- error = (...args) => {
276
- if ((this.filter?.(...args) ?? true) && this.logLevel !== null) {
277
- this.logger.error(...args);
278
- }
279
- };
280
- info = (...args) => {
281
- if ((this.filter?.(...args) ?? true) && this.logLevel === `info`) {
282
- this.logger.info(...args);
283
- }
284
- };
285
- warn = (...args) => {
286
- if ((this.filter?.(...args) ?? true) && this.logLevel !== `error` && this.logLevel !== null) {
287
- this.logger.warn(...args);
288
- }
289
- };
290
- }
291
-
292
- // ../atom.io/src/selector.ts
293
- function selectorFamily(options) {
294
- return createSelectorFamily(IMPLICIT.STORE, options);
295
- }
296
-
297
- // ../atom.io/src/transaction.ts
298
- function transaction(options) {
299
- return createTransaction(options, IMPLICIT.STORE);
300
- }
301
-
302
- // ../rel8/junction/src/junction.ts
303
- class Junction {
304
- a;
305
- b;
306
- cardinality;
307
- relations = new Map;
308
- contents = new Map;
309
- isContent;
310
- makeContentKey = (a, b) => `${a}:${b}`;
311
- getRelatedKeys(key) {
312
- return this.relations.get(key);
313
- }
314
- addRelation(a, b) {
315
- let aRelations = this.relations.get(a);
316
- let bRelations = this.relations.get(b);
317
- if (aRelations) {
318
- aRelations.add(b);
319
- } else {
320
- aRelations = new Set([b]);
321
- this.relations.set(a, aRelations);
322
- }
323
- if (bRelations) {
324
- bRelations.add(a);
325
- } else {
326
- bRelations = new Set([a]);
327
- this.relations.set(b, bRelations);
328
- }
329
- }
330
- deleteRelation(a, b) {
331
- const aRelations = this.relations.get(a);
332
- if (aRelations) {
333
- aRelations.delete(b);
334
- if (aRelations.size === 0) {
335
- this.relations.delete(a);
336
- }
337
- const bRelations = this.relations.get(b);
338
- if (bRelations) {
339
- bRelations.delete(a);
340
- if (bRelations.size === 0) {
341
- this.relations.delete(b);
342
- }
343
- }
344
- }
345
- }
346
- replaceRelationsUnsafely(a, bs) {
347
- this.relations.set(a, new Set(bs));
348
- for (const b of bs) {
349
- const bRelations = new Set([a]);
350
- this.relations.set(b, bRelations);
351
- }
352
- }
353
- replaceRelationsSafely(a, bs) {
354
- const aRelationsPrev = this.relations.get(a);
355
- if (aRelationsPrev) {
356
- for (const b of aRelationsPrev) {
357
- const bRelations = this.relations.get(b);
358
- if (bRelations) {
359
- if (bRelations.size === 1) {
360
- this.relations.delete(b);
361
- } else {
362
- bRelations.delete(a);
363
- }
364
- this.contents.delete(this.makeContentKey(a, b));
365
- }
366
- }
367
- }
368
- this.relations.set(a, new Set(bs));
369
- for (const b of bs) {
370
- let bRelations = this.relations.get(b);
371
- if (bRelations) {
372
- bRelations.add(a);
373
- } else {
374
- bRelations = new Set([a]);
375
- this.relations.set(b, bRelations);
376
- }
377
- }
378
- }
379
- getContentInternal(contentKey) {
380
- return this.contents.get(contentKey);
381
- }
382
- setContent(contentKey, content) {
383
- this.contents.set(contentKey, content);
384
- }
385
- deleteContent(contentKey) {
386
- this.contents.delete(contentKey);
387
- }
388
- constructor(data, config) {
389
- this.a = data.between[0];
390
- this.b = data.between[1];
391
- this.cardinality = data.cardinality;
392
- if (!config?.externalStore) {
393
- this.relations = new Map(data.relations?.map(([a, b]) => [a, new Set(b)]));
394
- this.contents = new Map(data.contents);
395
- }
396
- this.isContent = config?.isContent ?? null;
397
- if (config?.makeContentKey) {
398
- this.makeContentKey = config.makeContentKey;
399
- }
400
- if (config?.externalStore) {
401
- const externalStore = config.externalStore;
402
- this.has = (a, b) => externalStore.has(a, b);
403
- this.addRelation = (a, b) => {
404
- externalStore.addRelation(a, b);
405
- };
406
- this.deleteRelation = (a, b) => {
407
- externalStore.deleteRelation(a, b);
408
- };
409
- this.replaceRelationsSafely = (a, bs) => {
410
- externalStore.replaceRelationsSafely(a, bs);
411
- };
412
- this.replaceRelationsUnsafely = (a, bs) => {
413
- externalStore.replaceRelationsUnsafely(a, bs);
414
- };
415
- this.getRelatedKeys = (key) => externalStore.getRelatedKeys(key);
416
- if (externalStore.getContent) {
417
- this.getContentInternal = (contentKey) => {
418
- return externalStore.getContent(contentKey);
419
- };
420
- this.setContent = (contentKey, content) => {
421
- externalStore.setContent(contentKey, content);
422
- };
423
- this.deleteContent = (contentKey) => {
424
- externalStore.deleteContent(contentKey);
425
- };
426
- }
427
- for (const [x, ys] of data.relations ?? []) {
428
- for (const y of ys)
429
- this.addRelation(x, y);
430
- }
431
- for (const [contentKey, content] of data.contents ?? []) {
432
- this.setContent(contentKey, content);
433
- }
434
- }
435
- }
436
- toJSON() {
437
- return {
438
- between: [this.a, this.b],
439
- cardinality: this.cardinality,
440
- relations: [...this.relations.entries()].map(([a, b]) => [a, [...b]]),
441
- contents: [...this.contents.entries()]
442
- };
443
- }
444
- set(a, ...rest) {
445
- const b = typeof rest[0] === `string` ? rest[0] : a[this.b];
446
- const content = rest[1] ?? typeof rest[0] === `string` ? undefined : rest[0];
447
- a = typeof a === `string` ? a : a[this.a];
448
- switch (this.cardinality) {
449
- case `1:1`: {
450
- const bPrev = this.getRelatedKey(a);
451
- if (bPrev && bPrev !== b)
452
- this.delete(bPrev, a);
453
- }
454
- case `1:n`: {
455
- const aPrev = this.getRelatedKey(b);
456
- if (aPrev && aPrev !== a)
457
- this.delete(aPrev, b);
458
- }
459
- }
460
- if (content) {
461
- const contentKey = this.makeContentKey(a, b);
462
- this.setContent(contentKey, content);
463
- }
464
- this.addRelation(a, b);
465
- return this;
466
- }
467
- delete(x, b) {
468
- b = typeof b === `string` ? b : x[this.b];
469
- const a = typeof x === `string` ? x : x[this.a];
470
- if (a === undefined && typeof b === `string`) {
471
- const bRelations = this.getRelatedKeys(b);
472
- if (bRelations) {
473
- for (const bRelation of bRelations) {
474
- this.delete(bRelation, b);
475
- }
476
- }
477
- }
478
- if (typeof a === `string` && b === undefined) {
479
- const aRelations = this.getRelatedKeys(a);
480
- if (aRelations) {
481
- for (const aRelation of aRelations) {
482
- this.delete(a, aRelation);
483
- }
484
- }
485
- }
486
- if (typeof a === `string` && typeof b === `string`) {
487
- this.deleteRelation(a, b);
488
- const contentKey = this.makeContentKey(a, b);
489
- this.deleteContent(contentKey);
490
- }
491
- return this;
492
- }
493
- getRelatedKey(key) {
494
- const relations = this.getRelatedKeys(key);
495
- if (relations) {
496
- if (relations.size > 1) {
497
- console.warn(`${relations.size} related keys were found for key "${key}": (${[
498
- ...relations
499
- ].map((k) => `"${k}"`).join(`, `)}). Only one related key was expected.`);
500
- }
501
- for (const relation of relations) {
502
- return relation;
503
- }
504
- }
505
- }
506
- replaceRelations(a, relations, config) {
507
- const hasContent = !Array.isArray(relations);
508
- const bs = hasContent ? Object.keys(relations) : relations;
509
- if (config?.reckless) {
510
- this.replaceRelationsUnsafely(a, bs);
511
- } else {
512
- this.replaceRelationsSafely(a, bs);
513
- }
514
- if (hasContent) {
515
- for (const b of bs) {
516
- const contentKey = this.makeContentKey(a, b);
517
- const content = relations[b];
518
- this.setContent(contentKey, content);
519
- }
520
- }
521
- return this;
522
- }
523
- getContent(a, b) {
524
- const contentKey = this.makeContentKey(a, b);
525
- return this.getContentInternal(contentKey);
526
- }
527
- getRelationEntries(input) {
528
- const a = input[this.a];
529
- const b = input[this.b];
530
- if (a !== undefined && b === undefined) {
531
- const aRelations = this.getRelatedKeys(a);
532
- if (aRelations) {
533
- return [...aRelations].map((aRelation) => {
534
- return [aRelation, this.getContent(a, aRelation) ?? null];
535
- });
536
- }
537
- }
538
- if (a === undefined && b !== undefined) {
539
- const bRelations = this.getRelatedKeys(b);
540
- if (bRelations) {
541
- return [...bRelations].map((bRelation) => {
542
- return [bRelation, this.getContent(bRelation, b) ?? null];
543
- });
544
- }
545
- }
546
- return [];
547
- }
548
- has(a, b) {
549
- if (b) {
550
- const setA = this.getRelatedKeys(a);
551
- return setA?.has(b) ?? false;
552
- }
553
- return this.relations.has(a);
554
- }
555
- }
556
- // ../atom.io/internal/src/transaction/is-root-store.ts
557
- function isRootStore(store) {
558
- return `epoch` in store.transactionMeta;
559
- }
560
- function isChildStore(store) {
561
- return `phase` in store.transactionMeta;
562
- }
563
-
564
- // ../atom.io/internal/src/transaction/abort-transaction.ts
565
- var abortTransaction = (store) => {
566
- const target = newest(store);
567
- if (!isChildStore(target)) {
568
- store.logger.warn(`\uD83D\uDC1E`, `transaction`, `???`, `abortTransaction called outside of a transaction. This is probably a bug in AtomIO.`);
569
- return;
570
- }
571
- store.logger.info(`\uD83E\uDE82`, `transaction`, target.transactionMeta.update.key, `Aborting transaction`);
572
- target.parent.child = null;
573
- };
574
- // ../atom.io/internal/src/pretty-print.ts
575
- function prettyPrintTokenType(token) {
576
- return token.type.split(`_`).map(capitalize).join(` `);
577
- }
578
- var capitalize = (str) => str[0].toUpperCase() + str.slice(1);
579
-
580
- // ../atom.io/internal/src/not-found-error.ts
581
- class NotFoundError extends Error {
582
- constructor(...params) {
583
- const token = params[0];
584
- const store = params.length === 2 ? params[1] : params[2];
585
- if (params.length === 2) {
586
- super(`${prettyPrintTokenType(token)} ${stringifyJson(token.key)} not found in store "${store.config.name}".`);
587
- } else {
588
- const key = params[1];
589
- super(`${prettyPrintTokenType(token)} "${token.key}" member ${stringifyJson(key)} not found in store "${store.config.name}".`);
590
- }
591
- }
592
- }
593
-
594
- // ../atom.io/internal/src/transaction/act-upon-store.ts
595
- function actUponStore(token, id, store2) {
596
- return (...parameters) => {
597
- const tx = withdraw(token, store2);
598
- if (tx) {
599
- return tx.run(parameters, id);
600
- }
601
- throw new NotFoundError(token, store2);
602
- };
603
- }
604
- // ../atom.io/internal/src/set-state/become.ts
605
- var become = (nextVersionOfThing) => (originalThing) => nextVersionOfThing instanceof Function ? nextVersionOfThing(originalThing) : nextVersionOfThing;
606
- // ../atom.io/internal/src/get-state/read-or-compute-value.ts
607
- var readOrComputeValue = (state, target) => {
608
- if (target.valueMap.has(state.key)) {
609
- target.logger.info(`\uD83D\uDCD6`, state.type, state.key, `reading cached value`);
610
- return readCachedValue(state, target);
611
- }
612
- if (state.type === `selector` || state.type === `readonly_selector`) {
613
- target.logger.info(`\uD83E\uDDEE`, state.type, state.key, `computing value`);
614
- return state.get();
615
- }
616
- const fallback = state.default instanceof Function ? state.default() : state.default;
617
- target.logger.info(`\uD83D\uDC81`, `atom`, state.key, `could not find cached value; using default`, fallback);
618
- return state.default instanceof Function ? state.default() : state.default;
619
- };
620
-
621
- // ../atom.io/internal/src/operation.ts
622
- var openOperation = (store2, token) => {
623
- if (store2.operation.open) {
624
- const rejectionTime = performance.now();
625
- store2.logger.info(`\u2757`, token.type, token.key, `deferring setState at T-${rejectionTime} until setState for "${store2.operation.token.key}" is done`);
626
- return rejectionTime;
627
- }
628
- store2.operation = {
629
- open: true,
630
- done: new Set,
631
- prev: new Map,
632
- time: Date.now(),
633
- token
634
- };
635
- store2.logger.info(`\u2B55`, token.type, token.key, `operation start in store "${store2.config.name}"${!isChildStore(store2) ? `` : ` ${store2.transactionMeta.phase} "${store2.transactionMeta.update.key}"`}`);
636
- };
637
- var closeOperation = (store2) => {
638
- if (store2.operation.open) {
639
- store2.logger.info(`\uD83D\uDD34`, store2.operation.token.type, store2.operation.token.key, `operation done in store "${store2.config.name}"`);
640
- }
641
- store2.operation = { open: false };
642
- store2.on.operationClose.next(store2.operation);
643
- };
644
- var isDone = (store2, key) => {
645
- if (!store2.operation.open) {
646
- store2.logger.error(`\uD83D\uDC1E`, `unknown`, key, `isDone called outside of an operation. This is probably a bug in AtomIO.`);
647
- return true;
648
- }
649
- return store2.operation.done.has(key);
650
- };
651
- var markDone = (store2, key) => {
652
- if (!store2.operation.open) {
653
- store2.logger.error(`\uD83D\uDC1E`, `unknown`, key, `markDone called outside of an operation. This is probably a bug in AtomIO.`);
654
- return;
655
- }
656
- store2.operation.done.add(key);
657
- };
658
-
659
- // ../atom.io/internal/src/set-state/emit-update.ts
660
- var emitUpdate = (state, update, store2) => {
661
- switch (state.type) {
662
- case `mutable_atom`:
663
- store2.logger.info(`\uD83D\uDCE2`, state.type, state.key, `is now (`, update.newValue, `) subscribers:`, state.subject.subscribers);
664
- break;
665
- default:
666
- store2.logger.info(`\uD83D\uDCE2`, state.type, state.key, `went (`, update.oldValue, `->`, update.newValue, `) subscribers:`, state.subject.subscribers);
667
- }
668
- state.subject.next(update);
669
- };
670
-
671
- // ../atom.io/internal/src/set-state/evict-downstream.ts
672
- var evictDownStream = (atom3, store2) => {
673
- const target = newest(store2);
674
- const downstreamKeys = target.selectorAtoms.getRelatedKeys(atom3.key);
675
- target.logger.info(`\uD83E\uDDF9`, atom3.type, atom3.key, downstreamKeys ? `evicting ${downstreamKeys.size} states downstream:` : `no downstream states`, downstreamKeys ?? `to evict`);
676
- if (downstreamKeys) {
677
- if (target.operation.open) {
678
- target.logger.info(`\uD83E\uDDF9`, atom3.type, atom3.key, `[ ${[...target.operation.done].join(`, `)} ] already done`);
679
- }
680
- for (const key of downstreamKeys) {
681
- if (isDone(target, key)) {
682
- continue;
683
- }
684
- evictCachedValue(key, target);
685
- markDone(target, key);
686
- }
687
- }
688
- };
689
-
690
- // ../atom.io/internal/src/set-state/stow-update.ts
691
- function shouldUpdateBeStowed(key, update) {
692
- if (isTransceiver(update.newValue)) {
693
- return false;
694
- }
695
- if (key.includes(`\uD83D\uDD0D`)) {
696
- return false;
697
- }
698
- return true;
699
- }
700
- var stowUpdate = (state, update, store2) => {
701
- const { key } = state;
702
- const target = newest(store2);
703
- if (!isChildStore(target) || target.transactionMeta.phase !== `building`) {
704
- store2.logger.error(`\uD83D\uDC1E`, `atom`, key, `stowUpdate called outside of a transaction. This is probably a bug.`);
705
- return;
706
- }
707
- const shouldStow = shouldUpdateBeStowed(key, update);
708
- if (!shouldStow) {
709
- return;
710
- }
711
- const atomUpdate = {
712
- type: `atom_update`,
713
- key,
714
- ...update
715
- };
716
- if (state.family) {
717
- atomUpdate.family = state.family;
718
- }
719
- target.transactionMeta.update.updates.push(atomUpdate);
720
- store2.logger.info(`\uD83D\uDCC1`, `atom`, key, `stowed (`, update.oldValue, `->`, update.newValue, `)`);
721
- };
722
-
723
- // ../atom.io/internal/src/set-state/set-atom.ts
724
- var setAtom = (atom4, next, target) => {
725
- const oldValue = readOrComputeValue(atom4, target);
726
- let newValue = oldValue;
727
- if (atom4.type === `mutable_atom` && isChildStore(target)) {
728
- const { parent } = target;
729
- const copiedValue = copyMutableIfNeeded(atom4, parent, target);
730
- newValue = copiedValue;
731
- }
732
- newValue = become(next)(newValue);
733
- target.logger.info(`\uD83D\uDCDD`, `atom`, atom4.key, `set to`, newValue);
734
- newValue = cacheValue(atom4.key, newValue, atom4.subject, target);
735
- if (isAtomDefault(atom4.key, target)) {
736
- markAtomAsNotDefault(atom4.key, target);
737
- }
738
- markDone(target, atom4.key);
739
- evictDownStream(atom4, target);
740
- const update = { oldValue, newValue };
741
- if (isRootStore(target)) {
742
- emitUpdate(atom4, update, target);
743
- } else if (target.parent) {
744
- if (target.on.transactionApplying.state === null) {
745
- stowUpdate(atom4, update, target);
746
- } else if (atom4.key.startsWith(`*`)) {
747
- const mutableKey = atom4.key.slice(1);
748
- const mutableAtom = target.atoms.get(mutableKey);
749
- let transceiver = target.valueMap.get(mutableKey);
750
- if (mutableAtom.type === `mutable_atom` && isChildStore(target)) {
751
- const { parent } = target;
752
- const copiedValue = copyMutableIfNeeded(mutableAtom, parent, target);
753
- transceiver = copiedValue;
754
- }
755
- const accepted = transceiver.do(update.newValue) === null;
756
- if (accepted)
757
- evictDownStream(mutableAtom, target);
758
- }
759
- }
760
- };
761
-
762
- // ../atom.io/internal/src/set-state/set-atom-or-selector.ts
763
- var setAtomOrSelector = (state, value, store2) => {
764
- switch (state.type) {
765
- case `atom`:
766
- case `mutable_atom`:
767
- setAtom(state, value, store2);
768
- break;
769
- case `selector`:
770
- state.set(value);
771
- break;
772
- }
773
- };
774
- // ../atom.io/internal/src/set-state/set-into-store.ts
775
- function setIntoStore(store3, ...params) {
776
- let token;
777
- let value;
778
- if (params.length === 2) {
779
- token = params[0];
780
- value = params[1];
781
- } else {
782
- const family = params[0];
783
- const key = params[1];
784
- value = params[2];
785
- const maybeToken = findInStore(store3, family, key);
786
- token = maybeToken;
787
- }
788
- if (`counterfeit` in token) {
789
- const disposal = store3.disposalTraces.buffer.find((item) => item?.key === token.key);
790
- store3.logger.error(`\u274C`, token.type, token.key, `could not be set because it was not found in the store "${store3.config.name}".`, disposal ? `This state was previously disposed:\n${disposal.trace}` : `No previous disposal trace was found.`);
791
- return;
792
- }
793
- const rejectionTime = openOperation(store3, token);
794
- if (rejectionTime) {
795
- const unsubscribe = store3.on.operationClose.subscribe(`waiting to set "${token.key}" at T-${rejectionTime}`, () => {
796
- unsubscribe();
797
- store3.logger.info(`\uD83D\uDFE2`, token.type, token.key, `resuming deferred setState from T-${rejectionTime}`);
798
- setIntoStore(store3, token, value);
799
- });
800
- return;
801
- }
802
- const state = withdraw(token, store3);
803
- setAtomOrSelector(state, value, store3);
804
- closeOperation(store3);
805
- }
806
- // ../atom.io/internal/src/ingest-updates/ingest-atom-update.ts
807
- function ingestAtomUpdate(applying, atomUpdate, store3) {
808
- const { key, newValue, oldValue } = atomUpdate;
809
- const value = applying === `newValue` ? newValue : oldValue;
810
- const token = { key, type: `atom` };
811
- if (atomUpdate.family) {
812
- Object.assign(token, { family: atomUpdate.family });
813
- }
814
- setIntoStore(store3, token, value);
815
- }
816
- // ../atom.io/internal/src/molecule/create-molecule-family.ts
817
- function createMoleculeFamily(store3, options) {
818
- const subject4 = new Subject;
819
- const token = {
820
- type: `molecule_family`,
821
- key: options.key,
822
- dependsOn: options.dependsOn ?? `all`
823
- };
824
- const family = {
825
- ...token,
826
- subject: subject4,
827
- new: options.new
828
- };
829
- store3.moleculeFamilies.set(options.key, family);
830
- return token;
831
- }
832
- // ../atom.io/internal/src/molecule/grow-molecule-in-store.ts
833
- function growMoleculeInStore(molecule, family, store3) {
834
- const stateToken = initFamilyMemberInStore(store3, family, molecule.key);
835
- molecule.tokens.set(stateToken.key, stateToken);
836
- const isTransaction = isChildStore(store3) && store3.transactionMeta.phase === `building`;
837
- const moleculeInProgress = store3.moleculeInProgress === molecule.key;
838
- if (!isTransaction && !moleculeInProgress) {
839
- molecule.subject.next({ type: `state_creation`, token: stateToken });
840
- }
841
- return stateToken;
842
- }
843
- // ../atom.io/transceivers/set-rtx/src/set-rtx.ts
844
- class SetRTX extends Set {
845
- mode = `record`;
846
- subject = new Subject;
847
- cacheLimit = 0;
848
- cache = [];
849
- cacheIdx = -1;
850
- cacheUpdateNumber = -1;
851
- constructor(values, cacheLimit = 0) {
852
- super(values);
853
- if (values instanceof SetRTX) {
854
- this.parent = values;
855
- this.cacheUpdateNumber = values.cacheUpdateNumber;
856
- }
857
- if (cacheLimit) {
858
- this.cacheLimit = cacheLimit;
859
- this.cache = new Array(cacheLimit);
860
- this.subscribe(`auto cache`, (update) => {
861
- this.cacheIdx++;
862
- this.cacheIdx %= this.cacheLimit;
863
- this.cache[this.cacheIdx] = update;
864
- });
865
- }
866
- }
867
- toJSON() {
868
- return {
869
- members: [...this],
870
- cache: this.cache,
871
- cacheLimit: this.cacheLimit,
872
- cacheIdx: this.cacheIdx,
873
- cacheUpdateNumber: this.cacheUpdateNumber
874
- };
875
- }
876
- static fromJSON(json6) {
877
- const set = new SetRTX(json6.members, json6.cacheLimit);
878
- set.cache = json6.cache;
879
- set.cacheIdx = json6.cacheIdx;
880
- set.cacheUpdateNumber = json6.cacheUpdateNumber;
881
- return set;
882
- }
883
- add(value) {
884
- const result = super.add(value);
885
- if (this.mode === `record`) {
886
- this.cacheUpdateNumber++;
887
- this.emit(`add:${stringifyJson(value)}`);
888
- }
889
- return result;
890
- }
891
- clear() {
892
- const capturedContents = this.mode === `record` ? [...this] : null;
893
- super.clear();
894
- if (capturedContents) {
895
- this.cacheUpdateNumber++;
896
- this.emit(`clear:${JSON.stringify(capturedContents)}`);
897
- }
898
- }
899
- delete(value) {
900
- const result = super.delete(value);
901
- if (this.mode === `record`) {
902
- this.cacheUpdateNumber++;
903
- this.emit(`del:${stringifyJson(value)}`);
904
- }
905
- return result;
906
- }
907
- parent;
908
- child = null;
909
- transactionUpdates = null;
910
- transaction(run) {
911
- this.mode = `transaction`;
912
- this.transactionUpdates = [];
913
- this.child = new SetRTX(this);
914
- const unsubscribe = this.child._subscribe(`transaction`, (update) => {
915
- this.transactionUpdates?.push(update);
916
- });
917
- try {
918
- const shouldCommit = run(this.child);
919
- if (shouldCommit) {
920
- for (const update of this.transactionUpdates) {
921
- this.doStep(update);
922
- }
923
- this.cacheUpdateNumber++;
924
- this.emit(`tx:${this.transactionUpdates.join(`;`)}`);
925
- }
926
- } catch (thrown) {
927
- console.error(`Failed to apply transaction to SetRTX:`, thrown);
928
- throw thrown;
929
- } finally {
930
- unsubscribe();
931
- this.child = null;
932
- this.transactionUpdates = null;
933
- this.mode = `record`;
934
- }
935
- }
936
- _subscribe(key, fn) {
937
- return this.subject.subscribe(key, fn);
938
- }
939
- subscribe(key, fn) {
940
- return this.subject.subscribe(key, (update) => {
941
- fn(`${this.cacheUpdateNumber}=${update}`);
942
- });
943
- }
944
- emit(update) {
945
- this.subject.next(update);
946
- }
947
- doStep(update) {
948
- const typeValueBreak = update.indexOf(`:`);
949
- const type = update.substring(0, typeValueBreak);
950
- const value = update.substring(typeValueBreak + 1);
951
- switch (type) {
952
- case `add`:
953
- this.add(parseJson(value));
954
- break;
955
- case `clear`:
956
- this.clear();
957
- break;
958
- case `del`:
959
- this.delete(parseJson(value));
960
- break;
961
- case `tx`:
962
- for (const subUpdate of value.split(`;`)) {
963
- this.doStep(subUpdate);
964
- }
965
- }
966
- }
967
- getUpdateNumber(update) {
968
- const breakpoint = update.indexOf(`=`);
969
- return Number(update.substring(0, breakpoint));
970
- }
971
- do(update) {
972
- const breakpoint = update.indexOf(`=`);
973
- const updateNumber = Number(update.substring(0, breakpoint));
974
- const eventOffset = updateNumber - this.cacheUpdateNumber;
975
- const isFuture = eventOffset > 0;
976
- if (isFuture) {
977
- if (eventOffset === 1) {
978
- this.mode = `playback`;
979
- const innerUpdate = update.substring(breakpoint + 1);
980
- this.doStep(innerUpdate);
981
- this.mode = `record`;
982
- this.cacheUpdateNumber = updateNumber;
983
- return null;
984
- }
985
- return this.cacheUpdateNumber + 1;
986
- }
987
- if (Math.abs(eventOffset) < this.cacheLimit) {
988
- const eventIdx = this.cacheIdx + eventOffset;
989
- const cachedUpdate = this.cache[eventIdx];
990
- if (cachedUpdate === update) {
991
- return null;
992
- }
993
- this.mode = `playback`;
994
- let done = false;
995
- while (!done) {
996
- this.cacheIdx %= this.cacheLimit;
997
- const u = this.cache[this.cacheIdx];
998
- this.cacheIdx--;
999
- if (!u) {
1000
- return `OUT_OF_RANGE`;
1001
- }
1002
- this.undo(u);
1003
- done = this.cacheIdx === eventIdx - 1;
1004
- }
1005
- const innerUpdate = update.substring(breakpoint + 1);
1006
- this.doStep(innerUpdate);
1007
- this.mode = `record`;
1008
- this.cacheUpdateNumber = updateNumber;
1009
- return null;
1010
- }
1011
- return `OUT_OF_RANGE`;
1012
- }
1013
- undoStep(update) {
1014
- const breakpoint = update.indexOf(`:`);
1015
- const type = update.substring(0, breakpoint);
1016
- const value = update.substring(breakpoint + 1);
1017
- switch (type) {
1018
- case `add`:
1019
- this.delete(parseJson(value));
1020
- break;
1021
- case `del`:
1022
- this.add(parseJson(value));
1023
- break;
1024
- case `clear`: {
1025
- const values = JSON.parse(value);
1026
- for (const v of values)
1027
- this.add(v);
1028
- break;
1029
- }
1030
- case `tx`: {
1031
- const updates = value.split(`;`);
1032
- for (let i = updates.length - 1;i >= 0; i--) {
1033
- this.undoStep(updates[i]);
1034
- }
1035
- }
1036
- }
1037
- }
1038
- undo(update) {
1039
- const breakpoint = update.indexOf(`=`);
1040
- const updateNumber = Number(update.substring(0, breakpoint));
1041
- if (updateNumber === this.cacheUpdateNumber) {
1042
- this.mode = `playback`;
1043
- const innerUpdate = update.substring(breakpoint + 1);
1044
- this.undoStep(innerUpdate);
1045
- this.mode = `record`;
1046
- this.cacheUpdateNumber--;
1047
- return null;
1048
- }
1049
- return this.cacheUpdateNumber;
1050
- }
1051
- }
1052
- // ../atom.io/data/src/join.ts
1053
- function capitalize2(string) {
1054
- return string[0].toUpperCase() + string.slice(1);
1055
- }
1056
- function join(options, defaultContent, store3 = IMPLICIT.STORE) {
1057
- const joins = getJoinMap(store3);
1058
- joins.set(options.key, new Join(options, defaultContent, store3));
1059
- const token = {
1060
- key: options.key,
1061
- type: `join`,
1062
- a: options.between[0],
1063
- b: options.between[1],
1064
- cardinality: options.cardinality
1065
- };
1066
- return token;
1067
- }
1068
- function getJoinMap(store3) {
1069
- if (`joins` in store3 && store3.joins instanceof Map) {
1070
- return store3.joins;
1071
- }
1072
- const joins = new Map;
1073
- store3.joins = joins;
1074
- return joins;
1075
- }
1076
- function getJoin(token, store3) {
1077
- const joinMap = getJoinMap(store3);
1078
- let myJoin = joinMap.get(token.key);
1079
- if (myJoin === undefined) {
1080
- const rootJoinMap = getJoinMap(IMPLICIT.STORE);
1081
- myJoin = rootJoinMap.get(token.key)?.in(store3);
1082
- if (myJoin === undefined) {
1083
- throw new Error(`Join "${token.key}" not found in store "${store3.config.name}"`);
1084
- }
1085
- joinMap.set(token.key, myJoin);
1086
- }
1087
- return myJoin;
1088
- }
1089
- function findRelationsInStore(token, key, store3) {
1090
- const myJoin = getJoin(token, store3);
1091
- let relations;
1092
- switch (token.cardinality) {
1093
- case `1:1`: {
1094
- const keyAB = `${token.a}KeyOf${capitalize2(token.b)}`;
1095
- const keyBA = `${token.b}KeyOf${capitalize2(token.a)}`;
1096
- relations = {
1097
- get [keyAB]() {
1098
- const familyAB = myJoin.states[keyAB];
1099
- const state = myJoin.retrieve(familyAB, key);
1100
- return state;
1101
- },
1102
- get [keyBA]() {
1103
- const familyBA = myJoin.states[keyBA];
1104
- const state = myJoin.retrieve(familyBA, key);
1105
- return state;
1106
- }
1107
- };
1108
- const entryAB = `${token.a}EntryOf${capitalize2(token.b)}`;
1109
- if (entryAB in myJoin.states) {
1110
- const entryBA = `${token.b}EntryOf${capitalize2(token.a)}`;
1111
- Object.assign(relations, {
1112
- get [entryAB]() {
1113
- const familyAB = myJoin.states[entryAB];
1114
- const state = myJoin.retrieve(familyAB, key);
1115
- return state;
1116
- },
1117
- get [entryBA]() {
1118
- const familyBA = myJoin.states[entryBA];
1119
- const state = myJoin.retrieve(familyBA, key);
1120
- return state;
1121
- }
1122
- });
1123
- }
1124
- break;
1125
- }
1126
- case `1:n`: {
1127
- const keyAB = `${token.a}KeyOf${capitalize2(token.b)}`;
1128
- const keysBA = `${token.b}KeysOf${capitalize2(token.a)}`;
1129
- relations = {
1130
- get [keyAB]() {
1131
- const familyAB = myJoin.states[keyAB];
1132
- const state = myJoin.retrieve(familyAB, key);
1133
- return state;
1134
- },
1135
- get [keysBA]() {
1136
- const familyBA = myJoin.states[keysBA];
1137
- const state = myJoin.retrieve(familyBA, key);
1138
- return state;
1139
- }
1140
- };
1141
- const entryAB = `${token.a}EntryOf${capitalize2(token.b)}`;
1142
- if (entryAB in myJoin.states) {
1143
- const entriesBA = `${token.b}EntriesOf${capitalize2(token.a)}`;
1144
- Object.assign(relations, {
1145
- get [entryAB]() {
1146
- const familyAB = myJoin.states[entryAB];
1147
- const state = myJoin.retrieve(familyAB, key);
1148
- return state;
1149
- },
1150
- get [entriesBA]() {
1151
- const familyBA = myJoin.states[entriesBA];
1152
- const state = myJoin.retrieve(familyBA, key);
1153
- return state;
1154
- }
1155
- });
1156
- }
1157
- break;
1158
- }
1159
- case `n:n`: {
1160
- const keysAB = `${token.a}KeysOf${capitalize2(token.b)}`;
1161
- const keysBA = `${token.b}KeysOf${capitalize2(token.a)}`;
1162
- relations = {
1163
- get [keysAB]() {
1164
- const familyAB = myJoin.states[keysAB];
1165
- const state = myJoin.retrieve(familyAB, key);
1166
- return state;
1167
- },
1168
- get [keysBA]() {
1169
- const familyBA = myJoin.states[keysBA];
1170
- const state = myJoin.retrieve(familyBA, key);
1171
- return state;
1172
- }
1173
- };
1174
- const entriesAB = `${token.a}EntriesOf${capitalize2(token.b)}`;
1175
- if (entriesAB in myJoin.states) {
1176
- const entriesBA = `${token.b}EntriesOf${capitalize2(token.a)}`;
1177
- Object.assign(relations, {
1178
- get [entriesAB]() {
1179
- const familyAB = myJoin.states[entriesAB];
1180
- const state = myJoin.retrieve(familyAB, key);
1181
- return state;
1182
- },
1183
- get [entriesBA]() {
1184
- const familyBA = myJoin.states[entriesBA];
1185
- const state = myJoin.retrieve(familyBA, key);
1186
- return state;
1187
- }
1188
- });
1189
- }
1190
- }
1191
- }
1192
- return relations;
1193
- }
1194
- function findRelations(token, key) {
1195
- return findRelationsInStore(token, key, IMPLICIT.STORE);
1196
- }
1197
- function editRelationsInStore(token, change, store3) {
1198
- const myJoin = getJoin(token, store3);
1199
- const target = newest(store3);
1200
- if (isChildStore(target)) {
1201
- const { toolkit } = target.transactionMeta;
1202
- myJoin.transact(toolkit, ({ relations }) => {
1203
- change(relations);
1204
- });
1205
- } else {
1206
- change(myJoin.relations);
1207
- }
1208
- }
1209
- function getInternalRelationsFromStore(token, store3) {
1210
- const myJoin = getJoin(token, store3);
1211
- const family = myJoin.core.findRelatedKeysState;
1212
- return family;
1213
- }
1214
- function getInternalRelations(token) {
1215
- return getInternalRelationsFromStore(token, IMPLICIT.STORE);
1216
- }
1217
-
1218
- class Join {
1219
- options;
1220
- defaultContent;
1221
- toolkit;
1222
- retrieve;
1223
- molecules = new Map;
1224
- relations;
1225
- states;
1226
- core;
1227
- transact(toolkit, run) {
1228
- const originalToolkit = this.toolkit;
1229
- this.toolkit = toolkit;
1230
- run(this);
1231
- this.toolkit = originalToolkit;
1232
- }
1233
- store;
1234
- alternates;
1235
- [Symbol.dispose]() {
1236
- this.alternates.delete(this.store.config.name);
1237
- }
1238
- in(store3) {
1239
- const key = store3.config.name;
1240
- const alternate = this.alternates.get(key);
1241
- if (alternate) {
1242
- return alternate;
1243
- }
1244
- const join2 = new Join(this.options, this.defaultContent, store3);
1245
- this.alternates.set(key, join2);
1246
- join2.alternates = this.alternates;
1247
- return join2;
1248
- }
1249
- constructor(options, defaultContent, store3 = IMPLICIT.STORE) {
1250
- this.store = store3;
1251
- this.options = options;
1252
- this.defaultContent = defaultContent;
1253
- this.alternates = new Map;
1254
- this.alternates.set(store3.config.name, this);
1255
- this.store.miscResources.set(`join:${options.key}`, this);
1256
- this.retrieve = (token, key) => {
1257
- const maybeToken = this.toolkit.seek(token, key);
1258
- if (maybeToken) {
1259
- return maybeToken;
1260
- }
1261
- const molecule = this.molecules.get(stringifyJson(key));
1262
- if (molecule) {
1263
- const family = withdraw(token, store3);
1264
- return growMoleculeInStore(molecule, family, store3);
1265
- }
1266
- if (store3.config.lifespan === `immortal`) {
1267
- throw new NotFoundError(token, key, store3);
1268
- }
1269
- return initFamilyMemberInStore(store3, token, key);
1270
- };
1271
- this.toolkit = {
1272
- get: (...ps) => getFromStore(store3, ...ps),
1273
- set: (...ps) => {
1274
- setIntoStore(store3, ...ps);
1275
- },
1276
- find: this.retrieve,
1277
- seek: (...ps) => seekInStore(store3, ...ps),
1278
- json: (token) => getJsonToken(store3, token),
1279
- dispose: (...ps) => {
1280
- disposeFromStore(store3, ...ps);
1281
- }
1282
- };
1283
- const aSide = options.between[0];
1284
- const bSide = options.between[1];
1285
- const relatedKeysAtoms = createMutableAtomFamily(store3, {
1286
- key: `${options.key}/relatedKeys`,
1287
- default: () => new SetRTX,
1288
- mutable: true,
1289
- fromJson: (json7) => SetRTX.fromJSON(json7),
1290
- toJson: (set) => set.toJSON()
1291
- }, [`join`, `relations`]);
1292
- this.core = { findRelatedKeysState: relatedKeysAtoms };
1293
- const getRelatedKeys = ({ get }, key) => get(this.retrieve(relatedKeysAtoms, key));
1294
- const addRelation = (toolkit, a, b) => {
1295
- const { set } = toolkit;
1296
- const aKeysState = this.retrieve(relatedKeysAtoms, a);
1297
- const bKeysState = this.retrieve(relatedKeysAtoms, b);
1298
- set(aKeysState, (aKeys) => aKeys.add(b));
1299
- set(bKeysState, (bKeys) => bKeys.add(a));
1300
- };
1301
- const deleteRelation = (toolkit, a, b) => {
1302
- const { set } = toolkit;
1303
- const aKeysState = this.retrieve(relatedKeysAtoms, a);
1304
- const bKeysState = this.retrieve(relatedKeysAtoms, b);
1305
- let stringA;
1306
- let stringB;
1307
- set(aKeysState, (aKeys) => {
1308
- aKeys.delete(b);
1309
- if (aKeys.size === 0) {
1310
- stringA = `"${a}"`;
1311
- }
1312
- return aKeys;
1313
- });
1314
- set(bKeysState, (bKeys) => {
1315
- bKeys.delete(a);
1316
- if (bKeys.size === 0) {
1317
- stringB = `"${b}"`;
1318
- }
1319
- return bKeys;
1320
- });
1321
- };
1322
- const replaceRelationsSafely = (toolkit, a, newRelationsOfA) => {
1323
- const { get, set } = toolkit;
1324
- const relationsOfAState = this.retrieve(relatedKeysAtoms, a);
1325
- const currentRelationsOfA = get(relationsOfAState);
1326
- for (const currentRelationB of currentRelationsOfA) {
1327
- const remainsRelated = newRelationsOfA.includes(currentRelationB);
1328
- if (remainsRelated) {
1329
- continue;
1330
- }
1331
- const relationsOfBState = this.retrieve(relatedKeysAtoms, currentRelationB);
1332
- set(relationsOfBState, (relationsOfB) => {
1333
- relationsOfB.delete(a);
1334
- return relationsOfB;
1335
- });
1336
- }
1337
- set(relationsOfAState, (relationsOfA) => {
1338
- relationsOfA.transaction((nextRelationsOfA) => {
1339
- nextRelationsOfA.clear();
1340
- for (const newRelationB of newRelationsOfA) {
1341
- const relationsOfB = getRelatedKeys(toolkit, newRelationB);
1342
- const newRelationBIsAlreadyRelated = relationsOfB.has(a);
1343
- if (this.relations.cardinality === `1:n`) {
1344
- const previousOwnersToDispose = [];
1345
- for (const previousOwner of relationsOfB) {
1346
- if (previousOwner === a) {
1347
- continue;
1348
- }
1349
- const previousOwnerRelations = getRelatedKeys(toolkit, previousOwner);
1350
- previousOwnerRelations.delete(newRelationB);
1351
- if (previousOwnerRelations.size === 0) {
1352
- previousOwnersToDispose.push(previousOwner);
1353
- }
1354
- }
1355
- if (!newRelationBIsAlreadyRelated && relationsOfB.size > 0) {
1356
- relationsOfB.clear();
1357
- }
1358
- for (const previousOwner of previousOwnersToDispose) {
1359
- const sorted = [newRelationB, previousOwner].sort();
1360
- const compositeKey = `"${sorted[0]}:${sorted[1]}"`;
1361
- this.molecules.delete(compositeKey);
1362
- }
1363
- }
1364
- if (!newRelationBIsAlreadyRelated) {
1365
- relationsOfB.add(a);
1366
- }
1367
- nextRelationsOfA.add(newRelationB);
1368
- }
1369
- return true;
1370
- });
1371
- return relationsOfA;
1372
- });
1373
- };
1374
- const replaceRelationsUnsafely = (toolkit, a, newRelationsOfA) => {
1375
- const { set } = toolkit;
1376
- const relationsOfAState = this.retrieve(relatedKeysAtoms, a);
1377
- set(relationsOfAState, (relationsOfA) => {
1378
- relationsOfA.transaction((nextRelationsOfA) => {
1379
- for (const newRelationB of newRelationsOfA) {
1380
- nextRelationsOfA.add(newRelationB);
1381
- }
1382
- return true;
1383
- });
1384
- return relationsOfA;
1385
- });
1386
- for (const newRelationB of newRelationsOfA) {
1387
- const newRelationsBState = this.retrieve(relatedKeysAtoms, newRelationB);
1388
- set(newRelationsBState, (newRelationsB) => {
1389
- newRelationsB.add(a);
1390
- return newRelationsB;
1391
- });
1392
- }
1393
- return true;
1394
- };
1395
- const has = (toolkit, a, b) => {
1396
- const aKeys = getRelatedKeys(toolkit, a);
1397
- return b ? aKeys.has(b) : aKeys.size > 0;
1398
- };
1399
- const baseExternalStoreConfiguration = {
1400
- getRelatedKeys: (key) => getRelatedKeys(this.toolkit, key),
1401
- addRelation: (a, b) => {
1402
- addRelation(this.toolkit, a, b);
1403
- },
1404
- deleteRelation: (a, b) => {
1405
- deleteRelation(this.toolkit, a, b);
1406
- },
1407
- replaceRelationsSafely: (a, bs) => {
1408
- replaceRelationsSafely(this.toolkit, a, bs);
1409
- },
1410
- replaceRelationsUnsafely: (a, bs) => {
1411
- replaceRelationsUnsafely(this.toolkit, a, bs);
1412
- },
1413
- has: (a, b) => has(this.toolkit, a, b)
1414
- };
1415
- let externalStore;
1416
- let contentAtoms;
1417
- let contentMolecules;
1418
- if (defaultContent) {
1419
- contentAtoms = createRegularAtomFamily(store3, {
1420
- key: `${options.key}/content`,
1421
- default: defaultContent
1422
- }, [`join`, `content`]);
1423
- const joinToken = {
1424
- key: options.key,
1425
- type: `join`,
1426
- a: options.between[0],
1427
- b: options.between[1],
1428
- cardinality: options.cardinality
1429
- };
1430
- contentMolecules = createMoleculeFamily(store3, {
1431
- key: `${options.key}/content-molecules`,
1432
- new: class ContentMolecule {
1433
- key;
1434
- constructor(_, key) {
1435
- this.key = key;
1436
- }
1437
- }
1438
- });
1439
- const getContent = ({ get }, key) => get(this.retrieve(contentAtoms, key));
1440
- const setContent = ({ set }, key, content) => {
1441
- set(this.retrieve(contentAtoms, key), content);
1442
- };
1443
- const deleteContent = (_, compositeKey) => {
1444
- const contentMolecule = store3.molecules.get(`"${compositeKey}"`);
1445
- if (contentMolecule) {
1446
- this.toolkit.dispose(contentMolecule);
1447
- this.molecules.delete(`"${compositeKey}"`);
1448
- }
1449
- };
1450
- const externalStoreWithContentConfiguration = {
1451
- getContent: (contentKey) => {
1452
- const content = getContent(this.toolkit, contentKey);
1453
- return content;
1454
- },
1455
- setContent: (contentKey, content) => {
1456
- setContent(this.toolkit, contentKey, content);
1457
- },
1458
- deleteContent: (contentKey) => {
1459
- deleteContent(this.toolkit, contentKey);
1460
- }
1461
- };
1462
- externalStore = Object.assign(baseExternalStoreConfiguration, externalStoreWithContentConfiguration);
1463
- } else {
1464
- externalStore = baseExternalStoreConfiguration;
1465
- }
1466
- const relations = new Junction(options, {
1467
- externalStore,
1468
- makeContentKey: (...args) => {
1469
- const sorted = args.sort();
1470
- const compositeKey = `${sorted[0]}:${sorted[1]}`;
1471
- const [m0, m1] = sorted.map((key) => this.molecules.get(stringifyJson(key)));
1472
- if (store3.config.lifespan === `immortal` && m0 && m1) {
1473
- const target = newest(store3);
1474
- const moleculeToken = makeMoleculeInStore(target, [m0, m1], contentMolecules, compositeKey);
1475
- this.molecules.set(`"${compositeKey}"`, withdraw(moleculeToken, target));
1476
- }
1477
- return compositeKey;
1478
- }
1479
- });
1480
- const createSingleKeyStateFamily = () => createReadonlySelectorFamily(store3, {
1481
- key: `${options.key}/singleRelatedKey`,
1482
- get: (key) => ({ get }) => {
1483
- const relatedKeysState = this.retrieve(relatedKeysAtoms, key);
1484
- const relatedKeys = get(relatedKeysState);
1485
- for (const relatedKey of relatedKeys) {
1486
- return relatedKey;
1487
- }
1488
- return null;
1489
- }
1490
- }, [`join`, `keys`]);
1491
- const getMultipleKeyStateFamily = () => {
1492
- return createReadonlySelectorFamily(store3, {
1493
- key: `${options.key}/multipleRelatedKeys`,
1494
- get: (key) => ({ get }) => {
1495
- const jsonFamily = getJsonFamily(relatedKeysAtoms, store3);
1496
- const jsonState = this.retrieve(jsonFamily, key);
1497
- const json7 = get(jsonState);
1498
- return json7.members;
1499
- }
1500
- }, [`join`, `keys`]);
1501
- };
1502
- const createSingleEntryStateFamily = () => createReadonlySelectorFamily(store3, {
1503
- key: `${options.key}/singleRelatedEntry`,
1504
- get: (key) => ({ get }) => {
1505
- const relatedKeysState = this.retrieve(relatedKeysAtoms, key);
1506
- const relatedKeys = get(relatedKeysState);
1507
- for (const relatedKey of relatedKeys) {
1508
- const contentKey = relations.makeContentKey(key, relatedKey);
1509
- const contentState = this.retrieve(contentAtoms, contentKey);
1510
- const content = get(contentState);
1511
- return [relatedKey, content];
1512
- }
1513
- return null;
1514
- }
1515
- }, [`join`, `entries`]);
1516
- const getMultipleEntryStateFamily = () => createReadonlySelectorFamily(store3, {
1517
- key: `${options.key}/multipleRelatedEntries`,
1518
- get: (key) => ({ get }) => {
1519
- const jsonFamily = getJsonFamily(relatedKeysAtoms, store3);
1520
- const jsonState = this.retrieve(jsonFamily, key);
1521
- const json7 = get(jsonState);
1522
- return json7.members.map((relatedKey) => {
1523
- const contentKey = relations.makeContentKey(key, relatedKey);
1524
- const contentState = this.retrieve(contentAtoms, contentKey);
1525
- const content = get(contentState);
1526
- return [relatedKey, content];
1527
- });
1528
- }
1529
- }, [`join`, `entries`]);
1530
- switch (options.cardinality) {
1531
- case `1:1`: {
1532
- const findSingleRelatedKeyState = createSingleKeyStateFamily();
1533
- const stateKeyA = `${aSide}KeyOf${capitalize2(bSide)}`;
1534
- const stateKeyB = `${bSide}KeyOf${capitalize2(aSide)}`;
1535
- const baseStates = {
1536
- [stateKeyA]: findSingleRelatedKeyState,
1537
- [stateKeyB]: findSingleRelatedKeyState
1538
- };
1539
- let states;
1540
- if (defaultContent) {
1541
- const findSingleRelatedEntryState = createSingleEntryStateFamily();
1542
- const entriesStateKeyA = `${aSide}EntryOf${capitalize2(bSide)}`;
1543
- const entriesStateKeyB = `${bSide}EntryOf${capitalize2(aSide)}`;
1544
- const contentStates = {
1545
- [entriesStateKeyA]: findSingleRelatedEntryState,
1546
- [entriesStateKeyB]: findSingleRelatedEntryState
1547
- };
1548
- states = Object.assign(baseStates, contentStates);
1549
- } else {
1550
- states = baseStates;
1551
- }
1552
- this.relations = relations;
1553
- this.states = states;
1554
- break;
1555
- }
1556
- case `1:n`: {
1557
- const findSingleRelatedKeyState = createSingleKeyStateFamily();
1558
- const findMultipleRelatedKeysState = getMultipleKeyStateFamily();
1559
- const stateKeyA = `${aSide}KeyOf${capitalize2(bSide)}`;
1560
- const stateKeyB = `${bSide}KeysOf${capitalize2(aSide)}`;
1561
- const baseStates = {
1562
- [stateKeyA]: findSingleRelatedKeyState,
1563
- [stateKeyB]: findMultipleRelatedKeysState
1564
- };
1565
- let states;
1566
- if (defaultContent) {
1567
- const findSingleRelatedEntryState = createSingleEntryStateFamily();
1568
- const findMultipleRelatedEntriesState = getMultipleEntryStateFamily();
1569
- const entriesStateKeyA = `${aSide}EntryOf${capitalize2(bSide)}`;
1570
- const entriesStateKeyB = `${bSide}EntriesOf${capitalize2(aSide)}`;
1571
- const contentStates = {
1572
- [entriesStateKeyA]: findSingleRelatedEntryState,
1573
- [entriesStateKeyB]: findMultipleRelatedEntriesState
1574
- };
1575
- states = Object.assign(baseStates, contentStates);
1576
- } else {
1577
- states = baseStates;
1578
- }
1579
- this.relations = relations;
1580
- this.states = states;
1581
- break;
1582
- }
1583
- default: {
1584
- const findMultipleRelatedKeysState = getMultipleKeyStateFamily();
1585
- const stateKeyA = `${aSide}KeysOf${capitalize2(bSide)}`;
1586
- const stateKeyB = `${bSide}KeysOf${capitalize2(aSide)}`;
1587
- const baseStates = {
1588
- [stateKeyA]: findMultipleRelatedKeysState,
1589
- [stateKeyB]: findMultipleRelatedKeysState
1590
- };
1591
- let states;
1592
- if (defaultContent) {
1593
- const findMultipleRelatedEntriesState = getMultipleEntryStateFamily();
1594
- const entriesStateKeyA = `${aSide}EntriesOf${capitalize2(bSide)}`;
1595
- const entriesStateKeyB = `${bSide}EntriesOf${capitalize2(aSide)}`;
1596
- const contentStates = {
1597
- [entriesStateKeyA]: findMultipleRelatedEntriesState,
1598
- [entriesStateKeyB]: findMultipleRelatedEntriesState
1599
- };
1600
- states = Object.assign(baseStates, contentStates);
1601
- } else {
1602
- states = baseStates;
1603
- }
1604
- this.relations = relations;
1605
- this.states = states;
1606
- }
1607
- }
1608
- }
1609
- }
1610
- // ../atom.io/internal/src/get-environment-data.ts
1611
- function getEnvironmentData(store3) {
1612
- return {
1613
- store: store3
1614
- };
1615
- }
1616
-
1617
- // ../atom.io/internal/src/get-state/get-from-store.ts
1618
- function getFromStore(store4, ...params) {
1619
- let token;
1620
- if (params.length === 1) {
1621
- token = params[0];
1622
- } else {
1623
- const family = params[0];
1624
- const key = params[1];
1625
- let maybeToken;
1626
- if (family.type === `molecule_family`) {
1627
- maybeToken = seekInStore(store4, family, key) ?? counterfeit(family, key);
1628
- } else {
1629
- maybeToken = findInStore(store4, family, key);
1630
- }
1631
- token = maybeToken;
1632
- }
1633
- if (`counterfeit` in token && `family` in token) {
1634
- const family = token.type === `molecule` ? withdraw(token.family, store4) : store4.families.get(token.family.key);
1635
- const subKey = token.type === `molecule` ? token.key : token.family.subKey;
1636
- const disposal = store4.disposalTraces.buffer.find((item) => item?.key === token.key);
1637
- store4.logger.error(`\u274C`, token.type, token.key, `could not be retrieved because it was not found in the store "${store4.config.name}".`, disposal ? `This state was previously disposed:\n${disposal.trace}` : `No previous disposal trace was found.`);
1638
- switch (family.type) {
1639
- case `atom_family`:
1640
- case `mutable_atom_family`:
1641
- return store4.defaults.get(family.key);
1642
- case `selector_family`:
1643
- case `readonly_selector_family`: {
1644
- if (store4.defaults.has(family.key)) {
1645
- return store4.defaults.get(token.family.key);
1646
- }
1647
- const defaultValue = withdraw(family, store4).default(subKey);
1648
- store4.defaults.set(family.key, defaultValue);
1649
- return defaultValue;
1650
- }
1651
- case `molecule_family`:
1652
- throw new NotFoundError(family, subKey, store4);
1653
- }
1654
- }
1655
- switch (token.type) {
1656
- case `atom`:
1657
- case `mutable_atom`:
1658
- case `selector`:
1659
- case `readonly_selector`:
1660
- return readOrComputeValue(withdraw(token, store4), store4);
1661
- case `molecule`:
1662
- return withdraw(token, store4).instance;
1663
- }
1664
- }
1665
- // ../atom.io/internal/src/molecule/molecule-internal.ts
1666
- class Molecule {
1667
- key;
1668
- type = `molecule`;
1669
- stringKey;
1670
- family;
1671
- subject = new Subject;
1672
- tokens = new Map;
1673
- above = new Map;
1674
- below = new Map;
1675
- joins = new Map;
1676
- instance;
1677
- constructor(ctx, key, family) {
1678
- this.key = key;
1679
- this.stringKey = stringifyJson(key);
1680
- if (family) {
1681
- this.family = family;
1682
- }
1683
- if (ctx) {
1684
- if (Array.isArray(ctx)) {
1685
- for (const molecule of ctx) {
1686
- this.above.set(molecule.stringKey, molecule);
1687
- }
1688
- } else {
1689
- this.above.set(ctx.stringKey, ctx);
1690
- }
1691
- }
1692
- }
1693
- }
1694
-
1695
- // ../atom.io/internal/src/molecule/make-molecule-in-store.ts
1696
- function capitalize3(string) {
1697
- return string[0].toUpperCase() + string.slice(1);
1698
- }
1699
- function makeMoleculeInStore(store5, context, familyToken, key, ...params) {
1700
- const rootStore = eldest(store5);
1701
- const target = newest(store5);
1702
- const stringKey = stringifyJson(key);
1703
- target.moleculeInProgress = stringKey;
1704
- const contextArray = Array.isArray(context) ? context : [context];
1705
- const owners = contextArray.map((ctx) => {
1706
- if (ctx instanceof Molecule) {
1707
- return ctx;
1708
- }
1709
- const ctxStringKey = stringifyJson(ctx.key);
1710
- const molecule2 = store5.molecules.get(ctxStringKey);
1711
- if (!molecule2) {
1712
- throw new Error(`Molecule ${ctxStringKey} not found in store "${store5.config.name}"`);
1713
- }
1714
- return molecule2;
1715
- });
1716
- const molecule = new Molecule(owners, key, familyToken);
1717
- target.molecules.set(stringKey, molecule);
1718
- for (const owner of owners) {
1719
- owner.below.set(molecule.stringKey, molecule);
1720
- }
1721
- const toolkit = {
1722
- get: (...ps) => getFromStore(newest(rootStore), ...ps),
1723
- set: (...ps) => {
1724
- setIntoStore(newest(rootStore), ...ps);
1725
- },
1726
- seek: (t, k) => seekInStore(newest(rootStore), t, k),
1727
- json: (t) => getJsonToken(newest(rootStore), t),
1728
- run: (t, i = arbitrary()) => actUponStore(t, i, newest(store5)),
1729
- make: (ctx, f, k, ...args) => makeMoleculeInStore(newest(rootStore), ctx, f, k, ...args),
1730
- dispose: (t) => {
1731
- disposeFromStore(newest(rootStore), t);
1732
- },
1733
- env: () => getEnvironmentData(newest(rootStore)),
1734
- bond: (token2, maybeRole) => {
1735
- if (token2.type === `join`) {
1736
- const { as: role } = maybeRole;
1737
- const join3 = getJoin(token2, rootStore);
1738
- join3.molecules.set(stringKey, molecule);
1739
- molecule.joins.set(token2.key, join3);
1740
- const unsubFromFamily = family.subject.subscribe(`join:${token2.key}-${stringKey}`, (event) => {
1741
- if (event.type === `molecule_disposal` && stringifyJson(event.token.key) === stringKey) {
1742
- unsubFromFamily();
1743
- join3.molecules.delete(stringKey);
1744
- }
1745
- });
1746
- if (role === null) {
1747
- return;
1748
- }
1749
- const otherRole = token2.a === role ? token2.b : token2.a;
1750
- const relations = findRelations(token2, key);
1751
- const relatedKeys = relations[`${otherRole}KeysOf${capitalize3(role)}`];
1752
- const relatedEntries = relations[`${otherRole}EntriesOf${capitalize3(role)}`];
1753
- let tokens = { relatedKeys };
1754
- if (relatedEntries) {
1755
- tokens = Object.assign(tokens, { relatedEntries });
1756
- }
1757
- return tokens;
1758
- }
1759
- return growMoleculeInStore(molecule, withdraw(token2, rootStore), newest(rootStore));
1760
- },
1761
- claim: (below, options) => {
1762
- const { exclusive } = options;
1763
- const belowMolecule = newest(store5).molecules.get(stringifyJson(below.key));
1764
- if (belowMolecule) {
1765
- if (exclusive) {
1766
- for (const value of belowMolecule.above.values()) {
1767
- value.below.delete(belowMolecule.stringKey);
1768
- }
1769
- belowMolecule.above.clear();
1770
- belowMolecule.above.set(molecule.stringKey, molecule);
1771
- molecule.below.set(belowMolecule.stringKey, belowMolecule);
1772
- } else {
1773
- belowMolecule.above.set(molecule.stringKey, molecule);
1774
- molecule.below.set(belowMolecule.stringKey, belowMolecule);
1775
- }
1776
- }
1777
- },
1778
- spawn: (f, k, ...p) => makeMoleculeInStore(newest(store5), [molecule], withdraw(f, store5), k, ...p)
1779
- };
1780
- const family = withdraw(familyToken, store5);
1781
- const Constructor = family.new;
1782
- molecule.instance = new Constructor(toolkit, key, ...params);
1783
- const token = {
1784
- type: `molecule`,
1785
- key,
1786
- family: familyToken
1787
- };
1788
- const update = {
1789
- type: `molecule_creation`,
1790
- token,
1791
- family: familyToken,
1792
- context: contextArray,
1793
- params
1794
- };
1795
- if (isRootStore(target)) {
1796
- family.subject.next(update);
1797
- } else if (isChildStore(target) && target.on.transactionApplying.state === null) {
1798
- target.transactionMeta.update.updates.push(update);
1799
- }
1800
- target.moleculeInProgress = null;
1801
- return token;
1802
- }
1803
- // ../atom.io/internal/src/ingest-updates/ingest-creation-disposal.ts
1804
- function ingestCreationEvent(update, applying, store6) {
1805
- switch (applying) {
1806
- case `newValue`: {
1807
- createInStore(update, store6);
1808
- break;
1809
- }
1810
- case `oldValue`: {
1811
- disposeFromStore(store6, update.token);
1812
- break;
1813
- }
1814
- }
1815
- }
1816
- function ingestDisposalEvent(update, applying, store6) {
1817
- switch (applying) {
1818
- case `newValue`: {
1819
- disposeFromStore(store6, update.token);
1820
- break;
1821
- }
1822
- case `oldValue`: {
1823
- createInStore(update, store6);
1824
- store6.valueMap.set(update.token.key, update.value);
1825
- break;
1826
- }
1827
- }
1828
- }
1829
- function createInStore(update, store6) {
1830
- const { family: familyMeta } = update.token;
1831
- if (familyMeta) {
1832
- const family = store6.families.get(familyMeta.key);
1833
- if (family) {
1834
- findInStore(store6, family, parseJson(familyMeta.subKey));
1835
- }
1836
- }
1837
- }
1838
- function ingestMoleculeCreationEvent(update, applying, store6) {
1839
- switch (applying) {
1840
- case `newValue`:
1841
- makeMoleculeInStore(store6, update.context, update.family, update.token.key, ...update.params);
1842
- break;
1843
- case `oldValue`:
1844
- disposeFromStore(store6, update.token);
1845
- break;
1846
- }
1847
- }
1848
- function ingestMoleculeDisposalEvent(update, applying, store6) {
1849
- switch (applying) {
1850
- case `newValue`:
1851
- disposeFromStore(store6, update.token);
1852
- break;
1853
- case `oldValue`:
1854
- {
1855
- const moleculeToken = makeMoleculeInStore(store6, update.context, update.family, update.token.key);
1856
- for (const [familyKey, value] of update.values) {
1857
- const memberKey = `${familyKey}(${stringifyJson(moleculeToken.key)})`;
1858
- const molecule2 = withdraw(moleculeToken, store6);
1859
- const alreadyCreated = molecule2.tokens.has(memberKey);
1860
- const family = store6.families.get(familyKey);
1861
- if (family && !alreadyCreated) {
1862
- growMoleculeInStore(molecule2, family, store6);
1863
- }
1864
- store6.valueMap.set(memberKey, value);
1865
- }
1866
- }
1867
- break;
1868
- }
1869
- }
1870
- // ../atom.io/internal/src/ingest-updates/ingest-transaction-update.ts
1871
- function ingestTransactionUpdate(applying, transactionUpdate, store6) {
1872
- const updates = applying === `newValue` ? transactionUpdate.updates : [...transactionUpdate.updates].reverse();
1873
- for (const updateFromTransaction of updates) {
1874
- switch (updateFromTransaction.type) {
1875
- case `atom_update`:
1876
- case `selector_update`:
1877
- ingestAtomUpdate(applying, updateFromTransaction, store6);
1878
- break;
1879
- case `state_creation`:
1880
- ingestCreationEvent(updateFromTransaction, applying, store6);
1881
- break;
1882
- case `state_disposal`:
1883
- ingestDisposalEvent(updateFromTransaction, applying, store6);
1884
- break;
1885
- case `molecule_creation`:
1886
- ingestMoleculeCreationEvent(updateFromTransaction, applying, store6);
1887
- break;
1888
- case `molecule_disposal`:
1889
- ingestMoleculeDisposalEvent(updateFromTransaction, applying, store6);
1890
- break;
1891
- case `transaction_update`:
1892
- ingestTransactionUpdate(applying, updateFromTransaction, store6);
1893
- break;
1894
- }
1895
- }
1896
- }
1897
- // ../atom.io/internal/src/transaction/set-epoch-number.ts
1898
- function setEpochNumberOfAction(transactionKey, newEpoch, store6) {
1899
- const isRoot = isRootStore(store6);
1900
- if (!isRoot) {
1901
- return;
1902
- }
1903
- const continuityKey = store6.transactionMeta.actionContinuities.getRelatedKey(transactionKey);
1904
- if (continuityKey !== undefined) {
1905
- store6.transactionMeta.epoch.set(continuityKey, newEpoch);
1906
- }
1907
- }
1908
-
1909
- // ../atom.io/internal/src/transaction/apply-transaction.ts
1910
- var applyTransaction = (output, store7) => {
1911
- const child = newest(store7);
1912
- const { parent } = child;
1913
- if (parent === null || !isChildStore(child) || child.transactionMeta?.phase !== `building`) {
1914
- store7.logger.warn(`\uD83D\uDC1E`, `transaction`, `???`, `applyTransaction called outside of a transaction. This is probably a bug in AtomIO.`);
1915
- return;
1916
- }
1917
- child.transactionMeta.phase = `applying`;
1918
- child.transactionMeta.update.output = output;
1919
- parent.child = null;
1920
- parent.on.transactionApplying.next(child.transactionMeta);
1921
- const { updates } = child.transactionMeta.update;
1922
- store7.logger.info(`\uD83D\uDEC4`, `transaction`, child.transactionMeta.update.key, `Applying transaction with ${updates.length} updates:`, updates);
1923
- ingestTransactionUpdate(`newValue`, child.transactionMeta.update, parent);
1924
- if (isRootStore(parent)) {
1925
- setEpochNumberOfAction(child.transactionMeta.update.key, child.transactionMeta.update.epoch, parent);
1926
- const myTransaction = withdraw({ key: child.transactionMeta.update.key, type: `transaction` }, store7);
1927
- myTransaction?.subject.next(child.transactionMeta.update);
1928
- store7.logger.info(`\uD83D\uDEEC`, `transaction`, child.transactionMeta.update.key, `Finished applying transaction.`);
1929
- } else if (isChildStore(parent)) {
1930
- parent.transactionMeta.update.updates.push(child.transactionMeta.update);
1931
- }
1932
- parent.on.transactionApplying.next(null);
1933
- };
1934
- // ../atom.io/internal/src/lazy-map.ts
1935
- class LazyMap extends Map {
1936
- source;
1937
- deleted = new Set;
1938
- constructor(source) {
1939
- super();
1940
- this.source = source;
1941
- }
1942
- get(key) {
1943
- const has = super.has(key);
1944
- if (has) {
1945
- return super.get(key);
1946
- }
1947
- if (!this.deleted.has(key) && this.source.has(key)) {
1948
- const value = this.source.get(key);
1949
- return value;
1950
- }
1951
- return;
1952
- }
1953
- set(key, value) {
1954
- this.deleted.delete(key);
1955
- return super.set(key, value);
1956
- }
1957
- hasOwn(key) {
1958
- return super.has(key);
1959
- }
1960
- has(key) {
1961
- return !this.deleted.has(key) && (super.has(key) || this.source.has(key));
1962
- }
1963
- delete(key) {
1964
- this.deleted.add(key);
1965
- return super.delete(key);
1966
- }
1967
- }
1968
-
1969
- // ../atom.io/internal/src/transaction/build-transaction.ts
1970
- var buildTransaction = (key, params, store7, id) => {
1971
- const parent = newest(store7);
1972
- const childBase = {
1973
- parent,
1974
- child: null,
1975
- on: parent.on,
1976
- loggers: parent.loggers,
1977
- logger: parent.logger,
1978
- config: parent.config,
1979
- atoms: new LazyMap(parent.atoms),
1980
- atomsThatAreDefault: new Set(parent.atomsThatAreDefault),
1981
- families: new LazyMap(parent.families),
1982
- operation: { open: false },
1983
- readonlySelectors: new LazyMap(parent.readonlySelectors),
1984
- timelines: new LazyMap(parent.timelines),
1985
- timelineTopics: new Junction(parent.timelineTopics.toJSON()),
1986
- trackers: new Map,
1987
- transactions: new LazyMap(parent.transactions),
1988
- selectorAtoms: new Junction(parent.selectorAtoms.toJSON()),
1989
- selectorGraph: new Junction(parent.selectorGraph.toJSON(), {
1990
- makeContentKey: (...keys) => keys.sort().join(`:`)
1991
- }),
1992
- selectors: new LazyMap(parent.selectors),
1993
- valueMap: new LazyMap(parent.valueMap),
1994
- defaults: parent.defaults,
1995
- disposalTraces: store7.disposalTraces.copy(),
1996
- molecules: new LazyMap(parent.molecules),
1997
- moleculeFamilies: new LazyMap(parent.moleculeFamilies),
1998
- moleculeInProgress: parent.moleculeInProgress,
1999
- miscResources: new LazyMap(parent.miscResources)
2000
- };
2001
- const epoch = getEpochNumberOfAction(key, store7);
2002
- const transactionMeta = {
2003
- phase: `building`,
2004
- update: {
2005
- type: `transaction_update`,
2006
- key,
2007
- id,
2008
- epoch: epoch === undefined ? Number.NaN : epoch + 1,
2009
- updates: [],
2010
- params,
2011
- output: undefined
2012
- },
2013
- toolkit: {
2014
- get: (...ps) => getFromStore(child, ...ps),
2015
- set: (...ps) => {
2016
- setIntoStore(child, ...ps);
2017
- },
2018
- run: (token, identifier = arbitrary()) => actUponStore(token, identifier, child),
2019
- find: (token, k) => findInStore(child, token, k),
2020
- seek: (token, k) => seekInStore(child, token, k),
2021
- json: (token) => getJsonToken(child, token),
2022
- make: (context, family, k, ...args) => makeMoleculeInStore(child, context, family, k, ...args),
2023
- dispose: (...ps) => {
2024
- disposeFromStore(child, ...ps);
2025
- },
2026
- env: () => getEnvironmentData(child)
2027
- }
2028
- };
2029
- const child = Object.assign(childBase, {
2030
- transactionMeta
2031
- });
2032
- parent.child = child;
2033
- store7.logger.info(`\uD83D\uDEEB`, `transaction`, key, `Building transaction with params:`, params);
2034
- return child;
2035
- };
2036
- // ../atom.io/internal/src/transaction/create-transaction.ts
2037
- function createTransaction(options, store8) {
2038
- const newTransaction = {
2039
- key: options.key,
2040
- type: `transaction`,
2041
- run: (params, id) => {
2042
- const childStore = buildTransaction(options.key, params, store8, id);
2043
- try {
2044
- const target2 = newest(store8);
2045
- const { toolkit } = childStore.transactionMeta;
2046
- const output = options.do(toolkit, ...params);
2047
- applyTransaction(output, target2);
2048
- return output;
2049
- } catch (thrown) {
2050
- abortTransaction(target);
2051
- store8.logger.warn(`\uD83D\uDCA5`, `transaction`, options.key, `caught:`, thrown);
2052
- throw thrown;
2053
- }
2054
- },
2055
- install: (s) => createTransaction(options, s),
2056
- subject: new Subject
2057
- };
2058
- const target = newest(store8);
2059
- target.transactions.set(newTransaction.key, newTransaction);
2060
- const token = deposit(newTransaction);
2061
- store8.on.transactionCreation.next(token);
2062
- return token;
2063
- }
2064
- // ../atom.io/internal/src/transaction/get-epoch-number.ts
2065
- function getEpochNumberOfAction(transactionKey, store8) {
2066
- const isRoot = isRootStore(store8);
2067
- const continuity = isRoot ? store8.transactionMeta.actionContinuities.getRelatedKey(transactionKey) : undefined;
2068
- const epoch = isRoot && continuity !== undefined ? store8.transactionMeta.epoch.get(continuity) : undefined;
2069
- return epoch;
2070
- }
2071
- // ../atom.io/internal/src/store/circular-buffer.ts
2072
- class CircularBuffer {
2073
- _buffer;
2074
- _index = 0;
2075
- constructor(lengthOrArray) {
2076
- let length;
2077
- if (typeof lengthOrArray === `number`) {
2078
- length = lengthOrArray;
2079
- } else {
2080
- length = lengthOrArray.length;
2081
- }
2082
- this._buffer = Array.from({ length });
2083
- }
2084
- get buffer() {
2085
- return this._buffer;
2086
- }
2087
- get index() {
2088
- return this._index;
2089
- }
2090
- add(item) {
2091
- this._buffer[this._index] = item;
2092
- this._index = (this._index + 1) % this._buffer.length;
2093
- }
2094
- copy() {
2095
- const copy = new CircularBuffer([...this._buffer]);
2096
- copy._index = this._index;
2097
- return copy;
2098
- }
2099
- }
2100
-
2101
- // ../atom.io/internal/src/store/store.ts
2102
- class Store {
2103
- parent = null;
2104
- child = null;
2105
- valueMap = new Map;
2106
- defaults = new Map;
2107
- atoms = new Map;
2108
- selectors = new Map;
2109
- readonlySelectors = new Map;
2110
- atomsThatAreDefault = new Set;
2111
- selectorAtoms = new Junction({
2112
- between: [`selectorKey`, `atomKey`],
2113
- cardinality: `n:n`
2114
- });
2115
- selectorGraph = new Junction({
2116
- between: [`upstreamSelectorKey`, `downstreamSelectorKey`],
2117
- cardinality: `n:n`
2118
- }, {
2119
- makeContentKey: (...keys) => keys.sort().join(`:`)
2120
- });
2121
- trackers = new Map;
2122
- families = new Map;
2123
- transactions = new Map;
2124
- transactionMeta = {
2125
- epoch: new Map,
2126
- actionContinuities: new Junction({
2127
- between: [`continuity`, `action`],
2128
- cardinality: `1:n`
2129
- })
2130
- };
2131
- timelines = new Map;
2132
- timelineTopics = new Junction({
2133
- between: [`timelineKey`, `topicKey`],
2134
- cardinality: `1:n`
2135
- });
2136
- disposalTraces = new CircularBuffer(100);
2137
- molecules = new Map;
2138
- moleculeFamilies = new Map;
2139
- moleculeInProgress = null;
2140
- miscResources = new Map;
2141
- on = {
2142
- atomCreation: new Subject,
2143
- atomDisposal: new Subject,
2144
- selectorCreation: new Subject,
2145
- selectorDisposal: new Subject,
2146
- timelineCreation: new Subject,
2147
- transactionCreation: new Subject,
2148
- transactionApplying: new StatefulSubject(null),
2149
- operationClose: new Subject,
2150
- moleculeCreationStart: new Subject,
2151
- moleculeCreationDone: new Subject,
2152
- moleculeDisposal: new Subject
2153
- };
2154
- operation = { open: false };
2155
- config = {
2156
- name: `IMPLICIT_STORE`,
2157
- lifespan: `ephemeral`
2158
- };
2159
- loggers = [
2160
- new AtomIOLogger(`warn`, (_, __, key) => !key.includes(`\uD83D\uDD0D`))
2161
- ];
2162
- logger = {
2163
- error: (...messages) => {
2164
- for (const logger of this.loggers)
2165
- logger.error(...messages);
2166
- },
2167
- info: (...messages) => {
2168
- for (const logger of this.loggers)
2169
- logger.info(...messages);
2170
- },
2171
- warn: (...messages) => {
2172
- for (const logger of this.loggers)
2173
- logger.warn(...messages);
2174
- }
2175
- };
2176
- constructor(config, store8 = null) {
2177
- this.config = {
2178
- ...store8?.config,
2179
- ...config
2180
- };
2181
- if (store8 !== null) {
2182
- this.valueMap = new Map(store8?.valueMap);
2183
- this.operation = { ...store8?.operation };
2184
- if (isRootStore(store8)) {
2185
- this.transactionMeta = {
2186
- epoch: new Map(store8?.transactionMeta.epoch),
2187
- actionContinuities: new Junction(store8?.transactionMeta.actionContinuities.toJSON())
2188
- };
2189
- }
2190
- for (const [, family] of store8.families) {
2191
- if (family.internalRoles?.includes(`mutable`) || family.internalRoles?.includes(`join`)) {
2192
- continue;
2193
- }
2194
- family.install(this);
2195
- }
2196
- const mutableHelpers = new Set;
2197
- for (const [, atom4] of store8.atoms) {
2198
- if (mutableHelpers.has(atom4.key)) {
2199
- continue;
2200
- }
2201
- atom4.install(this);
2202
- if (atom4.type === `mutable_atom`) {
2203
- const originalJsonToken = getJsonToken(store8, atom4);
2204
- const originalUpdateToken = getUpdateToken(atom4);
2205
- mutableHelpers.add(originalJsonToken.key);
2206
- mutableHelpers.add(originalUpdateToken.key);
2207
- }
2208
- }
2209
- for (const [, selector2] of store8.readonlySelectors) {
2210
- selector2.install(this);
2211
- }
2212
- for (const [, selector2] of store8.selectors) {
2213
- if (mutableHelpers.has(selector2.key)) {
2214
- continue;
2215
- }
2216
- selector2.install(this);
2217
- }
2218
- for (const [, tx] of store8.transactions) {
2219
- tx.install(this);
2220
- }
2221
- for (const [, timeline] of store8.timelines) {
2222
- timeline.install(this);
2223
- }
2224
- }
2225
- }
2226
- }
2227
- var IMPLICIT = {
2228
- get STORE() {
2229
- if (!globalThis.ATOM_IO_IMPLICIT_STORE) {
2230
- globalThis.ATOM_IO_IMPLICIT_STORE = new Store({
2231
- name: `IMPLICIT_STORE`,
2232
- lifespan: `ephemeral`
2233
- });
2234
- }
2235
- return globalThis.ATOM_IO_IMPLICIT_STORE;
2236
- }
2237
- };
2238
- // ../atom.io/internal/src/store/withdraw.ts
2239
- function withdraw(token, store8) {
2240
- let withdrawn;
2241
- let target = store8;
2242
- while (target !== null) {
2243
- switch (token.type) {
2244
- case `atom`:
2245
- case `mutable_atom`:
2246
- withdrawn = target.atoms.get(token.key);
2247
- break;
2248
- case `selector`:
2249
- withdrawn = target.selectors.get(token.key);
2250
- break;
2251
- case `readonly_selector`:
2252
- withdrawn = target.readonlySelectors.get(token.key);
2253
- break;
2254
- case `atom_family`:
2255
- case `mutable_atom_family`:
2256
- case `selector_family`:
2257
- case `readonly_selector_family`:
2258
- withdrawn = target.families.get(token.key);
2259
- break;
2260
- case `timeline`:
2261
- withdrawn = target.timelines.get(token.key);
2262
- break;
2263
- case `transaction`:
2264
- withdrawn = target.transactions.get(token.key);
2265
- break;
2266
- case `molecule`:
2267
- withdrawn = target.molecules.get(stringifyJson(token.key));
2268
- break;
2269
- case `molecule_family`:
2270
- withdrawn = target.moleculeFamilies.get(token.key);
2271
- break;
2272
- }
2273
- if (withdrawn) {
2274
- return withdrawn;
2275
- }
2276
- target = target.child;
2277
- }
2278
- throw new NotFoundError(token, store8);
2279
- }
2280
- // ../atom.io/internal/src/molecule/dispose-molecule.ts
2281
- function disposeMolecule(token, store10) {
2282
- let molecule3;
2283
- molecule3 = withdraw(token, store10);
2284
- const { family } = token;
2285
- for (const join3 of molecule3.joins.values()) {
2286
- join3.relations.delete(molecule3.key);
2287
- join3.molecules.delete(molecule3.stringKey);
2288
- }
2289
- const context = [];
2290
- for (const above of molecule3.above.values()) {
2291
- context.push(deposit(above));
2292
- }
2293
- const values = [];
2294
- for (const stateToken of molecule3.tokens.values()) {
2295
- const tokenFamily = stateToken.family;
2296
- values.push([tokenFamily.key, store10.valueMap.get(stateToken.key)]);
2297
- }
2298
- if (family) {
2299
- const Formula = withdraw(family, store10);
2300
- const disposalEvent = {
2301
- type: `molecule_disposal`,
2302
- token,
2303
- family,
2304
- context,
2305
- values
2306
- };
2307
- if (token.family) {
2308
- disposalEvent.family = token.family;
2309
- }
2310
- for (const state of molecule3.tokens.values()) {
2311
- disposeFromStore(store10, state);
2312
- }
2313
- for (const child of molecule3.below.values()) {
2314
- if (child.family?.dependsOn === `all`) {
2315
- disposeMolecule(child, store10);
2316
- } else {
2317
- child.above.delete(molecule3.stringKey);
2318
- if (child.above.size === 0) {
2319
- disposeMolecule(child, store10);
2320
- }
2321
- }
2322
- }
2323
- molecule3.below.clear();
2324
- const isTransaction = isChildStore(store10) && store10.transactionMeta.phase === `building`;
2325
- if (isTransaction) {
2326
- store10.transactionMeta.update.updates.push(disposalEvent);
2327
- } else {
2328
- Formula.subject.next(disposalEvent);
2329
- }
2330
- store10.molecules.delete(molecule3.stringKey);
2331
- }
2332
- for (const parent of molecule3.above.values()) {
2333
- parent.below.delete(molecule3.stringKey);
2334
- }
2335
- }
2336
-
2337
- // ../atom.io/internal/src/families/init-family-member.ts
2338
- function initFamilyMemberInStore(store10, token, key) {
2339
- const familyKey = token.key;
2340
- const family = store10.families.get(familyKey);
2341
- if (family === undefined) {
2342
- throw new NotFoundError(token, store10);
2343
- }
2344
- const state = family(key);
2345
- const target = newest(store10);
2346
- if (state.family && target.moleculeInProgress === null) {
2347
- if (isRootStore(target)) {
2348
- switch (state.type) {
2349
- case `atom`:
2350
- case `mutable_atom`:
2351
- store10.on.atomCreation.next(state);
2352
- break;
2353
- case `selector`:
2354
- case `readonly_selector`:
2355
- store10.on.selectorCreation.next(state);
2356
- break;
2357
- }
2358
- } else if (isChildStore(target) && target.on.transactionApplying.state === null) {
2359
- target.transactionMeta.update.updates.push({
2360
- type: `state_creation`,
2361
- token: state
2362
- });
2363
- }
2364
- }
2365
- return state;
2366
- }
2367
-
2368
- // ../atom.io/internal/src/families/seek-in-store.ts
2369
- function seekInStore(store11, token, key) {
2370
- const subKey = stringifyJson(key);
2371
- const fullKey = `${token.key}(${subKey})`;
2372
- const target = newest(store11);
2373
- let state;
2374
- switch (token.type) {
2375
- case `atom_family`:
2376
- case `mutable_atom_family`:
2377
- state = target.atoms.get(fullKey);
2378
- break;
2379
- case `selector_family`:
2380
- state = target.selectors.get(fullKey);
2381
- break;
2382
- case `readonly_selector_family`:
2383
- state = target.readonlySelectors.get(fullKey);
2384
- break;
2385
- case `molecule_family`:
2386
- state = target.molecules.get(stringifyJson(key));
2387
- }
2388
- if (state) {
2389
- return deposit(state);
2390
- }
2391
- return state;
2392
- }
2393
-
2394
- // ../atom.io/internal/src/families/find-in-store.ts
2395
- function findInStore(store12, token, key) {
2396
- let state = seekInStore(store12, token, key);
2397
- if (state) {
2398
- return state;
2399
- }
2400
- const molecule4 = store12.molecules.get(stringifyJson(key));
2401
- if (molecule4) {
2402
- return growMoleculeInStore(molecule4, token, store12);
2403
- }
2404
- if (store12.config.lifespan === `immortal`) {
2405
- const fakeToken = counterfeit(token, key);
2406
- store12.logger.error(`\u274C`, fakeToken.type, fakeToken.key, `was not found in store "${store12.config.name}"; returned a counterfeit token.`);
2407
- return fakeToken;
2408
- }
2409
- state = initFamilyMemberInStore(store12, token, key);
2410
- return state;
2411
- }
2412
-
2413
- // ../atom.io/internal/src/families/dispose-from-store.ts
2414
- function disposeFromStore(store13, ...params) {
2415
- let token;
2416
- let fullKey;
2417
- if (params.length === 1) {
2418
- token = params[0];
2419
- fullKey = token.key;
2420
- } else {
2421
- const family = params[0];
2422
- const key = params[1];
2423
- const maybeToken = family.type === `molecule_family` ? seekInStore(store13, family, key) ?? counterfeit(family, key) : findInStore(store13, family, key);
2424
- token = maybeToken;
2425
- }
2426
- try {
2427
- withdraw(token, store13);
2428
- } catch (thrown) {
2429
- const disposal = store13.disposalTraces.buffer.find((item) => item?.key === token.key);
2430
- store13.logger.error(`\u274C`, token.type, token.key, `could not be disposed because it was not found in the store "${store13.config.name}".`, disposal ? `\n This state was most recently disposed\n${disposal.trace}` : `No previous disposal trace was found.`);
2431
- return;
2432
- }
2433
- switch (token.type) {
2434
- case `atom`:
2435
- case `mutable_atom`:
2436
- disposeAtom(token, store13);
2437
- break;
2438
- case `selector`:
2439
- case `readonly_selector`:
2440
- disposeSelector(token, store13);
2441
- break;
2442
- case `molecule`:
2443
- disposeMolecule(token, store13);
2444
- break;
2445
- }
2446
- const { stack } = new Error;
2447
- if (stack) {
2448
- const trace = stack?.split(`\n`)?.slice(3)?.join(`\n`);
2449
- store13.disposalTraces.add({ key: token.key, trace });
2450
- }
2451
- }
2452
- // ../atom.io/internal/src/keys.ts
2453
- var isAtomKey = (key, store13) => newest(store13).atoms.has(key);
2454
- var isSelectorKey = (key, store13) => newest(store13).selectors.has(key);
2455
- var isReadonlySelectorKey = (key, store13) => newest(store13).readonlySelectors.has(key);
2456
- var isStateKey = (key, store13) => isAtomKey(key, store13) || isSelectorKey(key, store13) || isReadonlySelectorKey(key, store13);
2457
-
2458
- // ../atom.io/internal/src/selector/get-selector-dependency-keys.ts
2459
- var getSelectorDependencyKeys = (key, store13) => {
2460
- const sources = newest(store13).selectorGraph.getRelationEntries({ downstreamSelectorKey: key }).filter(([_, { source }]) => source !== key).map(([_, { source }]) => source).filter((source) => isStateKey(source, store13));
2461
- return sources;
2462
- };
2463
-
2464
- // ../atom.io/internal/src/selector/trace-selector-atoms.ts
2465
- var traceSelectorAtoms = (directDependencyKey, covered, store13) => {
2466
- const rootKeys = [];
2467
- const indirectDependencyKeys = getSelectorDependencyKeys(directDependencyKey, store13);
2468
- while (indirectDependencyKeys.length > 0) {
2469
- const indirectDependencyKey = indirectDependencyKeys.shift();
2470
- if (covered.has(indirectDependencyKey)) {
2471
- continue;
2472
- }
2473
- covered.add(indirectDependencyKey);
2474
- if (!isAtomKey(indirectDependencyKey, store13)) {
2475
- indirectDependencyKeys.push(...getSelectorDependencyKeys(indirectDependencyKey, store13));
2476
- } else if (!rootKeys.includes(indirectDependencyKey)) {
2477
- rootKeys.push(indirectDependencyKey);
2478
- }
2479
- }
2480
- return rootKeys;
2481
- };
2482
- var traceAllSelectorAtoms = (selector3, store13) => {
2483
- const selectorKey = selector3.key;
2484
- const directDependencyKeys = getSelectorDependencyKeys(selectorKey, store13);
2485
- const covered = new Set;
2486
- return directDependencyKeys.flatMap((depKey) => isAtomKey(depKey, store13) ? depKey : traceSelectorAtoms(depKey, covered, store13));
2487
- };
2488
-
2489
- // ../atom.io/internal/src/selector/update-selector-atoms.ts
2490
- var updateSelectorAtoms = (selectorKey, dependency, covered, store13) => {
2491
- const target = newest(store13);
2492
- if (dependency.type === `atom` || dependency.type === `mutable_atom`) {
2493
- target.selectorAtoms.set({
2494
- selectorKey,
2495
- atomKey: dependency.key
2496
- });
2497
- store13.logger.info(`\uD83D\uDD0D`, `selector`, selectorKey, `discovers root atom "${dependency.key}"`);
2498
- } else {
2499
- const rootKeys = traceSelectorAtoms(dependency.key, covered, store13);
2500
- store13.logger.info(`\uD83D\uDD0D`, `selector`, selectorKey, `discovers root atoms: [ ${rootKeys.map((key) => `"${key}"`).join(`, `)} ]`);
2501
- for (const atomKey of rootKeys) {
2502
- target.selectorAtoms = target.selectorAtoms.set({
2503
- selectorKey,
2504
- atomKey
2505
- });
2506
- }
2507
- }
2508
- covered.add(dependency.key);
2509
- };
2510
-
2511
- // ../atom.io/internal/src/selector/register-selector.ts
2512
- var registerSelector = (selectorKey, covered, store14) => ({
2513
- get: (...params) => {
2514
- const target = newest(store14);
2515
- let dependency;
2516
- if (params.length === 2) {
2517
- const [family, key] = params;
2518
- switch (family.type) {
2519
- case `molecule_family`:
2520
- return getFromStore(store14, family, key);
2521
- default:
2522
- if (store14.config.lifespan === `ephemeral`) {
2523
- dependency = findInStore(store14, family, key);
2524
- } else {
2525
- const maybeDependency = seekInStore(store14, family, key);
2526
- if (maybeDependency) {
2527
- dependency = maybeDependency;
2528
- } else {
2529
- throw new NotFoundError(family, key, store14);
2530
- }
2531
- }
2532
- }
2533
- } else {
2534
- [dependency] = params;
2535
- }
2536
- if (dependency.type === `molecule`) {
2537
- return getFromStore(store14, dependency);
2538
- }
2539
- const dependencyState = withdraw(dependency, store14);
2540
- const dependencyValue = readOrComputeValue(dependencyState, store14);
2541
- store14.logger.info(`\uD83D\uDD0C`, `selector`, selectorKey, `registers dependency ( "${dependency.key}" =`, dependencyValue, `)`);
2542
- target.selectorGraph.set({
2543
- upstreamSelectorKey: dependency.key,
2544
- downstreamSelectorKey: selectorKey
2545
- }, {
2546
- source: dependency.key
2547
- });
2548
- updateSelectorAtoms(selectorKey, dependency, covered, store14);
2549
- return dependencyValue;
2550
- },
2551
- set: (...params) => {
2552
- let token;
2553
- let value;
2554
- if (params.length === 2) {
2555
- token = params[0];
2556
- value = params[1];
2557
- } else {
2558
- const family = params[0];
2559
- const key = params[1];
2560
- value = params[2];
2561
- const maybeToken = store14.config.lifespan === `ephemeral` ? findInStore(store14, family, key) : seekInStore(store14, family, key);
2562
- if (!maybeToken) {
2563
- throw new NotFoundError(family, key, store14);
2564
- }
2565
- token = maybeToken;
2566
- }
2567
- const target = newest(store14);
2568
- const state = withdraw(token, target);
2569
- setAtomOrSelector(state, value, target);
2570
- },
2571
- find: (token, key) => findInStore(store14, token, key),
2572
- seek: (token, key) => seekInStore(store14, token, key),
2573
- json: (token) => getJsonToken(store14, token)
2574
- });
2575
-
2576
- // ../atom.io/internal/src/selector/create-readonly-selector.ts
2577
- var createReadonlySelector = (store14, options, family) => {
2578
- const target = newest(store14);
2579
- const subject8 = new Subject;
2580
- const covered = new Set;
2581
- const { get, find, seek, json: json13 } = registerSelector(options.key, covered, target);
2582
- const getSelf = () => {
2583
- const value = options.get({ get, find, seek, json: json13 });
2584
- cacheValue(options.key, value, subject8, newest(store14));
2585
- covered.clear();
2586
- return value;
2587
- };
2588
- const readonlySelector = {
2589
- ...options,
2590
- subject: subject8,
2591
- install: (s) => createReadonlySelector(s, options, family),
2592
- get: getSelf,
2593
- type: `readonly_selector`,
2594
- ...family && { family }
2595
- };
2596
- target.readonlySelectors.set(options.key, readonlySelector);
2597
- const initialValue = getSelf();
2598
- store14.logger.info(`\u2728`, readonlySelector.type, readonlySelector.key, `=`, initialValue);
2599
- const token = {
2600
- key: options.key,
2601
- type: `readonly_selector`
2602
- };
2603
- if (family) {
2604
- token.family = family;
2605
- }
2606
- return token;
2607
- };
2608
- // ../atom.io/internal/src/selector/create-writable-selector.ts
2609
- var createWritableSelector = (store14, options, family) => {
2610
- const target = newest(store14);
2611
- const subject9 = new Subject;
2612
- const covered = new Set;
2613
- const setterToolkit = registerSelector(options.key, covered, target);
2614
- const { find, get, seek, json: json13 } = setterToolkit;
2615
- const getterToolkit = { find, get, seek, json: json13 };
2616
- const getSelf = (getFn = options.get, innerTarget = newest(store14)) => {
2617
- const value = getFn(getterToolkit);
2618
- cacheValue(options.key, value, subject9, innerTarget);
2619
- covered.clear();
2620
- return value;
2621
- };
2622
- const setSelf = (next) => {
2623
- const innerTarget = newest(store14);
2624
- const oldValue = getSelf(options.get, innerTarget);
2625
- const newValue = become(next)(oldValue);
2626
- store14.logger.info(`\uD83D\uDCDD`, `selector`, options.key, `set (`, oldValue, `->`, newValue, `)`);
2627
- cacheValue(options.key, newValue, subject9, innerTarget);
2628
- markDone(innerTarget, options.key);
2629
- if (isRootStore(innerTarget)) {
2630
- subject9.next({ newValue, oldValue });
2631
- }
2632
- options.set(setterToolkit, newValue);
2633
- };
2634
- const mySelector = {
2635
- ...options,
2636
- subject: subject9,
2637
- install: (s) => createWritableSelector(s, options, family),
2638
- get: getSelf,
2639
- set: setSelf,
2640
- type: `selector`,
2641
- ...family && { family }
2642
- };
2643
- target.selectors.set(options.key, mySelector);
2644
- const initialValue = getSelf();
2645
- store14.logger.info(`\u2728`, mySelector.type, mySelector.key, `=`, initialValue);
2646
- const token = {
2647
- key: options.key,
2648
- type: `selector`
2649
- };
2650
- if (family) {
2651
- token.family = family;
2652
- }
2653
- return token;
2654
- };
2655
-
2656
- // ../atom.io/internal/src/selector/create-standalone-selector.ts
2657
- function createStandaloneSelector(store14, options) {
2658
- const isWritable = `set` in options;
2659
- if (isWritable) {
2660
- const state2 = createWritableSelector(store14, options, undefined);
2661
- store14.on.selectorCreation.next(state2);
2662
- return state2;
2663
- }
2664
- const state = createReadonlySelector(store14, options, undefined);
2665
- store14.on.selectorCreation.next(state);
2666
- return state;
2667
- }
2668
- // ../atom.io/internal/src/selector/dispose-selector.ts
2669
- function disposeSelector(selectorToken, store14) {
2670
- const target = newest(store14);
2671
- const { key } = selectorToken;
2672
- const selector3 = withdraw(selectorToken, target);
2673
- if (!selector3.family) {
2674
- store14.logger.error(`\u274C`, `selector`, key, `Standalone selectors cannot be disposed.`);
2675
- } else {
2676
- const molecule4 = target.molecules.get(selector3.family.subKey);
2677
- if (molecule4) {
2678
- molecule4.tokens.delete(key);
2679
- }
2680
- switch (selectorToken.type) {
2681
- case `selector`:
2682
- {
2683
- target.selectors.delete(key);
2684
- const family = withdraw({ key: selector3.family.key, type: `selector_family` }, store14);
2685
- family.subject.next({
2686
- type: `state_disposal`,
2687
- token: selectorToken
2688
- });
2689
- }
2690
- break;
2691
- case `readonly_selector`:
2692
- {
2693
- target.readonlySelectors.delete(key);
2694
- const family = withdraw({ key: selector3.family.key, type: `readonly_selector_family` }, store14);
2695
- family.subject.next({
2696
- type: `state_disposal`,
2697
- token: selectorToken
2698
- });
2699
- }
2700
- break;
2701
- }
2702
- target.valueMap.delete(key);
2703
- target.selectorAtoms.delete(key);
2704
- target.selectorGraph.delete(key);
2705
- store14.logger.info(`\uD83D\uDD25`, selectorToken.type, key, `deleted`);
2706
- if (isChildStore(target) && target.transactionMeta.phase === `building`) {
2707
- target.transactionMeta.update.updates.push({
2708
- type: `state_disposal`,
2709
- token: selectorToken
2710
- });
2711
- } else {
2712
- store14.on.selectorDisposal.next(selectorToken);
2713
- }
2714
- }
2715
- }
2716
- // ../atom.io/internal/src/families/create-writable-selector-family.ts
2717
- function createWritableSelectorFamily(store14, options, internalRoles) {
2718
- const familyToken = {
2719
- key: options.key,
2720
- type: `selector_family`
2721
- };
2722
- const existing = store14.families.get(options.key);
2723
- if (existing) {
2724
- store14.logger.error(`\u2757`, `selector_family`, options.key, `Overwriting an existing ${prettyPrintTokenType(existing)} "${existing.key}" in store "${store14.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);
2725
- }
2726
- const subject10 = new Subject;
2727
- const familyFunction = (key) => {
2728
- const subKey = stringifyJson(key);
2729
- const family = { key: options.key, subKey };
2730
- const fullKey = `${options.key}(${subKey})`;
2731
- const target = newest(store14);
2732
- const token = createWritableSelector(target, {
2733
- key: fullKey,
2734
- get: options.get(key),
2735
- set: options.set(key)
2736
- }, family);
2737
- subject10.next({ type: `state_creation`, token });
2738
- return token;
2739
- };
2740
- const selectorFamily2 = Object.assign(familyFunction, familyToken, {
2741
- internalRoles,
2742
- subject: subject10,
2743
- install: (s) => createWritableSelectorFamily(s, options),
2744
- default: (key) => {
2745
- const getFn = options.get(key);
2746
- return getFn({
2747
- get: (...ps) => getFromStore(store14, ...ps),
2748
- find: (token, k) => findInStore(store14, token, k),
2749
- seek: (token, k) => seekInStore(store14, token, k),
2750
- json: (token) => getJsonToken(store14, token)
2751
- });
2752
- }
2753
- });
2754
- store14.families.set(options.key, selectorFamily2);
2755
- return familyToken;
2756
- }
2757
-
2758
- // ../atom.io/json/src/select-json-family.ts
2759
- function selectJsonFamily(atomFamilyToken, transform, store14 = IMPLICIT.STORE) {
2760
- const jsonFamily = createWritableSelectorFamily(store14, {
2761
- key: `${atomFamilyToken.key}:JSON`,
2762
- get: (key) => ({ seek, get }) => {
2763
- const existingState = seek(atomFamilyToken, key);
2764
- if (existingState) {
2765
- return transform.toJson(get(existingState));
2766
- }
2767
- const stringKey = stringifyJson(key);
2768
- const molecule4 = store14.molecules.get(stringKey);
2769
- if (molecule4) {
2770
- const atom5 = growMoleculeInStore(molecule4, atomFamilyToken, store14);
2771
- return transform.toJson(get(atom5));
2772
- }
2773
- if (store14.config.lifespan === `immortal`) {
2774
- throw new Error(`No molecule found for key "${stringKey}"`);
2775
- }
2776
- const newToken = initFamilyMemberInStore(store14, atomFamilyToken, key);
2777
- return transform.toJson(get(newToken));
2778
- },
2779
- set: (key) => ({ seek, set }, newValue) => {
2780
- const existingState = seek(atomFamilyToken, key);
2781
- if (existingState) {
2782
- set(existingState, transform.fromJson(newValue));
2783
- } else {
2784
- const stringKey = stringifyJson(key);
2785
- const molecule4 = store14.molecules.get(stringKey);
2786
- if (molecule4) {
2787
- const atom5 = growMoleculeInStore(molecule4, atomFamilyToken, store14);
2788
- set(atom5, transform.fromJson(newValue));
2789
- } else {
2790
- if (store14.config.lifespan === `immortal`) {
2791
- throw new Error(`No molecule found for key "${stringKey}"`);
2792
- }
2793
- set(initFamilyMemberInStore(store14, atomFamilyToken, key), transform.fromJson(newValue));
2794
- }
2795
- }
2796
- }
2797
- }, [`mutable`, `json`]);
2798
- const atomFamily2 = withdraw(atomFamilyToken, store14);
2799
- atomFamily2.subject.subscribe(`store=${store14.config.name}::json-selector-family`, (event) => {
2800
- if (event.token.family) {
2801
- seekInStore(store14, jsonFamily, parseJson(event.token.family.subKey));
2802
- }
2803
- });
2804
- return jsonFamily;
2805
- }
2806
-
2807
- // ../atom.io/json/src/index.ts
2808
- var parseJson = (str) => JSON.parse(str);
2809
- var stringifyJson = (json14) => JSON.stringify(json14);
2810
- var JSON_PROTOTYPES = [
2811
- Array.prototype,
2812
- Boolean.prototype,
2813
- Number.prototype,
2814
- Object.prototype,
2815
- String.prototype
2816
- ];
2817
-
2818
- // ../atom.io/internal/src/subscribe/recall-state.ts
2819
- var recallState = (state, store14) => {
2820
- const target = newest(store14);
2821
- if (target.operation.open) {
2822
- return target.operation.prev.get(state.key);
2823
- }
2824
- return target.valueMap.get(state.key);
2825
- };
2826
- // ../atom.io/internal/src/subscribe/subscribe-to-root-atoms.ts
2827
- var subscribeToRootAtoms = (selector5, store14) => {
2828
- const target = newest(store14);
2829
- const dependencySubscriptions = traceAllSelectorAtoms(selector5, store14).map((atomKey) => {
2830
- const atom5 = target.atoms.get(atomKey);
2831
- if (atom5 === undefined) {
2832
- throw new Error(`Atom "${atomKey}", a dependency of selector "${selector5.key}", not found in store "${store14.config.name}".`);
2833
- }
2834
- return atom5.subject.subscribe(`${selector5.type}:${selector5.key}`, (atomChange) => {
2835
- store14.logger.info(`\uD83D\uDCE2`, selector5.type, selector5.key, `root`, atomKey, `went`, atomChange.oldValue, `->`, atomChange.newValue);
2836
- const oldValue = recallState(selector5, target);
2837
- const newValue = readOrComputeValue(selector5, target);
2838
- store14.logger.info(`\u2728`, selector5.type, selector5.key, `went`, oldValue, `->`, newValue);
2839
- selector5.subject.next({ newValue, oldValue });
2840
- });
2841
- });
2842
- return dependencySubscriptions;
2843
- };
2844
- // ../atom.io/internal/src/subscribe/subscribe-to-state.ts
2845
- function subscribeToState(token, handleUpdate, key, store15) {
2846
- function safelyHandleUpdate(update) {
2847
- if (store15.operation.open) {
2848
- const unsubscribe2 = store15.on.operationClose.subscribe(`state subscription ${key}`, () => {
2849
- unsubscribe2();
2850
- handleUpdate(update);
2851
- });
2852
- } else {
2853
- handleUpdate(update);
2854
- }
2855
- }
2856
- const state = withdraw(token, store15);
2857
- store15.logger.info(`\uD83D\uDC40`, state.type, state.key, `Adding subscription "${key}"`);
2858
- const isSelector = state.type === `selector` || state.type === `readonly_selector`;
2859
- let dependencyUnsubFunctions = null;
2860
- let updateHandler = safelyHandleUpdate;
2861
- if (isSelector) {
2862
- dependencyUnsubFunctions = subscribeToRootAtoms(state, store15);
2863
- updateHandler = (update) => {
2864
- if (dependencyUnsubFunctions) {
2865
- dependencyUnsubFunctions.length = 0;
2866
- dependencyUnsubFunctions.push(...subscribeToRootAtoms(state, store15));
2867
- }
2868
- safelyHandleUpdate(update);
2869
- };
2870
- }
2871
- const mainUnsubFunction = state.subject.subscribe(key, updateHandler);
2872
- const unsubscribe = () => {
2873
- store15.logger.info(`\uD83D\uDE48`, state.type, state.key, `Removing subscription "${key}"`);
2874
- mainUnsubFunction();
2875
- if (dependencyUnsubFunctions) {
2876
- for (const unsubFromDependency of dependencyUnsubFunctions) {
2877
- unsubFromDependency();
2878
- }
2879
- }
2880
- };
2881
- return unsubscribe;
2882
- }
2883
- // ../atom.io/internal/src/subscribe/subscribe-to-timeline.ts
2884
- var subscribeToTimeline = (token, handleUpdate, key, store15) => {
2885
- const tl = withdraw(token, store15);
2886
- store15.logger.info(`\uD83D\uDC40`, `timeline`, token.key, `Adding subscription "${key}"`);
2887
- const unsubscribe = tl.subject.subscribe(key, handleUpdate);
2888
- return () => {
2889
- store15.logger.info(`\uD83D\uDE48`, `timeline`, token.key, `Removing subscription "${key}" from timeline`);
2890
- unsubscribe();
2891
- };
2892
- };
2893
- // ../atom.io/internal/src/mutable/tracker.ts
2894
- class Tracker {
2895
- Update;
2896
- initializeState(mutableState, store15) {
2897
- const latestUpdateStateKey = `*${mutableState.key}`;
2898
- store15.atoms.delete(latestUpdateStateKey);
2899
- store15.valueMap.delete(latestUpdateStateKey);
2900
- const familyMetaData = mutableState.family ? {
2901
- key: `*${mutableState.family.key}`,
2902
- subKey: mutableState.family.subKey
2903
- } : undefined;
2904
- const latestUpdateState = createRegularAtom(store15, {
2905
- key: latestUpdateStateKey,
2906
- default: null
2907
- }, familyMetaData);
2908
- if (store15.parent?.valueMap.has(latestUpdateStateKey)) {
2909
- const parentValue = store15.parent.valueMap.get(latestUpdateStateKey);
2910
- store15.valueMap.set(latestUpdateStateKey, parentValue);
2911
- }
2912
- return latestUpdateState;
2913
- }
2914
- unsubscribeFromInnerValue;
2915
- unsubscribeFromState;
2916
- observeCore(mutableState, latestUpdateState, target) {
2917
- const subscriptionKey = `tracker:${target.config.name}:${isChildStore(target) ? target.transactionMeta.update.key : `main`}:${mutableState.key}`;
2918
- const originalInnerValue = getFromStore(target, mutableState);
2919
- this.unsubscribeFromInnerValue = originalInnerValue.subscribe(subscriptionKey, (update) => {
2920
- setIntoStore(target, latestUpdateState, update);
2921
- });
2922
- this.unsubscribeFromState = subscribeToState(mutableState, (update) => {
2923
- if (update.newValue !== update.oldValue) {
2924
- this.unsubscribeFromInnerValue();
2925
- this.unsubscribeFromInnerValue = update.newValue.subscribe(subscriptionKey, (transceiverUpdate) => {
2926
- setIntoStore(target, latestUpdateState, transceiverUpdate);
2927
- });
2928
- }
2929
- }, subscriptionKey, target);
2930
- }
2931
- updateCore(mutableState, latestUpdateState, target) {
2932
- const subscriptionKey = `tracker:${target.config.name}:${isChildStore(target) ? target.transactionMeta.update.key : `main`}:${mutableState.key}`;
2933
- subscribeToState(latestUpdateState, ({ newValue, oldValue }) => {
2934
- const timelineId = target.timelineTopics.getRelatedKey(latestUpdateState.key);
2935
- if (timelineId) {
2936
- const timelineData = target.timelines.get(timelineId);
2937
- if (timelineData?.timeTraveling) {
2938
- const unsubscribe2 = subscribeToTimeline({ key: timelineId, type: `timeline` }, (update) => {
2939
- unsubscribe2();
2940
- setIntoStore(target, mutableState, (transceiver) => {
2941
- if (update === `redo` && newValue) {
2942
- transceiver.do(newValue);
2943
- } else if (update === `undo` && oldValue) {
2944
- transceiver.undo(oldValue);
2945
- }
2946
- return transceiver;
2947
- });
2948
- }, subscriptionKey, target);
2949
- return;
2950
- }
2951
- }
2952
- const unsubscribe = target.on.operationClose.subscribe(subscriptionKey, () => {
2953
- unsubscribe();
2954
- const mutable7 = getFromStore(target, mutableState);
2955
- const updateNumber = newValue === null ? -1 : mutable7.getUpdateNumber(newValue);
2956
- const eventOffset = updateNumber - mutable7.cacheUpdateNumber;
2957
- if (newValue && eventOffset === 1) {
2958
- setIntoStore(target, mutableState, (transceiver) => (transceiver.do(newValue), transceiver));
2959
- } else {
2960
- target.logger.info(`\u274C`, `mutable_atom`, mutableState.key, `could not be updated. Expected update number ${mutable7.cacheUpdateNumber + 1}, but got ${updateNumber}`);
2961
- }
2962
- });
2963
- }, subscriptionKey, target);
2964
- }
2965
- mutableState;
2966
- latestUpdateState;
2967
- dispose;
2968
- constructor(mutableState, store15) {
2969
- this.mutableState = mutableState;
2970
- const target = newest(store15);
2971
- this.latestUpdateState = this.initializeState(mutableState, target);
2972
- this.observeCore(mutableState, this.latestUpdateState, target);
2973
- this.updateCore(mutableState, this.latestUpdateState, target);
2974
- target.trackers.set(mutableState.key, this);
2975
- this.dispose = () => {
2976
- this.unsubscribeFromInnerValue();
2977
- this.unsubscribeFromState();
2978
- target.trackers.delete(mutableState.key);
2979
- };
2980
- }
2981
- }
2982
-
2983
- // ../atom.io/internal/src/mutable/create-mutable-atom.ts
2984
- function createMutableAtom(store16, options, family) {
2985
- store16.logger.info(`\uD83D\uDD28`, `atom`, options.key, `creating in store "${store16.config.name}"`);
2986
- const target = newest(store16);
2987
- const existing = target.atoms.get(options.key);
2988
- if (existing && existing.type === `mutable_atom`) {
2989
- store16.logger.error(`\u274C`, `atom`, options.key, `Tried to create atom, but it already exists in the store.`);
2990
- return deposit(existing);
2991
- }
2992
- const subject11 = new Subject;
2993
- const newAtom = {
2994
- ...options,
2995
- type: `mutable_atom`,
2996
- install: (s) => {
2997
- s.logger.info(`\uD83D\uDEE0\uFE0F`, `atom`, options.key, `installing in store "${s.config.name}"`);
2998
- return createMutableAtom(s, options, family);
2999
- },
3000
- subject: subject11
3001
- };
3002
- if (family) {
3003
- newAtom.family = family;
3004
- }
3005
- const initialValue = options.default();
3006
- target.atoms.set(newAtom.key, newAtom);
3007
- markAtomAsDefault(options.key, store16);
3008
- cacheValue(options.key, initialValue, subject11, target);
3009
- const token = deposit(newAtom);
3010
- if (options.effects) {
3011
- let effectIndex = 0;
3012
- const cleanupFunctions = [];
3013
- for (const effect of options.effects) {
3014
- const cleanup = effect({
3015
- setSelf: (next) => {
3016
- setIntoStore(store16, token, next);
3017
- },
3018
- onSet: (handle) => subscribeToState(token, handle, `effect[${effectIndex}]`, store16)
3019
- });
3020
- if (cleanup) {
3021
- cleanupFunctions.push(cleanup);
3022
- }
3023
- ++effectIndex;
3024
- }
3025
- newAtom.cleanup = () => {
3026
- for (const cleanup of cleanupFunctions) {
3027
- cleanup();
3028
- }
3029
- };
3030
- }
3031
- new Tracker(token, store16);
3032
- if (!family) {
3033
- selectJson(token, options, store16);
3034
- }
3035
- return token;
3036
- }
3037
- // ../atom.io/internal/src/mutable/tracker-family.ts
3038
- class FamilyTracker {
3039
- Update;
3040
- latestUpdateAtoms;
3041
- mutableAtoms;
3042
- constructor(mutableAtoms, store17) {
3043
- const updateAtoms = createRegularAtomFamily(store17, {
3044
- key: `*${mutableAtoms.key}`,
3045
- default: null
3046
- }, [`mutable`, `updates`]);
3047
- this.latestUpdateAtoms = withdraw(updateAtoms, store17);
3048
- this.mutableAtoms = mutableAtoms;
3049
- this.mutableAtoms.subject.subscribe(`store=${store17.config.name}::tracker-atom-family`, (event) => {
3050
- if (event.token.family) {
3051
- const key = parseJson(event.token.family.subKey);
3052
- seekInStore(store17, this.latestUpdateAtoms, key);
3053
- new Tracker(event.token, store17);
3054
- }
3055
- });
3056
- this.latestUpdateAtoms.subject.subscribe(`store=${store17.config.name}::tracker-atom-family`, (event) => {
3057
- if (event.token.family) {
3058
- const key = parseJson(event.token.family.subKey);
3059
- const mutableAtomToken = seekInStore(store17, this.mutableAtoms, key);
3060
- if (mutableAtomToken) {
3061
- new Tracker(mutableAtomToken, store17);
3062
- }
3063
- }
3064
- });
3065
- }
3066
- }
3067
-
3068
- // ../atom.io/internal/src/mutable/create-mutable-atom-family.ts
3069
- function createMutableAtomFamily(store17, options, internalRoles) {
3070
- const familyToken = {
3071
- key: options.key,
3072
- type: `mutable_atom_family`
3073
- };
3074
- const existing = store17.families.get(options.key);
3075
- if (existing) {
3076
- store17.logger.error(`\u2757`, `mutable_atom_family`, options.key, `Overwriting an existing ${prettyPrintTokenType(existing)} "${existing.key}" in store "${store17.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);
3077
- }
3078
- const subject12 = new Subject;
3079
- const familyFunction = (key) => {
3080
- const subKey = stringifyJson(key);
3081
- const family = { key: options.key, subKey };
3082
- const fullKey = `${options.key}(${subKey})`;
3083
- const target = newest(store17);
3084
- const individualOptions = {
3085
- key: fullKey,
3086
- default: () => options.default(key),
3087
- toJson: options.toJson,
3088
- fromJson: options.fromJson,
3089
- mutable: true
3090
- };
3091
- if (options.effects) {
3092
- individualOptions.effects = options.effects(key);
3093
- }
3094
- const token = createMutableAtom(target, individualOptions, family);
3095
- subject12.next({ type: `state_creation`, token });
3096
- return token;
3097
- };
3098
- const atomFamily2 = Object.assign(familyFunction, familyToken, {
3099
- subject: subject12,
3100
- install: (s) => createMutableAtomFamily(s, options),
3101
- toJson: options.toJson,
3102
- fromJson: options.fromJson,
3103
- internalRoles
3104
- });
3105
- store17.families.set(options.key, atomFamily2);
3106
- selectJsonFamily(atomFamily2, options, store17);
3107
- new FamilyTracker(atomFamily2, store17);
3108
- return familyToken;
3109
- }
3110
- // ../atom.io/internal/src/mutable/get-json-family.ts
3111
- var getJsonFamily = (mutableAtomFamily, store17) => {
3112
- const target = newest(store17);
3113
- const key = `${mutableAtomFamily.key}:JSON`;
3114
- const jsonFamily = target.families.get(key);
3115
- return jsonFamily;
3116
- };
3117
- // ../atom.io/internal/src/mutable/get-json-token.ts
3118
- var getJsonToken = (store18, mutableAtomToken) => {
3119
- if (mutableAtomToken.family) {
3120
- const target = newest(store18);
3121
- const jsonFamilyKey = `${mutableAtomToken.family.key}:JSON`;
3122
- const jsonFamilyToken = {
3123
- key: jsonFamilyKey,
3124
- type: `selector_family`
3125
- };
3126
- const family = withdraw(jsonFamilyToken, target);
3127
- const subKey = JSON.parse(mutableAtomToken.family.subKey);
3128
- const jsonToken = findInStore(store18, family, subKey);
3129
- return jsonToken;
3130
- }
3131
- const token = {
3132
- type: `selector`,
3133
- key: `${mutableAtomToken.key}:JSON`
3134
- };
3135
- return token;
3136
- };
3137
- // ../atom.io/internal/src/mutable/get-update-token.ts
3138
- var getUpdateToken = (mutableAtomToken) => {
3139
- const key = `*${mutableAtomToken.key}`;
3140
- const updateToken = { type: `atom`, key };
3141
- if (mutableAtomToken.family) {
3142
- updateToken.family = {
3143
- key: `*${mutableAtomToken.family.key}`,
3144
- subKey: mutableAtomToken.family.subKey
3145
- };
3146
- }
3147
- return updateToken;
3148
- };
3149
- // ../atom.io/internal/src/mutable/transceiver.ts
3150
- function isTransceiver(value) {
3151
- return typeof value === `object` && value !== null && `do` in value && `undo` in value && `subscribe` in value;
3152
- }
3153
- // ../atom.io/internal/src/set-state/copy-mutable-if-needed.ts
3154
- function copyMutableIfNeeded(atom7, origin, target) {
3155
- const originValue = origin.valueMap.get(atom7.key);
3156
- const targetValue = target.valueMap.get(atom7.key);
3157
- if (originValue === targetValue) {
3158
- if (originValue === undefined) {
3159
- return typeof atom7.default === `function` ? atom7.default() : atom7.default;
3160
- }
3161
- origin.logger.info(`\uD83D\uDCC3`, `atom`, atom7.key, `copying`);
3162
- const jsonValue = atom7.toJson(originValue);
3163
- const copiedValue = atom7.fromJson(jsonValue);
3164
- target.valueMap.set(atom7.key, copiedValue);
3165
- new Tracker(atom7, origin);
3166
- return copiedValue;
3167
- }
3168
- return targetValue;
3169
- }
3170
-
3171
- // ../atom.io/internal/src/caching.ts
3172
- function cacheValue(key, value, subject12, target) {
3173
- const currentValue = target.valueMap.get(key);
3174
- if (currentValue instanceof Future) {
3175
- const future2 = currentValue;
3176
- future2.use(value);
3177
- }
3178
- if (value instanceof Promise) {
3179
- const future2 = new Future(value);
3180
- target.valueMap.set(key, future2);
3181
- future2.then((resolved) => {
3182
- cacheValue(key, resolved, subject12, target);
3183
- subject12.next({ newValue: resolved, oldValue: future2 });
3184
- }).catch((thrown) => {
3185
- target.logger.error(`\uD83D\uDCA5`, `state`, key, `rejected:`, thrown);
3186
- });
3187
- return future2;
3188
- }
3189
- target.valueMap.set(key, value);
3190
- return value;
3191
- }
3192
- var readCachedValue = (token, target) => {
3193
- let value = target.valueMap.get(token.key);
3194
- if (token.type === `mutable_atom` && isChildStore(target)) {
3195
- const { parent } = target;
3196
- const copiedValue = copyMutableIfNeeded(token, parent, target);
3197
- value = copiedValue;
3198
- }
3199
- return value;
3200
- };
3201
- var evictCachedValue = (key, target) => {
3202
- const currentValue = target.valueMap.get(key);
3203
- if (currentValue instanceof Future) {
3204
- const future2 = currentValue;
3205
- const selector5 = target.selectors.get(key) ?? target.readonlySelectors.get(key);
3206
- if (selector5) {
3207
- future2.use(selector5.get());
3208
- }
3209
- return;
3210
- }
3211
- if (target.operation.open) {
3212
- target.operation.prev.set(key, currentValue);
3213
- }
3214
- target.valueMap.delete(key);
3215
- target.logger.info(`\uD83D\uDDD1`, `state`, key, `evicted`);
3216
- };
3217
-
3218
- // ../atom.io/internal/src/atom/is-default.ts
3219
- var isAtomDefault = (key, store18) => {
3220
- const core = newest(store18);
3221
- return core.atomsThatAreDefault.has(key);
3222
- };
3223
- var markAtomAsDefault = (key, store18) => {
3224
- const core = newest(store18);
3225
- core.atomsThatAreDefault = new Set(core.atomsThatAreDefault).add(key);
3226
- };
3227
- var markAtomAsNotDefault = (key, store18) => {
3228
- const core = newest(store18);
3229
- core.atomsThatAreDefault = new Set(newest(store18).atomsThatAreDefault);
3230
- core.atomsThatAreDefault.delete(key);
3231
- };
3232
-
3233
- // ../atom.io/internal/src/atom/create-regular-atom.ts
3234
- function createRegularAtom(store19, options, family) {
3235
- store19.logger.info(`\uD83D\uDD28`, `atom`, options.key, `creating in store "${store19.config.name}"`);
3236
- const target = newest(store19);
3237
- const existing = target.atoms.get(options.key);
3238
- if (existing && existing.type === `atom`) {
3239
- store19.logger.error(`\u274C`, `atom`, options.key, `Tried to create atom, but it already exists in the store.`);
3240
- return deposit(existing);
3241
- }
3242
- const subject13 = new Subject;
3243
- const newAtom = {
3244
- ...options,
3245
- type: `atom`,
3246
- install: (s) => {
3247
- s.logger.info(`\uD83D\uDEE0\uFE0F`, `atom`, options.key, `installing in store "${s.config.name}"`);
3248
- return createRegularAtom(s, options, family);
3249
- },
3250
- subject: subject13
3251
- };
3252
- if (family) {
3253
- newAtom.family = family;
3254
- }
3255
- let initialValue = options.default;
3256
- if (options.default instanceof Function) {
3257
- initialValue = options.default();
3258
- }
3259
- target.atoms.set(newAtom.key, newAtom);
3260
- markAtomAsDefault(options.key, store19);
3261
- cacheValue(options.key, initialValue, subject13, target);
3262
- const token = deposit(newAtom);
3263
- if (options.effects) {
3264
- let effectIndex = 0;
3265
- const cleanupFunctions = [];
3266
- for (const effect of options.effects) {
3267
- const cleanup = effect({
3268
- setSelf: (next) => {
3269
- setIntoStore(store19, token, next);
3270
- },
3271
- onSet: (handle) => subscribeToState(token, handle, `effect[${effectIndex}]`, store19)
3272
- });
3273
- if (cleanup) {
3274
- cleanupFunctions.push(cleanup);
3275
- }
3276
- ++effectIndex;
3277
- }
3278
- newAtom.cleanup = () => {
3279
- for (const cleanup of cleanupFunctions) {
3280
- cleanup();
3281
- }
3282
- };
3283
- }
3284
- return token;
3285
- }
3286
- // ../atom.io/internal/src/atom/create-standalone-atom.ts
3287
- function createStandaloneAtom(store19, options) {
3288
- const isMutable = `mutable` in options;
3289
- if (isMutable) {
3290
- const state2 = createMutableAtom(store19, options, undefined);
3291
- store19.on.atomCreation.next(state2);
3292
- return state2;
3293
- }
3294
- const state = createRegularAtom(store19, options, undefined);
3295
- store19.on.atomCreation.next(state);
3296
- return state;
3297
- }
3298
- // ../atom.io/internal/src/atom/dispose-atom.ts
3299
- function disposeAtom(atomToken, store19) {
3300
- const target = newest(store19);
3301
- const { key } = atomToken;
3302
- const atom7 = withdraw(atomToken, target);
3303
- if (!atom7.family) {
3304
- store19.logger.error(`\u274C`, `atom`, key, `Standalone atoms cannot be disposed.`);
3305
- } else {
3306
- atom7.cleanup?.();
3307
- const lastValue = store19.valueMap.get(atom7.key);
3308
- const family = withdraw({ key: atom7.family.key, type: `atom_family` }, store19);
3309
- family.subject.next({
3310
- type: `state_disposal`,
3311
- token: atomToken,
3312
- value: lastValue
3313
- });
3314
- const molecule4 = target.molecules.get(atom7.family.subKey);
3315
- if (molecule4) {
3316
- molecule4.tokens.delete(key);
3317
- }
3318
- target.atoms.delete(key);
3319
- target.valueMap.delete(key);
3320
- target.selectorAtoms.delete(key);
3321
- target.atomsThatAreDefault.delete(key);
3322
- target.timelineTopics.delete(key);
3323
- if (atomToken.type === `mutable_atom`) {
3324
- const updateToken = getUpdateToken(atomToken);
3325
- disposeAtom(updateToken, store19);
3326
- store19.trackers.delete(key);
3327
- }
3328
- store19.logger.info(`\uD83D\uDD25`, `atom`, key, `deleted`);
3329
- if (isChildStore(target) && target.transactionMeta.phase === `building`) {
3330
- target.transactionMeta.update.updates.push({
3331
- type: `state_disposal`,
3332
- token: atomToken
3333
- });
3334
- } else {
3335
- store19.on.atomDisposal.next(atomToken);
3336
- }
3337
- }
3338
- }
3339
- // ../atom.io/realtime-server/src/ipc-sockets/custom-socket.ts
3340
- class CustomSocket {
3341
- emit;
3342
- listeners;
3343
- globalListeners;
3344
- handleEvent(event, ...args) {
3345
- for (const listener of this.globalListeners) {
3346
- listener(event, ...args);
3347
- }
3348
- const listeners = this.listeners.get(event);
3349
- if (listeners) {
3350
- for (const listener of listeners) {
3351
- listener(...args);
3352
- }
3353
- }
3354
- }
3355
- id = `no_id_retrieved`;
3356
- constructor(emit) {
3357
- this.emit = emit;
3358
- this.listeners = new Map;
3359
- this.globalListeners = new Set;
3360
- }
3361
- on(event, listener) {
3362
- const listeners = this.listeners.get(event);
3363
- if (listeners) {
3364
- listeners.add(listener);
3365
- } else {
3366
- this.listeners.set(event, new Set([listener]));
3367
- }
3368
- return this;
3369
- }
3370
- onAny(listener) {
3371
- this.globalListeners.add(listener);
3372
- return this;
3373
- }
3374
- off(event, listener) {
3375
- const listeners = this.listeners.get(event);
3376
- if (listeners) {
3377
- if (listener) {
3378
- listeners.delete(listener);
3379
- } else {
3380
- this.listeners.delete(event);
3381
- }
3382
- }
3383
- return this;
3384
- }
3385
- offAny(listener) {
3386
- this.globalListeners.delete(listener);
3387
- return this;
3388
- }
3389
- }
3390
-
3391
- // ../atom.io/realtime-server/src/ipc-sockets/child-socket.ts
3392
- class ChildSocket extends CustomSocket {
3393
- process2;
3394
- key;
3395
- logger;
3396
- incompleteData = ``;
3397
- unprocessedEvents = [];
3398
- incompleteLog = ``;
3399
- unprocessedLogs = [];
3400
- id = `#####`;
3401
- handleLog(arg) {
3402
- if (Array.isArray(arg)) {
3403
- const [level, ...rest] = arg;
3404
- switch (level) {
3405
- case `i`:
3406
- this.logger.info(this.id, this.key, ...rest);
3407
- break;
3408
- case `w`:
3409
- this.logger.warn(this.id, this.key, ...rest);
3410
- break;
3411
- case `e`:
3412
- this.logger.error(this.id, this.key, ...rest);
3413
- break;
3414
- }
3415
- }
3416
- }
3417
- constructor(process2, key, logger = console) {
3418
- super((event, ...args) => {
3419
- const stringifiedEvent = JSON.stringify([event, ...args]) + `\x03`;
3420
- const errorHandler = (err) => {
3421
- if (err.code === `EPIPE`) {
3422
- console.error(`EPIPE error during write`, this.process.stdin);
3423
- }
3424
- this.process.stdin.removeListener(`error`, errorHandler);
3425
- };
3426
- this.process.stdin.once(`error`, errorHandler);
3427
- this.process.stdin.write(stringifiedEvent);
3428
- return this;
3429
- });
3430
- this.process = process2;
3431
- this.key = key;
3432
- this.logger = logger;
3433
- this.process = process2;
3434
- this.process.stdout.on(`data`, (buffer) => {
3435
- const chunk = buffer.toString();
3436
- if (chunk === `\u2728`) {
3437
- return;
3438
- }
3439
- this.unprocessedEvents.push(...chunk.split(`\x03`));
3440
- const newInput = this.unprocessedEvents.shift();
3441
- this.incompleteData += newInput ?? ``;
3442
- try {
3443
- if (this.incompleteData.startsWith(`error`)) {
3444
- console.log(`\u2757`, this.incompleteData);
3445
- }
3446
- let parsedEvent = parseJson(this.incompleteData);
3447
- this.handleEvent(...parsedEvent);
3448
- while (this.unprocessedEvents.length > 0) {
3449
- const event = this.unprocessedEvents.shift();
3450
- if (event) {
3451
- if (this.unprocessedEvents.length === 0) {
3452
- this.incompleteData = event;
3453
- }
3454
- parsedEvent = parseJson(event);
3455
- this.handleEvent(...parsedEvent);
3456
- }
3457
- }
3458
- this.incompleteData = ``;
3459
- } catch (error) {
3460
- console.warn(`\u26A0\uFE0F----------------\u26A0\uFE0F`);
3461
- console.warn(this.incompleteData);
3462
- console.warn(`\u26A0\uFE0F----------------\u26A0\uFE0F`);
3463
- console.error(error);
3464
- }
3465
- });
3466
- this.process.stderr.on(`data`, (buf) => {
3467
- const chunk = buf.toString();
3468
- this.unprocessedLogs.push(...chunk.split(`\x03`));
3469
- const newInput = this.unprocessedLogs.shift();
3470
- this.incompleteLog += newInput ?? ``;
3471
- try {
3472
- let parsedLog = parseJson(this.incompleteLog);
3473
- this.handleLog(parsedLog);
3474
- while (this.unprocessedLogs.length > 0) {
3475
- this.incompleteLog = this.unprocessedLogs.shift() ?? ``;
3476
- if (this.incompleteLog) {
3477
- parsedLog = parseJson(this.incompleteLog);
3478
- this.handleLog(parsedLog);
3479
- }
3480
- }
3481
- } catch (error) {
3482
- console.error(`\u274C\u274C\u274C`);
3483
- console.error(this.incompleteLog);
3484
- console.error(error);
3485
- console.error(`\u274C\u274C\u274C\uFE0F`);
3486
- }
3487
- });
3488
- if (process2.pid) {
3489
- this.id = process2.pid.toString();
3490
- }
3491
- }
3492
- }
3493
- // ../atom.io/realtime/src/realtime-continuity.ts
3494
- class InvariantMap extends Map {
3495
- set(key, value) {
3496
- if (this.has(key)) {
3497
- console.warn(`Tried to set a key that already exists in an InvariantMap`, {
3498
- key,
3499
- value
3500
- });
3501
- return this;
3502
- }
3503
- return super.set(key, value);
3504
- }
3505
- clear() {
3506
- throw new Error(`Cannot clear an InvariantMap`);
3507
- }
3508
- }
3509
-
3510
- class SyncGroup {
3511
- key;
3512
- type = `continuity`;
3513
- globals = [];
3514
- actions = [];
3515
- perspectives = [];
3516
- constructor(key) {
3517
- this.key = key;
3518
- }
3519
- static existing = new InvariantMap;
3520
- static create(key, builder) {
3521
- const group = new SyncGroup(key);
3522
- const { type, globals, actions, perspectives } = builder(group);
3523
- const token = { type, key, globals, actions, perspectives };
3524
- SyncGroup.existing.set(key, token);
3525
- return token;
3526
- }
3527
- add(...args) {
3528
- const zeroth = args[0];
3529
- switch (zeroth.type) {
3530
- case `atom`:
3531
- case `mutable_atom`:
3532
- this.globals.push(...args);
3533
- break;
3534
- case `transaction`:
3535
- this.actions.push(...args);
3536
- break;
3537
- case `atom_family`:
3538
- {
3539
- const [family, index] = args;
3540
- this.perspectives.push({
3541
- type: `realtime_perspective`,
3542
- resourceAtoms: family,
3543
- viewAtoms: index
3544
- });
3545
- }
3546
- break;
3547
- }
3548
- return this;
3549
- }
3550
- }
3551
- // ../atom.io/realtime/src/shared-room-store.ts
3552
- var usersInThisRoomIndex = atom2({
3553
- key: `usersInRoomIndex`,
3554
- mutable: true,
3555
- default: () => new SetRTX,
3556
- toJson: (set) => set.toJSON(),
3557
- fromJson: (json20) => SetRTX.fromJSON(json20)
3558
- });
3559
- var roomIndex = atom2({
3560
- key: `roomIndex`,
3561
- default: () => new SetRTX,
3562
- mutable: true,
3563
- toJson: (set) => set.toJSON(),
3564
- fromJson: (json20) => SetRTX.fromJSON(json20)
3565
- });
3566
- var DEFAULT_USER_IN_ROOM_META = {
3567
- enteredAtEpoch: 0
3568
- };
3569
- var usersInRooms = join({
3570
- key: `usersInRooms`,
3571
- between: [`room`, `user`],
3572
- cardinality: `1:n`
3573
- }, DEFAULT_USER_IN_ROOM_META);
3574
- var usersInMyRoomView = selectorFamily({
3575
- key: `usersInMyRoomView`,
3576
- get: (myUsername) => ({ find }) => {
3577
- const usersInRoomsAtoms = getInternalRelations(usersInRooms);
3578
- const myRoomIndex = find(usersInRoomsAtoms, myUsername);
3579
- return [myRoomIndex];
3580
- }
3581
- });
3582
- // ../atom.io/realtime-server/src/realtime-server-stores/server-room-external-store.ts
3583
- import {spawn} from "node:child_process";
3584
- var roomArgumentsAtoms = atomFamily({
3585
- key: `roomArguments`,
3586
- default: [`echo`, [`Hello World!`]]
3587
- });
3588
- var roomSelectors = selectorFamily({
3589
- key: `room`,
3590
- get: (roomId) => async ({ get, find }) => {
3591
- const argumentsState = find(roomArgumentsAtoms, roomId);
3592
- const args = get(argumentsState);
3593
- const [script, options] = args;
3594
- const child = await new Promise((resolve) => {
3595
- const room = spawn(script, options, { env: process.env });
3596
- const resolver = (data3) => {
3597
- if (data3.toString() === `\u2728`) {
3598
- room.stdout.off(`data`, resolver);
3599
- resolve(room);
3600
- }
3601
- };
3602
- room.stdout.on(`data`, resolver);
3603
- });
3604
- return new ChildSocket(child, roomId);
3605
- }
3606
- });
3607
-
3608
- // ../atom.io/realtime-server/src/realtime-server-stores/server-room-external-actions.ts
3609
- var createRoomTX = transaction({
3610
- key: `createRoom`,
3611
- do: ({ get, set, find }, roomId, script, options) => {
3612
- const args = options ? [script, options] : [script];
3613
- const roomArgumentsState = find(roomArgumentsAtoms, roomId);
3614
- set(roomArgumentsState, args);
3615
- set(roomIndex, (s) => s.add(roomId));
3616
- const roomState = find(roomSelectors, roomId);
3617
- const room = get(roomState);
3618
- return room;
3619
- }
3620
- });
3621
- var joinRoomTX = transaction({
3622
- key: `joinRoom`,
3623
- do: (tools, roomId, userId, enteredAtEpoch) => {
3624
- const meta = { enteredAtEpoch };
3625
- editRelationsInStore(usersInRooms, (relations) => {
3626
- relations.set({ room: roomId, user: userId }, meta);
3627
- }, tools.env().store);
3628
- return meta;
3629
- }
3630
- });
3631
- var leaveRoomTX = transaction({
3632
- key: `leaveRoom`,
3633
- do: (tools, roomId, userId) => {
3634
- editRelationsInStore(usersInRooms, (relations) => {
3635
- relations.delete({ room: roomId, user: userId });
3636
- }, tools.env().store);
3637
- }
3638
- });
3639
- var destroyRoomTX = transaction({
3640
- key: `destroyRoom`,
3641
- do: (tools, roomId) => {
3642
- editRelationsInStore(usersInRooms, (relations) => {
3643
- relations.delete({ room: roomId });
3644
- }, tools.env().store);
3645
- tools.set(roomIndex, (s) => (s.delete(roomId), s));
3646
- }
3647
- });
3648
- // ../atom.io/realtime-server/src/realtime-server-stores/server-sync-store.ts
3649
- var actionOcclusionAtoms = atomFamily({
3650
- key: `transactionRedactor`,
3651
- default: { occlude: (updates) => updates }
3652
- });
3653
- var userUnacknowledgedQueues = atomFamily({
3654
- key: `unacknowledgedUpdates`,
3655
- default: () => []
3656
- });
3657
- // ../atom.io/realtime-server/src/realtime-server-stores/server-user-store.ts
3658
- var socketAtoms = atomFamily({
3659
- key: `sockets`,
3660
- default: null
3661
- });
3662
- var socketIndex = atom2({
3663
- key: `socketsIndex`,
3664
- mutable: true,
3665
- default: () => new SetRTX,
3666
- toJson: (set) => set.toJSON(),
3667
- fromJson: (json20) => SetRTX.fromJSON(json20)
3668
- });
3669
- var userIndex = atom2({
3670
- key: `usersIndex`,
3671
- mutable: true,
3672
- default: () => new SetRTX,
3673
- toJson: (set) => set.toJSON(),
3674
- fromJson: (json20) => SetRTX.fromJSON(json20)
3675
- });
3676
- var usersOfSockets = join({
3677
- key: `usersOfSockets`,
3678
- between: [`user`, `socket`],
3679
- cardinality: `1:1`
3680
- });
3681
- // src/flightdeck.ts
7
+ import {Future} from "atom.io/internal";
8
+ import {ChildSocket} from "atom.io/realtime-server";
3682
9
  var safety = 0;
3683
10
  var PORT = process.env.PORT ?? 8080;
3684
11
  var ORIGIN = `http://localhost:${PORT}`;
@@ -3708,9 +35,9 @@ class FlightDeck {
3708
35
  this.backupServiceDir = resolve(serviceDir, `backup`);
3709
36
  this.updateServiceDir = resolve(serviceDir, `update`);
3710
37
  createServer((req, res) => {
3711
- let data6 = [];
38
+ let data = [];
3712
39
  req.on(`data`, (chunk) => {
3713
- data6.push(chunk instanceof Buffer ? chunk : Buffer.from(chunk));
40
+ data.push(chunk instanceof Buffer ? chunk : Buffer.from(chunk));
3714
41
  }).on(`end`, () => {
3715
42
  console.log(req.headers);
3716
43
  const authHeader = req.headers.authorization;
@@ -3752,7 +79,7 @@ class FlightDeck {
3752
79
  res.end();
3753
80
  }
3754
81
  } finally {
3755
- data6 = [];
82
+ data = [];
3756
83
  }
3757
84
  });
3758
85
  }).listen(PORT, () => {
@@ -3774,7 +101,7 @@ class FlightDeck {
3774
101
  }
3775
102
  const [executable, ...args] = this.options.runCmd;
3776
103
  const program = executable.startsWith(`./`) ? resolve(this.currentServiceDir, executable) : executable;
3777
- const serviceProcess = spawn2(program, args, {
104
+ const serviceProcess = spawn(program, args, {
3778
105
  cwd: this.currentServiceDir,
3779
106
  env: import.meta.env
3780
107
  });