@dxos/util 0.5.9-main.f099efe → 0.5.9-next.73dcc17

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.
@@ -199,6 +199,60 @@ var createSetDispatch = ({ handlers }) => {
199
199
  });
200
200
  };
201
201
 
202
+ // packages/common/util/src/circular-buffer.ts
203
+ import { invariant as invariant4 } from "@dxos/invariant";
204
+ var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/common/util/src/circular-buffer.ts";
205
+ var CircularBuffer = class {
206
+ constructor(size) {
207
+ this._nextIndex = 0;
208
+ this._elementCount = 0;
209
+ invariant4(size >= 1, void 0, {
210
+ F: __dxlog_file4,
211
+ L: 13,
212
+ S: this,
213
+ A: [
214
+ "size >= 1",
215
+ ""
216
+ ]
217
+ });
218
+ this._buffer = new Array(size);
219
+ }
220
+ push(element) {
221
+ this._buffer[this._nextIndex] = element;
222
+ this._nextIndex = (this._nextIndex + 1) % this._buffer.length;
223
+ this._elementCount = Math.min(this._buffer.length, this._elementCount + 1);
224
+ }
225
+ getLast() {
226
+ if (this._elementCount === 0) {
227
+ return void 0;
228
+ }
229
+ if (this._nextIndex === 0) {
230
+ return this._buffer[this._buffer.length - 1];
231
+ }
232
+ return this._buffer[this._nextIndex - 1];
233
+ }
234
+ [Symbol.iterator]() {
235
+ return this.values();
236
+ }
237
+ *values() {
238
+ if (this._elementCount === 0) {
239
+ return;
240
+ }
241
+ if (this._elementCount < this._buffer.length) {
242
+ for (let i = 0; i < this._elementCount; i++) {
243
+ yield this._buffer[i];
244
+ }
245
+ return;
246
+ }
247
+ for (let i = this._nextIndex; i < this._buffer.length; i++) {
248
+ yield this._buffer[i];
249
+ }
250
+ for (let i = 0; i < this._nextIndex; i++) {
251
+ yield this._buffer[i];
252
+ }
253
+ }
254
+ };
255
+
202
256
  // packages/common/util/src/complex.ts
203
257
  import { inspect } from "@dxos/node-std/util";
204
258
  import { inspectObject, raise } from "@dxos/debug";
@@ -364,188 +418,42 @@ var makeMap = (keyProjection) => class BoundComplexMap extends ComplexMap {
364
418
  }
365
419
  };
366
420
 
421
+ // packages/common/util/src/explicit-resource-management-polyfill.ts
422
+ Symbol.dispose ??= Symbol("Symbol.dispose");
423
+ Symbol.asyncDispose ??= Symbol("Symbol.asyncDispose");
424
+
425
+ // packages/common/util/src/defer.ts
426
+ var defer = (fn) => new DeferGuard(fn);
427
+ var DeferGuard = class {
428
+ /**
429
+ * @internal
430
+ */
431
+ constructor(_fn) {
432
+ this._fn = _fn;
433
+ }
434
+ [Symbol.dispose]() {
435
+ const result = this._fn();
436
+ if (result instanceof Promise) {
437
+ throw new Error("Async functions in defer are not supported. Use deferAsync instead.");
438
+ }
439
+ }
440
+ };
441
+ var deferAsync = (fn) => new DeferAsyncGuard(fn);
442
+ var DeferAsyncGuard = class {
443
+ /**
444
+ * @internal
445
+ */
446
+ constructor(_fn) {
447
+ this._fn = _fn;
448
+ }
449
+ async [Symbol.asyncDispose]() {
450
+ await this._fn();
451
+ }
452
+ };
453
+
367
454
  // packages/common/util/src/defer-function.ts
368
455
  var deferFunction = (fnProvider) => (...args) => fnProvider()(...args);
369
456
 
370
- // packages/common/util/src/to-fallback.ts
371
- var idEmoji = [
372
- // When changing this set, please check the result in a console or e.g. RunKit (https://runkit.com/thure/642214441dd6ae000855a8de)
373
- // Emoji sometimes use a combination of code points, and some code points aren't visible on their own, so by adding or deleting you may unintentionally create non-visible items.
374
- // This set was chosen from the characters in Unicode Emoji v15.0 based on the following criteria:
375
- // – not people or isolated anthropomorphic faces
376
- // – not flags
377
- // – more concrete than abstract
378
- // – less culturally specific
379
- // – less easily confused with another emoji in the set
380
- // – requires less special knowledge to identify
381
- // – less likely to evoke negative feelings (no meat, no drugs, no weapons, etc)
382
- // – less common as a signifier in UX
383
- // NOTE that this is intentionally an array of strings because of the way emoji graphemes work.
384
- "\u{1F479}",
385
- "\u{1F47B}",
386
- "\u{1F47D}",
387
- "\u{1F916}",
388
- "\u{1F383}",
389
- "\u{1F9BE}",
390
- "\u{1F9BF}",
391
- "\u{1F9B7}",
392
- "\u{1F463}",
393
- "\u{1F441}\uFE0F",
394
- "\u{1F9F6}",
395
- "\u{1F451}",
396
- "\u{1F412}",
397
- "\u{1F986}",
398
- "\u{1F989}",
399
- "\u{1F434}",
400
- "\u{1F984}",
401
- "\u{1F41D}",
402
- "\u{1F98B}",
403
- "\u{1F41E}",
404
- "\u{1FAB2}",
405
- "\u{1F422}",
406
- "\u{1F98E}",
407
- "\u{1F995}",
408
- "\u{1F991}",
409
- "\u{1F980}",
410
- "\u{1F420}",
411
- "\u{1F42C}",
412
- "\u{1F40B}",
413
- "\u{1F9AD}",
414
- "\u{1F405}",
415
- "\u{1F406}",
416
- "\u{1F993}",
417
- "\u{1F98D}",
418
- "\u{1F9A7}",
419
- "\u{1F418}",
420
- "\u{1F42B}",
421
- "\u{1F992}",
422
- "\u{1F998}",
423
- "\u{1F9AC}",
424
- "\u{1F416}",
425
- "\u{1F40F}",
426
- "\u{1F98C}",
427
- "\u{1F415}",
428
- "\u{1F408}",
429
- "\u{1F413}",
430
- "\u{1F99A}",
431
- "\u{1F99C}",
432
- "\u{1F9A2}",
433
- "\u{1F9A9}",
434
- "\u{1F9A6}",
435
- "\u{1F401}",
436
- "\u{1F43F}\uFE0F",
437
- "\u{1F335}",
438
- "\u{1F332}",
439
- "\u{1F333}",
440
- "\u{1FAB5}",
441
- "\u{1F331}",
442
- "\u{1F341}",
443
- "\u{1FABA}",
444
- "\u{1F344}",
445
- "\u{1F41A}",
446
- "\u{1FAB8}",
447
- "\u{1FAA8}",
448
- "\u{1F33E}",
449
- "\u{1F337}",
450
- "\u{1F33B}",
451
- "\u2600\uFE0F",
452
- "\u{1F319}",
453
- "\u{1FA90}",
454
- "\u2B50\uFE0F",
455
- "\u26A1\uFE0F",
456
- "\u2604\uFE0F",
457
- "\u{1F525}",
458
- "\u{1F308}",
459
- "\u2601\uFE0F",
460
- "\u{1F4A7}",
461
- "\u26F1\uFE0F",
462
- "\u{1F30A}",
463
- "\u{1F34E}",
464
- "\u{1F34B}",
465
- "\u{1F349}",
466
- "\u{1F347}",
467
- "\u{1FAD0}",
468
- "\u{1F348}",
469
- "\u{1F352}",
470
- "\u{1F351}",
471
- "\u{1F96D}",
472
- "\u{1F34D}",
473
- "\u{1F965}",
474
- "\u{1F95D}",
475
- "\u{1F951}",
476
- "\u{1F336}\uFE0F",
477
- "\u{1F33D}",
478
- "\u{1F955}",
479
- "\u{1F36C}",
480
- "\u{1F95C}",
481
- "\u{1FAD6}",
482
- "\u2615\uFE0F",
483
- "\u{1F375}",
484
- "\u{1F9CA}",
485
- "\u{1F9C2}",
486
- "\u{1F3D4}\uFE0F",
487
- "\u2693\uFE0F",
488
- "\u{1F6DF}",
489
- "\u{1F3DD}\uFE0F",
490
- "\u{1F6F6}",
491
- "\u{1F680}",
492
- "\u{1F6F0}\uFE0F",
493
- "\u26F2\uFE0F",
494
- "\u{1F3F0}",
495
- "\u{1F6B2}",
496
- "\u26FA\uFE0F",
497
- "\u{1F399}\uFE0F",
498
- "\u{1F9F2}",
499
- "\u2699\uFE0F",
500
- "\u{1F529}",
501
- "\u{1F52E}",
502
- "\u{1F52D}",
503
- "\u{1F52C}",
504
- "\u{1F9EC}",
505
- "\u{1F321}\uFE0F",
506
- "\u{1F9FA}",
507
- "\u{1F6CE}\uFE0F",
508
- "\u{1F511}",
509
- "\u{1FA91}",
510
- "\u{1F9F8}",
511
- "\u{1F388}",
512
- "\u{1F380}",
513
- "\u{1F38A}",
514
- "\u267B\uFE0F",
515
- "\u{1F3B5}"
516
- ];
517
- var idHue = [
518
- "red",
519
- // 'orange' as const, /* More shades in these palettes are considered “ugly” */
520
- "amber",
521
- // 'yellow' as const, /* More shades in these palettes are considered “ugly” */
522
- "lime",
523
- "green",
524
- "emerald",
525
- "teal",
526
- "cyan",
527
- // 'sky' as const, /* Omitted since it is quite similar to the primary accent palette */
528
- // 'blue' as const, /* Omitted since it is quite similar to the primary accent palette */
529
- // 'indigo' as const, /* Omitted since it is quite similar to the primary accent palette */
530
- "violet",
531
- "purple",
532
- "fuchsia",
533
- "pink",
534
- "rose"
535
- ];
536
- var keyToEmoji = (key) => hexToEmoji(key.toHex());
537
- var hexToEmoji = (hex) => toEmoji(parseInt(hex, 16));
538
- var toEmoji = (hash) => idEmoji[hash % idEmoji.length];
539
- var keyToHue = (key) => hexToHue(key.toHex());
540
- var hexToHue = (hex) => toHue(parseInt(hex, 16));
541
- var toHue = (hash) => idHue[hash % idHue.length];
542
- var keyToFallback = (key) => hexToFallback(key.toHex());
543
- var hexToFallback = (hex) => toFallback(parseInt(hex, 16));
544
- var toFallback = (hash) => ({
545
- emoji: toEmoji(hash),
546
- hue: toHue(hash)
547
- });
548
-
549
457
  // packages/common/util/src/entry.ts
550
458
  var entry = (map, key) => new MapEntry(map, key);
551
459
  var MapEntry = class {
@@ -574,6 +482,9 @@ var MapEntry = class {
574
482
  }
575
483
  };
576
484
 
485
+ // packages/common/util/src/for-each-async.ts
486
+ var forEachAsync = (items, fn) => Promise.all(items.map(fn));
487
+
577
488
  // packages/common/util/src/human-hash.ts
578
489
  import { PublicKey } from "@dxos/keys";
579
490
  var DEFAULT_WORDLIST = [
@@ -917,6 +828,61 @@ var exponentialBackoffInterval = (cb, initialInterval) => {
917
828
  return () => clearTimeout(timeoutId);
918
829
  };
919
830
 
831
+ // packages/common/util/src/map.ts
832
+ var defaultMap = (map, key, def) => {
833
+ let value = map.get(key);
834
+ if (value === void 0) {
835
+ value = typeof def === "function" ? def() : def;
836
+ map.set(key, value);
837
+ }
838
+ return value;
839
+ };
840
+
841
+ // packages/common/util/src/instance-id.ts
842
+ var symbol = Symbol.for("dxos.instance-contexts");
843
+ var instanceContexts = globalThis[symbol] ??= /* @__PURE__ */ new WeakMap();
844
+ var getPrototypeSpecificInstanceId = (instance) => {
845
+ const prototype = Object.getPrototypeOf(instance);
846
+ const instanceCtx = defaultMap(instanceContexts, prototype, () => ({
847
+ nextId: 0,
848
+ instanceIds: /* @__PURE__ */ new WeakMap()
849
+ }));
850
+ let id = instanceCtx.instanceIds.get(instance);
851
+ if (id === void 0) {
852
+ id = instanceCtx.nextId++;
853
+ instanceCtx.instanceIds.set(instance, id);
854
+ }
855
+ return id;
856
+ };
857
+ var getDebugName = (instance) => {
858
+ if (instance == null) {
859
+ return "null";
860
+ }
861
+ const prototype = Object.getPrototypeOf(instance);
862
+ return `${prototype.constructor.name}#${getPrototypeSpecificInstanceId(instance)}`;
863
+ };
864
+
865
+ // packages/common/util/src/join-tables.ts
866
+ var joinTables = (leftColumn, rightColumn, left, right) => {
867
+ const map = /* @__PURE__ */ new Map();
868
+ const used = /* @__PURE__ */ new Set();
869
+ for (const row of right) {
870
+ map.set(row[rightColumn], row);
871
+ }
872
+ const result = [];
873
+ for (const row of left) {
874
+ const right2 = map.get(row[leftColumn]);
875
+ used.add(right2);
876
+ result.push(Object.assign(right2 ?? {}, row));
877
+ }
878
+ for (const row of right) {
879
+ if (!used.has(row)) {
880
+ result.push(row);
881
+ }
882
+ }
883
+ return result;
884
+ };
885
+
920
886
  // packages/common/util/src/json.ts
921
887
  import { inspect as inspect2 } from "@dxos/node-std/util";
922
888
  import { PublicKey as PublicKey2 } from "@dxos/keys";
@@ -1011,36 +977,109 @@ var jsonlogify = (value, depth = 0, visitedObjects = /* @__PURE__ */ new WeakSet
1011
977
  return value.toJSON();
1012
978
  } else {
1013
979
  const res = {};
1014
- for (const key of Object.keys(value)) {
1015
- res[key] = jsonlogify(value[key], depth + 1, visitedObjects);
980
+ for (const key of Object.keys(value)) {
981
+ res[key] = jsonlogify(value[key], depth + 1, visitedObjects);
982
+ }
983
+ return res;
984
+ }
985
+ } finally {
986
+ visitedObjects.delete(value);
987
+ }
988
+ } else {
989
+ return value;
990
+ }
991
+ };
992
+ var jsonKeyReplacer = (options = {}) => (key, value) => {
993
+ if (typeof value === "string") {
994
+ const key2 = PublicKey2.fromHex(value);
995
+ if (key2.toHex() === value) {
996
+ return options.humanize ? humanize(key2) : options.truncate ? key2.truncate() : key2.toHex();
997
+ }
998
+ }
999
+ return value;
1000
+ };
1001
+
1002
+ // packages/common/util/src/map-values.ts
1003
+ var mapValues = (obj, fn) => {
1004
+ const result = {};
1005
+ Object.keys(obj).forEach((key) => {
1006
+ result[key] = fn(obj[key], key);
1007
+ });
1008
+ return result;
1009
+ };
1010
+ var deepMapValues = (value, fn) => {
1011
+ return new DeepMapper(fn).map(value);
1012
+ };
1013
+ var DeepMapper = class {
1014
+ constructor(_fn) {
1015
+ this._fn = _fn;
1016
+ this._cyclic = /* @__PURE__ */ new Map();
1017
+ this._recurse = (value) => {
1018
+ if (this._cyclic.has(value)) {
1019
+ return this._cyclic.get(value);
1020
+ }
1021
+ if (Array.isArray(value)) {
1022
+ const res = new Array(value.length);
1023
+ this._cyclic.set(value, res);
1024
+ for (let i = 0; i < value.length; i++) {
1025
+ res[i] = this.map(value[i]);
1026
+ }
1027
+ return res;
1028
+ } else if (value !== null && typeof value === "object") {
1029
+ const res = {};
1030
+ this._cyclic.set(value, res);
1031
+ for (const key in value) {
1032
+ res[key] = this.map(value[key]);
1033
+ }
1034
+ return res;
1035
+ } else {
1036
+ return value;
1037
+ }
1038
+ };
1039
+ }
1040
+ map(value) {
1041
+ if (this._cyclic.has(value)) {
1042
+ return this._cyclic.get(value);
1043
+ }
1044
+ return this._fn(value, this._recurse);
1045
+ }
1046
+ };
1047
+ var deepMapValuesAsync = (value, fn) => {
1048
+ return new DeepMapperAsync(fn).map(value);
1049
+ };
1050
+ var DeepMapperAsync = class {
1051
+ constructor(_fn) {
1052
+ this._fn = _fn;
1053
+ this._cyclic = /* @__PURE__ */ new Map();
1054
+ this._recurse = async (value) => {
1055
+ if (this._cyclic.has(value)) {
1056
+ return this._cyclic.get(value);
1057
+ }
1058
+ if (Array.isArray(value)) {
1059
+ const res = new Array(value.length);
1060
+ this._cyclic.set(value, res);
1061
+ for (let i = 0; i < value.length; i++) {
1062
+ res[i] = await this.map(value[i]);
1063
+ }
1064
+ return res;
1065
+ } else if (value !== null && typeof value === "object") {
1066
+ const res = {};
1067
+ this._cyclic.set(value, res);
1068
+ for (const key in value) {
1069
+ res[key] = await this.map(value[key]);
1016
1070
  }
1017
1071
  return res;
1072
+ } else {
1073
+ return value;
1018
1074
  }
1019
- } finally {
1020
- visitedObjects.delete(value);
1021
- }
1022
- } else {
1023
- return value;
1075
+ };
1024
1076
  }
1025
- };
1026
- var jsonKeyReplacer = (options = {}) => (key, value) => {
1027
- if (typeof value === "string") {
1028
- const key2 = PublicKey2.fromHex(value);
1029
- if (key2.toHex() === value) {
1030
- return options.humanize ? humanize(key2) : options.truncate ? key2.truncate() : key2.toHex();
1077
+ map(value) {
1078
+ if (this._cyclic.has(value)) {
1079
+ return this._cyclic.get(value);
1031
1080
  }
1081
+ return this._fn(value, this._recurse);
1032
1082
  }
1033
- return value;
1034
- };
1035
-
1036
- // packages/common/util/src/map.ts
1037
- var defaultMap = (map, key, def) => {
1038
- let value = map.get(key);
1039
- if (value === void 0) {
1040
- value = typeof def === "function" ? def() : def;
1041
- map.set(key, value);
1042
- }
1043
- return value;
1044
1083
  };
1045
1084
 
1046
1085
  // packages/common/util/src/order.ts
@@ -1070,6 +1109,55 @@ var inferRecordOrder = (objectMap, order = []) => {
1070
1109
  }, {}), objectMap);
1071
1110
  };
1072
1111
 
1112
+ // packages/common/util/src/params.ts
1113
+ import { AST } from "@effect/schema";
1114
+ import { decamelize } from "xcase";
1115
+ var ParamKeyAnnotationId = Symbol.for("@dxos/schema/annotation/ParamKeyAnnotation");
1116
+ var ParamKeyAnnotation = (value) => (self) => self.annotations({
1117
+ [ParamKeyAnnotationId]: value
1118
+ });
1119
+ var Params = class {
1120
+ constructor(_schema) {
1121
+ this._schema = _schema;
1122
+ }
1123
+ /**
1124
+ * Parse URL params.
1125
+ * @param url
1126
+ */
1127
+ parse(url) {
1128
+ return Object.entries(this._schema.fields).reduce((acc, [key, type]) => {
1129
+ let v = url.searchParams.get(decamelize(key));
1130
+ if (v == null) {
1131
+ v = url.searchParams.get(key);
1132
+ }
1133
+ if (v != null) {
1134
+ if (AST.isNumberKeyword(type.ast)) {
1135
+ acc[key] = parseInt(v);
1136
+ } else if (AST.isBooleanKeyword(type.ast)) {
1137
+ acc[key] = v === "true" || v === "1";
1138
+ } else {
1139
+ acc[key] = v;
1140
+ }
1141
+ }
1142
+ return acc;
1143
+ }, {});
1144
+ }
1145
+ /**
1146
+ * Update URL with params.
1147
+ */
1148
+ params(url, values) {
1149
+ Object.entries(values).forEach(([key, value]) => {
1150
+ const type = this._schema.fields[key];
1151
+ if (type && value != null) {
1152
+ const { value: alt } = AST.getAnnotation(ParamKeyAnnotationId)(type.ast);
1153
+ const k = alt ?? decamelize(key);
1154
+ url.searchParams.set(k, String(value));
1155
+ }
1156
+ });
1157
+ return url;
1158
+ }
1159
+ };
1160
+
1073
1161
  // packages/common/util/src/platform.ts
1074
1162
  var isNode = () => typeof process !== "undefined" && process.versions != null && process.versions.node != null;
1075
1163
  var mobileAndTabletCheck = () => {
@@ -1213,6 +1301,24 @@ var createBucketReducer = (period) => ({
1213
1301
  }
1214
1302
  });
1215
1303
 
1304
+ // packages/common/util/src/safe-await.ts
1305
+ var safeAwaitAll = async (source, taskFactory, onError) => {
1306
+ const failedItems = [];
1307
+ await Promise.all([
1308
+ ...source
1309
+ ].map(async (item, idx) => {
1310
+ try {
1311
+ await taskFactory(item);
1312
+ } catch (err) {
1313
+ if (onError) {
1314
+ onError(err, item, idx);
1315
+ }
1316
+ failedItems.push(item);
1317
+ }
1318
+ }));
1319
+ return failedItems;
1320
+ };
1321
+
1216
1322
  // packages/common/util/src/safe-instanceof.ts
1217
1323
  var instanceTag = Symbol("instanceTag");
1218
1324
  var safeInstanceof = (tag) => (target) => {
@@ -1258,6 +1364,192 @@ var compareMulti = (sorters) => (a, b) => {
1258
1364
  return sort();
1259
1365
  };
1260
1366
 
1367
+ // packages/common/util/src/throw-unhandled-error.ts
1368
+ var throwUnhandledError = (error) => {
1369
+ queueMicrotask(() => {
1370
+ throw error;
1371
+ });
1372
+ };
1373
+
1374
+ // packages/common/util/src/to-fallback.ts
1375
+ var idEmoji = [
1376
+ // When changing this set, please check the result in a console or e.g. RunKit (https://runkit.com/thure/642214441dd6ae000855a8de)
1377
+ // Emoji sometimes use a combination of code points, and some code points aren't visible on their own, so by adding or deleting you may unintentionally create non-visible items.
1378
+ // This set was chosen from the characters in Unicode Emoji v15.0 based on the following criteria:
1379
+ // – not people or isolated anthropomorphic faces
1380
+ // – not flags
1381
+ // – more concrete than abstract
1382
+ // – less culturally specific
1383
+ // – less easily confused with another emoji in the set
1384
+ // – requires less special knowledge to identify
1385
+ // – less likely to evoke negative feelings (no meat, no drugs, no weapons, etc)
1386
+ // – less common as a signifier in UX
1387
+ // NOTE that this is intentionally an array of strings because of the way emoji graphemes work.
1388
+ "\u{1F479}",
1389
+ "\u{1F47B}",
1390
+ "\u{1F47D}",
1391
+ "\u{1F916}",
1392
+ "\u{1F383}",
1393
+ "\u{1F9BE}",
1394
+ "\u{1F9BF}",
1395
+ "\u{1F9B7}",
1396
+ "\u{1F463}",
1397
+ "\u{1F441}\uFE0F",
1398
+ "\u{1F9F6}",
1399
+ "\u{1F451}",
1400
+ "\u{1F412}",
1401
+ "\u{1F986}",
1402
+ "\u{1F989}",
1403
+ "\u{1F434}",
1404
+ "\u{1F984}",
1405
+ "\u{1F41D}",
1406
+ "\u{1F98B}",
1407
+ "\u{1F41E}",
1408
+ "\u{1FAB2}",
1409
+ "\u{1F422}",
1410
+ "\u{1F98E}",
1411
+ "\u{1F995}",
1412
+ "\u{1F991}",
1413
+ "\u{1F980}",
1414
+ "\u{1F420}",
1415
+ "\u{1F42C}",
1416
+ "\u{1F40B}",
1417
+ "\u{1F9AD}",
1418
+ "\u{1F405}",
1419
+ "\u{1F406}",
1420
+ "\u{1F993}",
1421
+ "\u{1F98D}",
1422
+ "\u{1F9A7}",
1423
+ "\u{1F418}",
1424
+ "\u{1F42B}",
1425
+ "\u{1F992}",
1426
+ "\u{1F998}",
1427
+ "\u{1F9AC}",
1428
+ "\u{1F416}",
1429
+ "\u{1F40F}",
1430
+ "\u{1F98C}",
1431
+ "\u{1F415}",
1432
+ "\u{1F408}",
1433
+ "\u{1F413}",
1434
+ "\u{1F99A}",
1435
+ "\u{1F99C}",
1436
+ "\u{1F9A2}",
1437
+ "\u{1F9A9}",
1438
+ "\u{1F9A6}",
1439
+ "\u{1F401}",
1440
+ "\u{1F43F}\uFE0F",
1441
+ "\u{1F335}",
1442
+ "\u{1F332}",
1443
+ "\u{1F333}",
1444
+ "\u{1FAB5}",
1445
+ "\u{1F331}",
1446
+ "\u{1F341}",
1447
+ "\u{1FABA}",
1448
+ "\u{1F344}",
1449
+ "\u{1F41A}",
1450
+ "\u{1FAB8}",
1451
+ "\u{1FAA8}",
1452
+ "\u{1F33E}",
1453
+ "\u{1F337}",
1454
+ "\u{1F33B}",
1455
+ "\u2600\uFE0F",
1456
+ "\u{1F319}",
1457
+ "\u{1FA90}",
1458
+ "\u2B50\uFE0F",
1459
+ "\u26A1\uFE0F",
1460
+ "\u2604\uFE0F",
1461
+ "\u{1F525}",
1462
+ "\u{1F308}",
1463
+ "\u2601\uFE0F",
1464
+ "\u{1F4A7}",
1465
+ "\u26F1\uFE0F",
1466
+ "\u{1F30A}",
1467
+ "\u{1F34E}",
1468
+ "\u{1F34B}",
1469
+ "\u{1F349}",
1470
+ "\u{1F347}",
1471
+ "\u{1FAD0}",
1472
+ "\u{1F348}",
1473
+ "\u{1F352}",
1474
+ "\u{1F351}",
1475
+ "\u{1F96D}",
1476
+ "\u{1F34D}",
1477
+ "\u{1F965}",
1478
+ "\u{1F95D}",
1479
+ "\u{1F951}",
1480
+ "\u{1F336}\uFE0F",
1481
+ "\u{1F33D}",
1482
+ "\u{1F955}",
1483
+ "\u{1F36C}",
1484
+ "\u{1F95C}",
1485
+ "\u{1FAD6}",
1486
+ "\u2615\uFE0F",
1487
+ "\u{1F375}",
1488
+ "\u{1F9CA}",
1489
+ "\u{1F9C2}",
1490
+ "\u{1F3D4}\uFE0F",
1491
+ "\u2693\uFE0F",
1492
+ "\u{1F6DF}",
1493
+ "\u{1F3DD}\uFE0F",
1494
+ "\u{1F6F6}",
1495
+ "\u{1F680}",
1496
+ "\u{1F6F0}\uFE0F",
1497
+ "\u26F2\uFE0F",
1498
+ "\u{1F3F0}",
1499
+ "\u{1F6B2}",
1500
+ "\u26FA\uFE0F",
1501
+ "\u{1F399}\uFE0F",
1502
+ "\u{1F9F2}",
1503
+ "\u2699\uFE0F",
1504
+ "\u{1F529}",
1505
+ "\u{1F52E}",
1506
+ "\u{1F52D}",
1507
+ "\u{1F52C}",
1508
+ "\u{1F9EC}",
1509
+ "\u{1F321}\uFE0F",
1510
+ "\u{1F9FA}",
1511
+ "\u{1F6CE}\uFE0F",
1512
+ "\u{1F511}",
1513
+ "\u{1FA91}",
1514
+ "\u{1F9F8}",
1515
+ "\u{1F388}",
1516
+ "\u{1F380}",
1517
+ "\u{1F38A}",
1518
+ "\u267B\uFE0F",
1519
+ "\u{1F3B5}"
1520
+ ];
1521
+ var idHue = [
1522
+ "red",
1523
+ // 'orange' as const, /* More shades in these palettes are considered “ugly” */
1524
+ "amber",
1525
+ // 'yellow' as const, /* More shades in these palettes are considered “ugly” */
1526
+ "lime",
1527
+ "green",
1528
+ "emerald",
1529
+ "teal",
1530
+ "cyan",
1531
+ // 'sky' as const, /* Omitted since it is quite similar to the primary accent palette */
1532
+ // 'blue' as const, /* Omitted since it is quite similar to the primary accent palette */
1533
+ // 'indigo' as const, /* Omitted since it is quite similar to the primary accent palette */
1534
+ "violet",
1535
+ "purple",
1536
+ "fuchsia",
1537
+ "pink",
1538
+ "rose"
1539
+ ];
1540
+ var keyToEmoji = (key) => hexToEmoji(key.toHex());
1541
+ var hexToEmoji = (hex) => toEmoji(parseInt(hex, 16));
1542
+ var toEmoji = (hash) => idEmoji[hash % idEmoji.length];
1543
+ var keyToHue = (key) => hexToHue(key.toHex());
1544
+ var hexToHue = (hex) => toHue(parseInt(hex, 16));
1545
+ var toHue = (hash) => idHue[hash % idHue.length];
1546
+ var keyToFallback = (key) => hexToFallback(key.toHex());
1547
+ var hexToFallback = (hex) => toFallback(parseInt(hex, 16));
1548
+ var toFallback = (hash) => ({
1549
+ emoji: toEmoji(hash),
1550
+ hue: toHue(hash)
1551
+ });
1552
+
1261
1553
  // packages/common/util/src/tracer.ts
1262
1554
  var Tracer = class {
1263
1555
  constructor() {
@@ -1361,36 +1653,9 @@ var safeParseInt = (value, defaultValue) => {
1361
1653
  }
1362
1654
  };
1363
1655
 
1364
- // packages/common/util/src/instance-id.ts
1365
- var symbol = Symbol.for("dxos.instance-contexts");
1366
- var instanceContexts = globalThis[symbol] ??= /* @__PURE__ */ new WeakMap();
1367
- var getPrototypeSpecificInstanceId = (instance) => {
1368
- const prototype = Object.getPrototypeOf(instance);
1369
- const instanceCtx = defaultMap(instanceContexts, prototype, () => ({
1370
- nextId: 0,
1371
- instanceIds: /* @__PURE__ */ new WeakMap()
1372
- }));
1373
- let id = instanceCtx.instanceIds.get(instance);
1374
- if (id === void 0) {
1375
- id = instanceCtx.nextId++;
1376
- instanceCtx.instanceIds.set(instance, id);
1377
- }
1378
- return id;
1379
- };
1380
- var getDebugName = (instance) => {
1381
- if (instance == null) {
1382
- return "null";
1383
- }
1384
- const prototype = Object.getPrototypeOf(instance);
1385
- return `${prototype.constructor.name}#${getPrototypeSpecificInstanceId(instance)}`;
1386
- };
1387
-
1388
1656
  // packages/common/util/src/sum.ts
1389
1657
  var sum = (values) => values.reduce((a, b) => a + b, 0);
1390
1658
 
1391
- // packages/common/util/src/for-each-async.ts
1392
- var forEachAsync = (items, fn) => Promise.all(items.map(fn));
1393
-
1394
1659
  // packages/common/util/src/weak.ts
1395
1660
  var WeakDictionary = class {
1396
1661
  constructor(entries) {
@@ -1485,222 +1750,6 @@ var WeakDictionary = class {
1485
1750
  this._finalization.unregister(value);
1486
1751
  }
1487
1752
  };
1488
-
1489
- // packages/common/util/src/map-values.ts
1490
- var mapValues = (obj, fn) => {
1491
- const result = {};
1492
- Object.keys(obj).forEach((key) => {
1493
- result[key] = fn(obj[key], key);
1494
- });
1495
- return result;
1496
- };
1497
- var deepMapValues = (value, fn) => {
1498
- return new DeepMapper(fn).map(value);
1499
- };
1500
- var DeepMapper = class {
1501
- constructor(_fn) {
1502
- this._fn = _fn;
1503
- this._cyclic = /* @__PURE__ */ new Map();
1504
- this._recurse = (value) => {
1505
- if (this._cyclic.has(value)) {
1506
- return this._cyclic.get(value);
1507
- }
1508
- if (Array.isArray(value)) {
1509
- const res = new Array(value.length);
1510
- this._cyclic.set(value, res);
1511
- for (let i = 0; i < value.length; i++) {
1512
- res[i] = this.map(value[i]);
1513
- }
1514
- return res;
1515
- } else if (value !== null && typeof value === "object") {
1516
- const res = {};
1517
- this._cyclic.set(value, res);
1518
- for (const key in value) {
1519
- res[key] = this.map(value[key]);
1520
- }
1521
- return res;
1522
- } else {
1523
- return value;
1524
- }
1525
- };
1526
- }
1527
- map(value) {
1528
- if (this._cyclic.has(value)) {
1529
- return this._cyclic.get(value);
1530
- }
1531
- return this._fn(value, this._recurse);
1532
- }
1533
- };
1534
- var deepMapValuesAsync = (value, fn) => {
1535
- return new DeepMapperAsync(fn).map(value);
1536
- };
1537
- var DeepMapperAsync = class {
1538
- constructor(_fn) {
1539
- this._fn = _fn;
1540
- this._cyclic = /* @__PURE__ */ new Map();
1541
- this._recurse = async (value) => {
1542
- if (this._cyclic.has(value)) {
1543
- return this._cyclic.get(value);
1544
- }
1545
- if (Array.isArray(value)) {
1546
- const res = new Array(value.length);
1547
- this._cyclic.set(value, res);
1548
- for (let i = 0; i < value.length; i++) {
1549
- res[i] = await this.map(value[i]);
1550
- }
1551
- return res;
1552
- } else if (value !== null && typeof value === "object") {
1553
- const res = {};
1554
- this._cyclic.set(value, res);
1555
- for (const key in value) {
1556
- res[key] = await this.map(value[key]);
1557
- }
1558
- return res;
1559
- } else {
1560
- return value;
1561
- }
1562
- };
1563
- }
1564
- map(value) {
1565
- if (this._cyclic.has(value)) {
1566
- return this._cyclic.get(value);
1567
- }
1568
- return this._fn(value, this._recurse);
1569
- }
1570
- };
1571
-
1572
- // packages/common/util/src/explicit-resource-management-polyfill.ts
1573
- Symbol.dispose ??= Symbol("Symbol.dispose");
1574
- Symbol.asyncDispose ??= Symbol("Symbol.asyncDispose");
1575
-
1576
- // packages/common/util/src/defer.ts
1577
- var defer = (fn) => new DeferGuard(fn);
1578
- var DeferGuard = class {
1579
- /**
1580
- * @internal
1581
- */
1582
- constructor(_fn) {
1583
- this._fn = _fn;
1584
- }
1585
- [Symbol.dispose]() {
1586
- const result = this._fn();
1587
- if (result instanceof Promise) {
1588
- throw new Error("Async functions in defer are not supported. Use deferAsync instead.");
1589
- }
1590
- }
1591
- };
1592
- var deferAsync = (fn) => new DeferAsyncGuard(fn);
1593
- var DeferAsyncGuard = class {
1594
- /**
1595
- * @internal
1596
- */
1597
- constructor(_fn) {
1598
- this._fn = _fn;
1599
- }
1600
- async [Symbol.asyncDispose]() {
1601
- await this._fn();
1602
- }
1603
- };
1604
-
1605
- // packages/common/util/src/circular-buffer.ts
1606
- import { invariant as invariant4 } from "@dxos/invariant";
1607
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/common/util/src/circular-buffer.ts";
1608
- var CircularBuffer = class {
1609
- constructor(size) {
1610
- this._nextIndex = 0;
1611
- this._elementCount = 0;
1612
- invariant4(size >= 1, void 0, {
1613
- F: __dxlog_file4,
1614
- L: 13,
1615
- S: this,
1616
- A: [
1617
- "size >= 1",
1618
- ""
1619
- ]
1620
- });
1621
- this._buffer = new Array(size);
1622
- }
1623
- push(element) {
1624
- this._buffer[this._nextIndex] = element;
1625
- this._nextIndex = (this._nextIndex + 1) % this._buffer.length;
1626
- this._elementCount = Math.min(this._buffer.length, this._elementCount + 1);
1627
- }
1628
- getLast() {
1629
- if (this._elementCount === 0) {
1630
- return void 0;
1631
- }
1632
- if (this._nextIndex === 0) {
1633
- return this._buffer[this._buffer.length - 1];
1634
- }
1635
- return this._buffer[this._nextIndex - 1];
1636
- }
1637
- [Symbol.iterator]() {
1638
- return this.values();
1639
- }
1640
- *values() {
1641
- if (this._elementCount === 0) {
1642
- return;
1643
- }
1644
- if (this._elementCount < this._buffer.length) {
1645
- for (let i = 0; i < this._elementCount; i++) {
1646
- yield this._buffer[i];
1647
- }
1648
- return;
1649
- }
1650
- for (let i = this._nextIndex; i < this._buffer.length; i++) {
1651
- yield this._buffer[i];
1652
- }
1653
- for (let i = 0; i < this._nextIndex; i++) {
1654
- yield this._buffer[i];
1655
- }
1656
- }
1657
- };
1658
-
1659
- // packages/common/util/src/join-tables.ts
1660
- var joinTables = (leftColumn, rightColumn, left, right) => {
1661
- const map = /* @__PURE__ */ new Map();
1662
- const used = /* @__PURE__ */ new Set();
1663
- for (const row of right) {
1664
- map.set(row[rightColumn], row);
1665
- }
1666
- const result = [];
1667
- for (const row of left) {
1668
- const right2 = map.get(row[leftColumn]);
1669
- used.add(right2);
1670
- result.push(Object.assign(right2 ?? {}, row));
1671
- }
1672
- for (const row of right) {
1673
- if (!used.has(row)) {
1674
- result.push(row);
1675
- }
1676
- }
1677
- return result;
1678
- };
1679
-
1680
- // packages/common/util/src/throw-unhandled-error.ts
1681
- var throwUnhandledError = (error) => {
1682
- queueMicrotask(() => {
1683
- throw error;
1684
- });
1685
- };
1686
-
1687
- // packages/common/util/src/safe-await.ts
1688
- var safeAwaitAll = async (source, taskFactory, onError) => {
1689
- const failedItems = [];
1690
- await Promise.all([
1691
- ...source
1692
- ].map(async (item, idx) => {
1693
- try {
1694
- await taskFactory(item);
1695
- } catch (err) {
1696
- if (onError) {
1697
- onError(err, item, idx);
1698
- }
1699
- failedItems.push(item);
1700
- }
1701
- }));
1702
- return failedItems;
1703
- };
1704
1753
  export {
1705
1754
  BitField,
1706
1755
  Callback,
@@ -1709,6 +1758,8 @@ export {
1709
1758
  ComplexSet,
1710
1759
  HumanHasher,
1711
1760
  MapEntry,
1761
+ ParamKeyAnnotation,
1762
+ Params,
1712
1763
  Tracer,
1713
1764
  WeakDictionary,
1714
1765
  accessBy,