@dxos/keys 0.8.4-main.3a94e84 → 0.8.4-main.3c1ae3b

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.
@@ -100,29 +100,70 @@ init_inject_globals();
100
100
 
101
101
  // src/dxn.ts
102
102
  init_inject_globals();
103
- import { Schema as Schema3 } from "effect";
103
+ import * as Schema3 from "effect/Schema";
104
104
  import { devtoolsFormatter, inspectCustom } from "@dxos/debug";
105
105
  import { assertArgument, invariant as invariant2 } from "@dxos/invariant";
106
106
 
107
107
  // src/object-id.ts
108
108
  init_inject_globals();
109
- import { Schema } from "effect";
110
- import { ulid } from "ulidx";
109
+ import * as Schema from "effect/Schema";
110
+ import { monotonicFactory } from "ulidx";
111
111
  var ObjectIdSchema = Schema.String.pipe(Schema.pattern(/^[0-7][0-9A-HJKMNP-TV-Z]{25}$/i)).annotations({
112
- description: "a Universally Unique Lexicographically Sortable Identifier",
112
+ description: "A Universally Unique Lexicographically Sortable Identifier",
113
113
  pattern: "^[0-7][0-9A-HJKMNP-TV-Z]{25}$"
114
114
  });
115
115
  var ObjectId = class extends ObjectIdSchema {
116
+ static #factory = monotonicFactory();
117
+ static #seedTime = void 0;
116
118
  static isValid(id) {
117
119
  try {
118
120
  Schema.decodeSync(ObjectId)(id);
119
121
  return true;
120
- } catch (err) {
122
+ } catch {
121
123
  return false;
122
124
  }
123
125
  }
124
126
  static random() {
125
- return ulid();
127
+ return this.#factory(this.#seedTime);
128
+ }
129
+ static dangerouslyDisableRandomness() {
130
+ this.#factory = monotonicFactory(makeTestPRNG());
131
+ this.#seedTime = (/* @__PURE__ */ new Date("2025-01-01")).getTime();
132
+ }
133
+ };
134
+ var makeTestPRNG = () => {
135
+ const rng = new SimplePRNG();
136
+ return () => {
137
+ return rng.next();
138
+ };
139
+ };
140
+ var SimplePRNG = class _SimplePRNG {
141
+ #seed;
142
+ // LCG parameters (from Numerical Recipes)
143
+ static #a = 1664525;
144
+ static #c = 1013904223;
145
+ static #m = Math.pow(2, 32);
146
+ /**
147
+ * Creates a new PRNG instance.
148
+ * @param seed - Initial seed value. If not provided, uses 0.
149
+ */
150
+ constructor(seed = 0) {
151
+ this.#seed = seed;
152
+ }
153
+ /**
154
+ * Generates the next pseudo-random number in the range [0, 1).
155
+ * @returns A pseudo-random number between 0 (inclusive) and 1 (exclusive).
156
+ */
157
+ next() {
158
+ this.#seed = (_SimplePRNG.#a * this.#seed + _SimplePRNG.#c) % _SimplePRNG.#m;
159
+ return this.#seed / _SimplePRNG.#m;
160
+ }
161
+ /**
162
+ * Resets the generator with a new seed.
163
+ * @param seed - New seed value.
164
+ */
165
+ reset(seed) {
166
+ this.#seed = seed;
126
167
  }
127
168
  };
128
169
 
@@ -194,7 +235,7 @@ function base32Encode(data, variant, options) {
194
235
  }
195
236
 
196
237
  // src/space-id.ts
197
- import { Schema as Schema2 } from "effect";
238
+ import * as Schema2 from "effect/Schema";
198
239
  import { invariant } from "@dxos/invariant";
199
240
 
200
241
  // src/random-bytes.ts
@@ -214,114 +255,107 @@ var isValid = (value) => {
214
255
  return typeof value === "string" && value.startsWith(MULTIBASE_PREFIX) && value.length === ENCODED_LENGTH;
215
256
  };
216
257
  var SpaceId = class extends Schema2.String.pipe(Schema2.filter(isValid)) {
217
- static {
218
- this.byteLength = 20;
219
- }
220
- static {
221
- this.encode = (value) => {
222
- invariant(value instanceof Uint8Array, "Invalid type", {
223
- F: __dxlog_file,
224
- L: 43,
225
- S: this,
226
- A: [
227
- "value instanceof Uint8Array",
228
- "'Invalid type'"
229
- ]
230
- });
231
- invariant(value.length === SpaceId.byteLength, "Invalid length", {
232
- F: __dxlog_file,
233
- L: 44,
234
- S: this,
235
- A: [
236
- "value.length === SpaceId.byteLength",
237
- "'Invalid length'"
238
- ]
239
- });
240
- return MULTIBASE_PREFIX + base32Encode(value, "RFC4648");
241
- };
242
- }
243
- static {
244
- this.decode = (value) => {
245
- invariant(value.startsWith(MULTIBASE_PREFIX), "Invalid multibase32 encoding", {
246
- F: __dxlog_file,
247
- L: 49,
248
- S: this,
249
- A: [
250
- "value.startsWith(MULTIBASE_PREFIX)",
251
- "'Invalid multibase32 encoding'"
252
- ]
253
- });
254
- return new Uint8Array((0, import_base32_decode.default)(value.slice(1), "RFC4648"));
255
- };
256
- }
257
- static {
258
- this.isValid = isValid;
259
- }
260
- static {
261
- this.random = () => {
262
- return SpaceId.encode(randomBytes(SpaceId.byteLength));
263
- };
264
- }
258
+ static byteLength = 20;
259
+ static encode = (value) => {
260
+ invariant(value instanceof Uint8Array, "Invalid type", {
261
+ F: __dxlog_file,
262
+ L: 43,
263
+ S: this,
264
+ A: [
265
+ "value instanceof Uint8Array",
266
+ "'Invalid type'"
267
+ ]
268
+ });
269
+ invariant(value.length === SpaceId.byteLength, "Invalid length", {
270
+ F: __dxlog_file,
271
+ L: 44,
272
+ S: this,
273
+ A: [
274
+ "value.length === SpaceId.byteLength",
275
+ "'Invalid length'"
276
+ ]
277
+ });
278
+ return MULTIBASE_PREFIX + base32Encode(value, "RFC4648");
279
+ };
280
+ static decode = (value) => {
281
+ invariant(value.startsWith(MULTIBASE_PREFIX), "Invalid multibase32 encoding", {
282
+ F: __dxlog_file,
283
+ L: 49,
284
+ S: this,
285
+ A: [
286
+ "value.startsWith(MULTIBASE_PREFIX)",
287
+ "'Invalid multibase32 encoding'"
288
+ ]
289
+ });
290
+ return new Uint8Array((0, import_base32_decode.default)(value.slice(1), "RFC4648"));
291
+ };
292
+ static isValid = isValid;
293
+ static random = () => {
294
+ return SpaceId.encode(randomBytes(SpaceId.byteLength));
295
+ };
265
296
  };
266
297
 
267
298
  // src/dxn.ts
268
299
  var __dxlog_file2 = "/__w/dxos/dxos/packages/common/keys/src/dxn.ts";
269
300
  var LOCAL_SPACE_TAG = "@";
301
+ var DXN_ECHO_REGEXP = /@(dxn:[a-zA-Z0-p:@]+)/;
270
302
  var QueueSubspaceTags = Object.freeze({
271
303
  DATA: "data",
272
304
  TRACE: "trace"
273
305
  });
274
306
  var DXN = class _DXN {
275
- static {
276
- // TODO(dmaretskyi): Should this be a transformation into the DXN type?
277
- this.Schema = Schema3.NonEmptyString.pipe(
278
- Schema3.pattern(/^dxn:([^:]+):(?:[^:]+:?)+[^:]$/),
279
- // TODO(dmaretskyi): To set the format we need to move the annotation IDs out of the echo-schema package.
280
- // FormatAnnotation.set(FormatEnum.DXN),
281
- Schema3.annotations({
282
- title: "DXN",
283
- description: "DXN URI",
284
- examples: [
285
- "dxn:type:example.com/type/MyType",
286
- "dxn:echo:@:01J00J9B45YHYSGZQTQMSKMGJ6"
287
- ]
288
- })
289
- );
290
- }
307
+ // TODO(burdon): Rename to DXN (i.e., DXN.DXN).
308
+ // TODO(dmaretskyi): Should this be a transformation into the DXN type?
309
+ static Schema = Schema3.NonEmptyString.pipe(
310
+ Schema3.pattern(/^dxn:([^:]+):(?:[^:]+:?)+[^:]$/),
311
+ // TODO(dmaretskyi): To set the format we need to move the annotation IDs out of the echo-schema package.
312
+ // FormatAnnotation.set(TypeFormat.DXN),
313
+ Schema3.annotations({
314
+ title: "DXN",
315
+ description: "DXN URI",
316
+ examples: [
317
+ "dxn:type:example.com/type/MyType",
318
+ "dxn:echo:@:01J00J9B45YHYSGZQTQMSKMGJ6"
319
+ ]
320
+ })
321
+ );
291
322
  static hash(dxn) {
292
323
  return dxn.toString();
293
324
  }
294
- static {
325
+ /**
326
+ * Kind constants.
327
+ */
328
+ static kind = Object.freeze({
295
329
  /**
296
- * Kind constants.
330
+ * dxn:type:<type_name>[:<version>]
297
331
  */
298
- this.kind = Object.freeze({
299
- /**
300
- * dxn:type:<type name>[:<version>]
301
- */
302
- TYPE: "type",
303
- /**
304
- * dxn:echo:<space id>:<echo id>
305
- * dxn:echo:@:<echo id>
306
- */
307
- // TODO(burdon): Rename to OBJECT? (BREAKING CHANGE).
308
- // TODO(burdon): Add separate Kind for space.
309
- ECHO: "echo",
310
- /**
311
- * The subspace tag enables us to partition queues by usage within the context of a space.
312
- * dxn:queue:<subspace_tag>:<space_id>:<queue_id>[:object_id]
313
- * dxn:queue:data:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6
314
- * dxn:queue:trace:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6
315
- */
316
- QUEUE: "queue"
317
- });
318
- }
319
- get kind() {
320
- return this.#kind;
321
- }
332
+ TYPE: "type",
333
+ /**
334
+ * dxn:echo:<space_id>:<echo_id>
335
+ * dxn:echo:@:<echo_id>
336
+ */
337
+ // TODO(burdon): Rename to OBJECT? (BREAKING CHANGE to update "echo").
338
+ // TODO(burdon): Add separate Kind for space?
339
+ ECHO: "echo",
340
+ /**
341
+ * The subspace tag enables us to partition queues by usage within the context of a space.
342
+ * dxn:queue:<subspace_tag>:<space_id>:<queue_id>[:object_id]
343
+ * dxn:queue:data:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6
344
+ * dxn:queue:trace:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6
345
+ */
346
+ QUEUE: "queue"
347
+ });
348
+ /**
349
+ * Exactly equals.
350
+ */
322
351
  static equals(a, b) {
323
352
  return a.kind === b.kind && a.parts.length === b.parts.length && a.parts.every((part, i) => part === b.parts[i]);
324
353
  }
354
+ static equalsEchoId(a, b) {
355
+ const a1 = a.asEchoDXN();
356
+ const b1 = b.asEchoDXN();
357
+ return !!a1 && !!b1 && a1.echoId === b1.echoId;
358
+ }
325
359
  // TODO(burdon): Rename isValid.
326
360
  static isDXNString(dxn) {
327
361
  return dxn.startsWith("dxn:");
@@ -345,12 +379,12 @@ var DXN = class _DXN {
345
379
  static tryParse(dxn) {
346
380
  try {
347
381
  return _DXN.parse(dxn);
348
- } catch (error) {
382
+ } catch {
349
383
  return void 0;
350
384
  }
351
385
  }
352
386
  /**
353
- * @example `dxn:type:example.com/type/Contact`
387
+ * @example `dxn:type:example.com/type/Person`
354
388
  */
355
389
  static fromTypename(typename) {
356
390
  return new _DXN(_DXN.kind.TYPE, [
@@ -358,7 +392,7 @@ var DXN = class _DXN {
358
392
  ]);
359
393
  }
360
394
  /**
361
- * @example `dxn:type:example.com/type/Contact:0.1.0`
395
+ * @example `dxn:type:example.com/type/Person:0.1.0`
362
396
  */
363
397
  // TODO(dmaretskyi): Consider using @ as the version separator.
364
398
  static fromTypenameAndVersion(typename, version) {
@@ -368,43 +402,30 @@ var DXN = class _DXN {
368
402
  ]);
369
403
  }
370
404
  /**
405
+ * @example `dxn:echo:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6`
406
+ */
407
+ static fromSpaceAndObjectId(spaceId, objectId) {
408
+ assertArgument(SpaceId.isValid(spaceId), `Invalid space ID: ${spaceId}`);
409
+ assertArgument(ObjectId.isValid(objectId), "objectId", `Invalid object ID: ${objectId}`);
410
+ return new _DXN(_DXN.kind.ECHO, [
411
+ spaceId,
412
+ objectId
413
+ ]);
414
+ }
415
+ /**
371
416
  * @example `dxn:echo:@:01J00J9B45YHYSGZQTQMSKMGJ6`
372
417
  */
373
418
  static fromLocalObjectId(id) {
374
- assertArgument(ObjectId.isValid(id), `Invalid object ID: ${id}`);
419
+ assertArgument(ObjectId.isValid(id), "id", `Invalid object ID: ${id}`);
375
420
  return new _DXN(_DXN.kind.ECHO, [
376
421
  LOCAL_SPACE_TAG,
377
422
  id
378
423
  ]);
379
424
  }
380
425
  static fromQueue(subspaceTag, spaceId, queueId, objectId) {
381
- invariant2(SpaceId.isValid(spaceId), void 0, {
382
- F: __dxlog_file2,
383
- L: 151,
384
- S: this,
385
- A: [
386
- "SpaceId.isValid(spaceId)",
387
- ""
388
- ]
389
- });
390
- invariant2(ObjectId.isValid(queueId), void 0, {
391
- F: __dxlog_file2,
392
- L: 152,
393
- S: this,
394
- A: [
395
- "ObjectId.isValid(queueId)",
396
- ""
397
- ]
398
- });
399
- invariant2(!objectId || ObjectId.isValid(objectId), void 0, {
400
- F: __dxlog_file2,
401
- L: 153,
402
- S: this,
403
- A: [
404
- "!objectId || ObjectId.isValid(objectId)",
405
- ""
406
- ]
407
- });
426
+ assertArgument(SpaceId.isValid(spaceId), `Invalid space ID: ${spaceId}`);
427
+ assertArgument(ObjectId.isValid(queueId), "queueId", `Invalid queue ID: ${queueId}`);
428
+ assertArgument(!objectId || ObjectId.isValid(objectId), "objectId", `Invalid object ID: ${objectId}`);
408
429
  return new _DXN(_DXN.kind.QUEUE, [
409
430
  subspaceTag,
410
431
  spaceId,
@@ -417,33 +438,17 @@ var DXN = class _DXN {
417
438
  #kind;
418
439
  #parts;
419
440
  constructor(kind, parts) {
420
- invariant2(parts.length > 0, void 0, {
421
- F: __dxlog_file2,
422
- L: 162,
423
- S: this,
424
- A: [
425
- "parts.length > 0",
426
- ""
427
- ]
428
- });
429
- invariant2(parts.every((part) => typeof part === "string" && part.length > 0 && part.indexOf(":") === -1), void 0, {
430
- F: __dxlog_file2,
431
- L: 163,
432
- S: this,
433
- A: [
434
- "parts.every((part) => typeof part === 'string' && part.length > 0 && part.indexOf(':') === -1)",
435
- ""
436
- ]
437
- });
441
+ assertArgument(parts.length > 0, "parts", `Invalid DXN: ${parts}`);
442
+ assertArgument(parts.every((part) => typeof part === "string" && part.length > 0 && part.indexOf(":") === -1), "parts", `Invalid DXN: ${parts}`);
438
443
  switch (kind) {
439
444
  case _DXN.kind.TYPE:
440
445
  if (parts.length > 2) {
441
- throw new Error('Invalid "type" DXN');
446
+ throw new Error("Invalid DXN.kind.TYPE");
442
447
  }
443
448
  break;
444
449
  case _DXN.kind.ECHO:
445
450
  if (parts.length !== 2) {
446
- throw new Error('Invalid "echo" DXN');
451
+ throw new Error("Invalid DXN.kind.ECHO");
447
452
  }
448
453
  break;
449
454
  }
@@ -478,6 +483,9 @@ var DXN = class _DXN {
478
483
  }
479
484
  };
480
485
  }
486
+ get kind() {
487
+ return this.#kind;
488
+ }
481
489
  get parts() {
482
490
  return this.#parts;
483
491
  }
@@ -485,7 +493,7 @@ var DXN = class _DXN {
485
493
  get typename() {
486
494
  invariant2(this.#kind === _DXN.kind.TYPE, void 0, {
487
495
  F: __dxlog_file2,
488
- L: 218,
496
+ L: 250,
489
497
  S: this,
490
498
  A: [
491
499
  "this.#kind === DXN.kind.TYPE",
@@ -494,6 +502,9 @@ var DXN = class _DXN {
494
502
  });
495
503
  return this.#parts[0];
496
504
  }
505
+ equals(other) {
506
+ return _DXN.equals(this, other);
507
+ }
497
508
  hasTypenameOf(typename) {
498
509
  return this.#kind === _DXN.kind.TYPE && this.#parts.length === 1 && this.#parts[0] === typename;
499
510
  }
@@ -518,6 +529,7 @@ var DXN = class _DXN {
518
529
  const [spaceId, echoId] = this.#parts;
519
530
  return {
520
531
  spaceId: spaceId === LOCAL_SPACE_TAG ? void 0 : spaceId,
532
+ // TODO(burdon): objectId.
521
533
  echoId
522
534
  };
523
535
  }
@@ -536,6 +548,15 @@ var DXN = class _DXN {
536
548
  objectId
537
549
  };
538
550
  }
551
+ /**
552
+ * Produces a new DXN with the given parts appended.
553
+ */
554
+ extend(parts) {
555
+ return new _DXN(this.#kind, [
556
+ ...this.#parts,
557
+ ...parts
558
+ ]);
559
+ }
539
560
  };
540
561
 
541
562
  // src/identity-did.ts
@@ -599,9 +620,8 @@ var PUBLIC_KEY_LENGTH = 32;
599
620
  var SECRET_KEY_LENGTH = 64;
600
621
  var isLikeArrayBuffer = (value) => typeof value === "object" && value !== null && Object.getPrototypeOf(value).constructor.name === "ArrayBuffer";
601
622
  var PublicKey = class _PublicKey {
602
- static {
603
- this.ZERO = _PublicKey.from("00".repeat(PUBLIC_KEY_LENGTH));
604
- }
623
+ _value;
624
+ static ZERO = _PublicKey.from("00".repeat(PUBLIC_KEY_LENGTH));
605
625
  /**
606
626
  * Creates new instance of PublicKey automatically determining the input format.
607
627
  * @param source A Buffer, or Uint8Array, or hex encoded string, or something with an `asUint8Array` method on it
@@ -610,7 +630,7 @@ var PublicKey = class _PublicKey {
610
630
  static from(source) {
611
631
  invariant4(source, void 0, {
612
632
  F: __dxlog_file4,
613
- L: 49,
633
+ L: 50,
614
634
  S: this,
615
635
  A: [
616
636
  "source",
@@ -702,7 +722,7 @@ var PublicKey = class _PublicKey {
702
722
  static bufferize(str) {
703
723
  invariant4(typeof str === "string", "Invalid type", {
704
724
  F: __dxlog_file4,
705
- L: 152,
725
+ L: 153,
706
726
  S: this,
707
727
  A: [
708
728
  "typeof str === 'string'",
@@ -725,7 +745,7 @@ var PublicKey = class _PublicKey {
725
745
  }
726
746
  invariant4(key instanceof Buffer2, "Invalid type", {
727
747
  F: __dxlog_file4,
728
- L: 171,
748
+ L: 172,
729
749
  S: this,
730
750
  A: [
731
751
  "key instanceof Buffer",
@@ -744,7 +764,7 @@ var PublicKey = class _PublicKey {
744
764
  static fromMultibase32(encoded) {
745
765
  invariant4(encoded.startsWith("B"), "Invalid multibase32 encoding", {
746
766
  F: __dxlog_file4,
747
- L: 184,
767
+ L: 185,
748
768
  S: this,
749
769
  A: [
750
770
  "encoded.startsWith('B')",
@@ -883,6 +903,7 @@ var PublicKey = class _PublicKey {
883
903
  };
884
904
  export {
885
905
  DXN,
906
+ DXN_ECHO_REGEXP,
886
907
  IdentityDid,
887
908
  LOCAL_SPACE_TAG,
888
909
  ObjectId,
@@ -890,6 +911,7 @@ export {
890
911
  PublicKey,
891
912
  QueueSubspaceTags,
892
913
  SECRET_KEY_LENGTH,
914
+ SimplePRNG,
893
915
  SpaceId
894
916
  };
895
917
  //# sourceMappingURL=index.mjs.map