@dxos/keys 0.8.4-main.fdfb99ef29 → 0.8.4-staging.60fe92afc8
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/LICENSE +102 -5
- package/dist/lib/browser/index.mjs +292 -341
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +287 -339
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/DXN.d.ts +50 -0
- package/dist/types/src/DXN.d.ts.map +1 -0
- package/dist/types/src/DXN.test.d.ts +2 -0
- package/dist/types/src/DXN.test.d.ts.map +1 -0
- package/dist/types/src/EID.d.ts +74 -0
- package/dist/types/src/EID.d.ts.map +1 -0
- package/dist/types/src/EID.test.d.ts +2 -0
- package/dist/types/src/EID.test.d.ts.map +1 -0
- package/dist/types/src/URI.d.ts +23 -0
- package/dist/types/src/URI.d.ts.map +1 -0
- package/dist/types/src/entity-id.d.ts +104 -0
- package/dist/types/src/entity-id.d.ts.map +1 -0
- package/dist/types/src/entity-id.test.d.ts +2 -0
- package/dist/types/src/entity-id.test.d.ts.map +1 -0
- package/dist/types/src/identity-did.d.ts +6 -4
- package/dist/types/src/identity-did.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +5 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/parse-id.d.ts +10 -0
- package/dist/types/src/parse-id.d.ts.map +1 -0
- package/dist/types/src/parse-id.test.d.ts +2 -0
- package/dist/types/src/parse-id.test.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/src/DXN.test.ts +85 -0
- package/src/DXN.ts +104 -0
- package/src/EID.test.ts +147 -0
- package/src/EID.ts +151 -0
- package/src/URI.ts +35 -0
- package/src/entity-id.test.ts +73 -0
- package/src/entity-id.ts +202 -0
- package/src/identity-did.test.ts +19 -2
- package/src/identity-did.ts +60 -25
- package/src/index.ts +6 -2
- package/src/parse-id.test.ts +32 -0
- package/src/parse-id.ts +32 -0
- package/src/public-key.ts +2 -2
- package/dist/types/src/dxn.d.ts +0 -129
- package/dist/types/src/dxn.d.ts.map +0 -1
- package/dist/types/src/object-id.d.ts +0 -65
- package/dist/types/src/object-id.d.ts.map +0 -1
- package/src/dxn.ts +0 -345
- package/src/object-id.ts +0 -131
|
@@ -16,6 +16,10 @@ var __esm = (fn, res) => function __init() {
|
|
|
16
16
|
var __commonJS = (cb, mod) => function __require2() {
|
|
17
17
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
18
18
|
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
22
|
+
};
|
|
19
23
|
var __copyProps = (to, from, except, desc) => {
|
|
20
24
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
21
25
|
for (let key of __getOwnPropNames(from))
|
|
@@ -98,76 +102,147 @@ var require_base32_decode = __commonJS({
|
|
|
98
102
|
// src/index.ts
|
|
99
103
|
init_inject_globals();
|
|
100
104
|
|
|
101
|
-
// src/
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
// src/DXN.ts
|
|
106
|
+
var DXN_exports = {};
|
|
107
|
+
__export(DXN_exports, {
|
|
108
|
+
Schema: () => Schema_,
|
|
109
|
+
getName: () => getName,
|
|
110
|
+
getVersion: () => getVersion,
|
|
111
|
+
isDXN: () => isDXN,
|
|
112
|
+
make: () => make,
|
|
113
|
+
tryMake: () => tryMake
|
|
114
|
+
});
|
|
108
115
|
init_inject_globals();
|
|
109
116
|
import * as Schema from "effect/Schema";
|
|
110
|
-
|
|
111
|
-
var
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
static isValid(id) {
|
|
119
|
-
try {
|
|
120
|
-
Schema.decodeSync(ObjectId)(id);
|
|
121
|
-
return true;
|
|
122
|
-
} catch {
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
117
|
+
var DXN_SPEC_REGEXP = /^dxn:[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\.[a-zA-Z][a-zA-Z0-9]{0,62})(:\d+\.\d+\.\d+)?$/;
|
|
118
|
+
var isDXN = (value) => typeof value === "string" && value.startsWith("dxn:");
|
|
119
|
+
var make = (nsid, version) => parse(version != null ? `dxn:${nsid}:${version}` : `dxn:${nsid}`);
|
|
120
|
+
var tryMake = (dxn) => {
|
|
121
|
+
try {
|
|
122
|
+
return parse(dxn);
|
|
123
|
+
} catch {
|
|
124
|
+
return void 0;
|
|
125
125
|
}
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
};
|
|
127
|
+
var parse = (dxn) => {
|
|
128
|
+
if (typeof dxn === "string" && DXN_SPEC_REGEXP.test(dxn)) {
|
|
129
|
+
return dxn;
|
|
128
130
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
131
|
+
throw new Error(`Invalid DXN: ${dxn}`);
|
|
132
|
+
};
|
|
133
|
+
var getName = (dxn) => {
|
|
134
|
+
const match = /^dxn:([^:]+)/.exec(dxn);
|
|
135
|
+
if (!match) {
|
|
136
|
+
throw new Error(`Invalid DXN: ${dxn}`);
|
|
132
137
|
}
|
|
138
|
+
return match[1];
|
|
133
139
|
};
|
|
134
|
-
var
|
|
135
|
-
const
|
|
136
|
-
return
|
|
137
|
-
return rng.next();
|
|
138
|
-
};
|
|
140
|
+
var getVersion = (dxn) => {
|
|
141
|
+
const match = /^dxn:[^:]+:(\d+\.\d+\.\d+)$/.exec(dxn);
|
|
142
|
+
return match?.[1];
|
|
139
143
|
};
|
|
140
|
-
var
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
144
|
+
var Schema_ = Schema.String.pipe(Schema.filter((value) => isDXN(value), {
|
|
145
|
+
message: () => "Invalid DXN"
|
|
146
|
+
}), Schema.annotations({
|
|
147
|
+
title: "DXN",
|
|
148
|
+
description: "DXN URI: dxn:<nsid>[:<version>]"
|
|
149
|
+
}));
|
|
150
|
+
|
|
151
|
+
// src/EID.ts
|
|
152
|
+
var EID_exports = {};
|
|
153
|
+
__export(EID_exports, {
|
|
154
|
+
Schema: () => Schema_2,
|
|
155
|
+
equals: () => equals,
|
|
156
|
+
getEntityId: () => getEntityId,
|
|
157
|
+
getSpaceId: () => getSpaceId,
|
|
158
|
+
isEID: () => isEID,
|
|
159
|
+
isLocal: () => isLocal,
|
|
160
|
+
make: () => make2,
|
|
161
|
+
parse: () => parse2,
|
|
162
|
+
toLocal: () => toLocal,
|
|
163
|
+
tryParse: () => tryParse
|
|
164
|
+
});
|
|
165
|
+
init_inject_globals();
|
|
166
|
+
import * as Schema2 from "effect/Schema";
|
|
167
|
+
var ECHO_URI_REGEXP = /^echo:(?:\/\/[^/]+(?:\/[^/]+)?|(?:\/\/\/|\/)[^/]+)$/;
|
|
168
|
+
var QUALIFIED_RE = /^echo:\/\/([^/]+)\/([^/]+)$/;
|
|
169
|
+
var SPACE_ONLY_RE = /^echo:\/\/([^/]+)$/;
|
|
170
|
+
var LOCAL_RE = /^echo:(?:\/\/\/|\/)([^/]+)$/;
|
|
171
|
+
var isEID = (value) => typeof value === "string" && value.startsWith("echo:");
|
|
172
|
+
var parse2 = (uri) => {
|
|
173
|
+
if (!ECHO_URI_REGEXP.test(uri)) {
|
|
174
|
+
throw new Error(`Invalid EID: ${uri}`);
|
|
175
|
+
}
|
|
176
|
+
return uri;
|
|
177
|
+
};
|
|
178
|
+
var tryParse = (uri) => {
|
|
179
|
+
try {
|
|
180
|
+
return parse2(uri);
|
|
181
|
+
} catch {
|
|
182
|
+
return void 0;
|
|
167
183
|
}
|
|
168
184
|
};
|
|
185
|
+
var make2 = ({ spaceId, entityId }) => {
|
|
186
|
+
let raw;
|
|
187
|
+
if (spaceId != null && entityId != null) {
|
|
188
|
+
raw = `echo://${spaceId}/${entityId}`;
|
|
189
|
+
} else if (entityId != null) {
|
|
190
|
+
raw = `echo:/${entityId}`;
|
|
191
|
+
} else if (spaceId != null) {
|
|
192
|
+
raw = `echo://${spaceId}`;
|
|
193
|
+
} else {
|
|
194
|
+
throw new Error("EID.make requires at least one of spaceId or entityId");
|
|
195
|
+
}
|
|
196
|
+
return parse2(raw);
|
|
197
|
+
};
|
|
198
|
+
var getSpaceId = (uri) => {
|
|
199
|
+
const normalized = parse2(uri);
|
|
200
|
+
const match = QUALIFIED_RE.exec(normalized) ?? SPACE_ONLY_RE.exec(normalized);
|
|
201
|
+
return match?.[1];
|
|
202
|
+
};
|
|
203
|
+
var getEntityId = (uri) => {
|
|
204
|
+
const normalized = parse2(uri);
|
|
205
|
+
const qualMatch = QUALIFIED_RE.exec(normalized);
|
|
206
|
+
if (qualMatch) {
|
|
207
|
+
return qualMatch[2];
|
|
208
|
+
}
|
|
209
|
+
const localMatch = LOCAL_RE.exec(normalized);
|
|
210
|
+
return localMatch?.[1];
|
|
211
|
+
};
|
|
212
|
+
var isLocal = (uri) => {
|
|
213
|
+
const normalized = parse2(uri);
|
|
214
|
+
return LOCAL_RE.test(normalized);
|
|
215
|
+
};
|
|
216
|
+
var toLocal = (uri) => {
|
|
217
|
+
const entityId = getEntityId(uri);
|
|
218
|
+
return entityId != null ? make2({
|
|
219
|
+
entityId
|
|
220
|
+
}) : parse2(uri);
|
|
221
|
+
};
|
|
222
|
+
var equals = (a, b) => parse2(a) === parse2(b);
|
|
223
|
+
var Schema_2 = Schema2.String.pipe(Schema2.filter((value) => isEID(value), {
|
|
224
|
+
message: () => "Invalid EID: must start with echo:"
|
|
225
|
+
}), Schema2.annotations({
|
|
226
|
+
title: "EID",
|
|
227
|
+
description: "ECHO object/space URI: echo://<spaceId>[/<objectId>] or echo:/<objectId>"
|
|
228
|
+
}));
|
|
169
229
|
|
|
170
|
-
// src/
|
|
230
|
+
// src/URI.ts
|
|
231
|
+
var URI_exports = {};
|
|
232
|
+
__export(URI_exports, {
|
|
233
|
+
Schema: () => Schema_3,
|
|
234
|
+
isURI: () => isURI,
|
|
235
|
+
make: () => make3
|
|
236
|
+
});
|
|
237
|
+
init_inject_globals();
|
|
238
|
+
import * as Schema3 from "effect/Schema";
|
|
239
|
+
var make3 = (uri) => uri;
|
|
240
|
+
var isURI = (value) => typeof value === "string" && /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(value);
|
|
241
|
+
var Schema_3 = Schema3.String.pipe(Schema3.filter((value) => isURI(value), {
|
|
242
|
+
message: () => "Invalid URI"
|
|
243
|
+
}));
|
|
244
|
+
|
|
245
|
+
// src/identity-did.ts
|
|
171
246
|
init_inject_globals();
|
|
172
247
|
var import_base32_decode = __toESM(require_base32_decode(), 1);
|
|
173
248
|
|
|
@@ -234,8 +309,8 @@ function base32Encode(data, variant, options) {
|
|
|
234
309
|
return output;
|
|
235
310
|
}
|
|
236
311
|
|
|
237
|
-
// src/
|
|
238
|
-
import * as
|
|
312
|
+
// src/identity-did.ts
|
|
313
|
+
import * as Schema4 from "effect/Schema";
|
|
239
314
|
import { invariant } from "@dxos/invariant";
|
|
240
315
|
|
|
241
316
|
// src/random-bytes.ts
|
|
@@ -247,315 +322,161 @@ var randomBytes = (length) => {
|
|
|
247
322
|
return bytes;
|
|
248
323
|
};
|
|
249
324
|
|
|
250
|
-
// src/
|
|
325
|
+
// src/identity-did.ts
|
|
251
326
|
var MULTIBASE_PREFIX = "B";
|
|
252
|
-
var
|
|
327
|
+
var DID_PREFIX = "did:halo:";
|
|
328
|
+
var DECODED_BYTE_LENGTH = 20;
|
|
329
|
+
var ENCODED_LENGTH = 42;
|
|
330
|
+
var RFC4648_BASE32_PATTERN = /^[A-Z2-7]+$/;
|
|
253
331
|
var isValid = (value) => {
|
|
254
|
-
|
|
332
|
+
if (typeof value !== "string" || !value.startsWith(DID_PREFIX + MULTIBASE_PREFIX) || value.length !== ENCODED_LENGTH) {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
const encoded = value.slice(DID_PREFIX.length + MULTIBASE_PREFIX.length);
|
|
336
|
+
if (!RFC4648_BASE32_PATTERN.test(encoded)) {
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
try {
|
|
340
|
+
return (0, import_base32_decode.default)(encoded, "RFC4648").byteLength === DECODED_BYTE_LENGTH;
|
|
341
|
+
} catch {
|
|
342
|
+
return false;
|
|
343
|
+
}
|
|
255
344
|
};
|
|
256
|
-
var
|
|
257
|
-
static byteLength =
|
|
345
|
+
var IdentityDid = class extends Schema4.String.pipe(Schema4.filter(isValid)) {
|
|
346
|
+
static byteLength = DECODED_BYTE_LENGTH;
|
|
258
347
|
static encode = (value) => {
|
|
259
348
|
invariant(value instanceof Uint8Array, "Invalid type");
|
|
260
|
-
invariant(value.length ===
|
|
261
|
-
return MULTIBASE_PREFIX + base32Encode(value, "RFC4648");
|
|
349
|
+
invariant(value.length === IdentityDid.byteLength, "Invalid length");
|
|
350
|
+
return DID_PREFIX + MULTIBASE_PREFIX + base32Encode(value, "RFC4648");
|
|
262
351
|
};
|
|
263
352
|
static decode = (value) => {
|
|
264
|
-
invariant(value.startsWith(MULTIBASE_PREFIX), "Invalid multibase32 encoding");
|
|
265
|
-
return new Uint8Array((0, import_base32_decode.default)(value.slice(
|
|
353
|
+
invariant(value.startsWith(DID_PREFIX + MULTIBASE_PREFIX), "Invalid multibase32 encoding");
|
|
354
|
+
return new Uint8Array((0, import_base32_decode.default)(value.slice(DID_PREFIX.length + MULTIBASE_PREFIX.length), "RFC4648"));
|
|
266
355
|
};
|
|
267
356
|
static isValid = isValid;
|
|
268
357
|
static random = () => {
|
|
269
|
-
return
|
|
358
|
+
return IdentityDid.encode(randomBytes(IdentityDid.byteLength));
|
|
270
359
|
};
|
|
271
360
|
};
|
|
272
361
|
|
|
273
|
-
// src/
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
362
|
+
// src/entity-id.ts
|
|
363
|
+
init_inject_globals();
|
|
364
|
+
import * as Schema5 from "effect/Schema";
|
|
365
|
+
import { monotonicFactory } from "ulidx";
|
|
366
|
+
var ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
367
|
+
var EntityIdSchema = Schema5.String.pipe(Schema5.pattern(/^[0-7][0-9A-HJKMNP-TV-Z]{25}$/i)).annotations({
|
|
368
|
+
description: "A Universally Unique Lexicographically Sortable Identifier",
|
|
369
|
+
pattern: "^[0-7][0-9A-HJKMNP-TV-Z]{25}$"
|
|
279
370
|
});
|
|
280
|
-
var
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
static
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
examples: [
|
|
291
|
-
"dxn:type:com.example.type.my-type",
|
|
292
|
-
"dxn:echo:@:01J00J9B45YHYSGZQTQMSKMGJ6"
|
|
293
|
-
]
|
|
294
|
-
})
|
|
295
|
-
);
|
|
296
|
-
static hash(dxn) {
|
|
297
|
-
return dxn.toString();
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* Kind constants.
|
|
301
|
-
*/
|
|
302
|
-
static kind = Object.freeze({
|
|
303
|
-
/**
|
|
304
|
-
* dxn:type:<type_name>[:<version>]
|
|
305
|
-
*/
|
|
306
|
-
TYPE: "type",
|
|
307
|
-
/**
|
|
308
|
-
* dxn:echo:<space_id>:<echo_id>
|
|
309
|
-
* dxn:echo:@:<echo_id>
|
|
310
|
-
*/
|
|
311
|
-
// TODO(burdon): Rename to OBJECT? (BREAKING CHANGE to update "echo").
|
|
312
|
-
// TODO(burdon): Add separate Kind for space?
|
|
313
|
-
ECHO: "echo",
|
|
314
|
-
/**
|
|
315
|
-
* The subspace tag enables us to partition queues by usage within the context of a space.
|
|
316
|
-
* dxn:queue:<subspace_tag>:<space_id>:<queue_id>[:object_id]
|
|
317
|
-
* dxn:queue:data:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6
|
|
318
|
-
* dxn:queue:trace:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6
|
|
319
|
-
*/
|
|
320
|
-
QUEUE: "queue"
|
|
321
|
-
});
|
|
322
|
-
/**
|
|
323
|
-
* Exactly equals.
|
|
324
|
-
*/
|
|
325
|
-
static equals(a, b) {
|
|
326
|
-
return a.kind === b.kind && a.parts.length === b.parts.length && a.parts.every((part, i) => part === b.parts[i]);
|
|
327
|
-
}
|
|
328
|
-
static equalsEchoId(a, b) {
|
|
329
|
-
const a1 = a.asEchoDXN();
|
|
330
|
-
const b1 = b.asEchoDXN();
|
|
331
|
-
return !!a1 && !!b1 && a1.echoId === b1.echoId;
|
|
371
|
+
var EntityId = class extends EntityIdSchema {
|
|
372
|
+
static #factory = monotonicFactory();
|
|
373
|
+
static #seedTime = void 0;
|
|
374
|
+
static isValid(id) {
|
|
375
|
+
try {
|
|
376
|
+
Schema5.decodeSync(EntityId)(id);
|
|
377
|
+
return true;
|
|
378
|
+
} catch {
|
|
379
|
+
return false;
|
|
380
|
+
}
|
|
332
381
|
}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
return dxn.startsWith("dxn:");
|
|
382
|
+
static random() {
|
|
383
|
+
return this.#factory(this.#seedTime);
|
|
336
384
|
}
|
|
337
|
-
static
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
if (!(typeof kind === "string" && kind.length > 0)) {
|
|
346
|
-
throw new Error(`Invalid DXN: ${dxn}`);
|
|
385
|
+
static deterministic(...seed) {
|
|
386
|
+
const input = seed.map((value) => String(value)).join("\0");
|
|
387
|
+
let h1 = 2166136261 >>> 0;
|
|
388
|
+
let h2 = 461845907 >>> 0;
|
|
389
|
+
for (let i = 0; i < input.length; i++) {
|
|
390
|
+
const code = input.charCodeAt(i);
|
|
391
|
+
h1 = Math.imul(h1 ^ code, 16777619) >>> 0;
|
|
392
|
+
h2 = Math.imul(h2 ^ (code << 13 | code >>> 3), 16777619) >>> 0;
|
|
347
393
|
}
|
|
348
|
-
|
|
349
|
-
|
|
394
|
+
const time = ALPHABET[0].repeat(10);
|
|
395
|
+
let bits = BigInt(h1) << 32n | BigInt(h2);
|
|
396
|
+
let rand = "";
|
|
397
|
+
for (let i = 0; i < 16; i++) {
|
|
398
|
+
rand = ALPHABET[Number(bits & 0x1fn)] + rand;
|
|
399
|
+
bits >>= 5n;
|
|
350
400
|
}
|
|
351
|
-
return
|
|
401
|
+
return time + rand;
|
|
352
402
|
}
|
|
353
|
-
static
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
} catch {
|
|
357
|
-
return void 0;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
/**
|
|
361
|
-
* @example `dxn:type:com.example.type.person`
|
|
362
|
-
*/
|
|
363
|
-
static fromTypename(typename) {
|
|
364
|
-
return new _DXN(_DXN.kind.TYPE, [
|
|
365
|
-
typename
|
|
366
|
-
]);
|
|
403
|
+
static dangerouslyDisableRandomness() {
|
|
404
|
+
this.#factory = monotonicFactory(makeTestPRNG());
|
|
405
|
+
this.#seedTime = (/* @__PURE__ */ new Date("2025-01-01")).getTime();
|
|
367
406
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
// TODO(dmaretskyi): Consider using @ as the version separator.
|
|
372
|
-
static fromTypenameAndVersion(typename, version) {
|
|
373
|
-
return new _DXN(_DXN.kind.TYPE, [
|
|
374
|
-
typename,
|
|
375
|
-
version
|
|
376
|
-
]);
|
|
407
|
+
static dangerouslySetSeed(time, seed) {
|
|
408
|
+
this.#factory = monotonicFactory(makeTestPRNG(seed));
|
|
409
|
+
this.#seedTime = time;
|
|
377
410
|
}
|
|
411
|
+
};
|
|
412
|
+
var makeTestPRNG = (seed = 0) => {
|
|
413
|
+
const rng = new SimplePRNG(seed);
|
|
414
|
+
return () => {
|
|
415
|
+
return rng.next();
|
|
416
|
+
};
|
|
417
|
+
};
|
|
418
|
+
var SimplePRNG = class _SimplePRNG {
|
|
419
|
+
#seed;
|
|
420
|
+
// LCG parameters (from Numerical Recipes)
|
|
421
|
+
static #a = 1664525;
|
|
422
|
+
static #c = 1013904223;
|
|
423
|
+
static #m = Math.pow(2, 32);
|
|
378
424
|
/**
|
|
379
|
-
*
|
|
425
|
+
* Creates a new PRNG instance.
|
|
426
|
+
* @param seed - Initial seed value. If not provided, uses 0.
|
|
380
427
|
*/
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
assertArgument(ObjectId.isValid(objectId), "objectId", `Invalid object ID: ${objectId}`);
|
|
384
|
-
return new _DXN(_DXN.kind.ECHO, [
|
|
385
|
-
spaceId,
|
|
386
|
-
objectId
|
|
387
|
-
]);
|
|
428
|
+
constructor(seed = 0) {
|
|
429
|
+
this.#seed = seed;
|
|
388
430
|
}
|
|
389
431
|
/**
|
|
390
|
-
*
|
|
432
|
+
* Generates the next pseudo-random number in the range [0, 1).
|
|
433
|
+
* @returns A pseudo-random number between 0 (inclusive) and 1 (exclusive).
|
|
391
434
|
*/
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
return
|
|
395
|
-
LOCAL_SPACE_TAG,
|
|
396
|
-
id
|
|
397
|
-
]);
|
|
398
|
-
}
|
|
399
|
-
static fromQueue(subspaceTag, spaceId, queueId, objectId) {
|
|
400
|
-
assertArgument(SpaceId.isValid(spaceId), `Invalid space ID: ${spaceId}`);
|
|
401
|
-
assertArgument(ObjectId.isValid(queueId), "queueId", `Invalid queue ID: ${queueId}`);
|
|
402
|
-
assertArgument(!objectId || ObjectId.isValid(objectId), "objectId", `Invalid object ID: ${objectId}`);
|
|
403
|
-
return new _DXN(_DXN.kind.QUEUE, [
|
|
404
|
-
subspaceTag,
|
|
405
|
-
spaceId,
|
|
406
|
-
queueId,
|
|
407
|
-
...objectId ? [
|
|
408
|
-
objectId
|
|
409
|
-
] : []
|
|
410
|
-
]);
|
|
411
|
-
}
|
|
412
|
-
#kind;
|
|
413
|
-
#parts;
|
|
414
|
-
constructor(kind, parts) {
|
|
415
|
-
assertArgument(parts.length > 0, "parts", `Invalid DXN: ${parts}`);
|
|
416
|
-
assertArgument(parts.every((part) => typeof part === "string" && part.length > 0 && part.indexOf(":") === -1), "parts", `Invalid DXN: ${parts}`);
|
|
417
|
-
switch (kind) {
|
|
418
|
-
case _DXN.kind.TYPE:
|
|
419
|
-
if (parts.length > 2) {
|
|
420
|
-
throw new Error("Invalid DXN.kind.TYPE");
|
|
421
|
-
}
|
|
422
|
-
break;
|
|
423
|
-
case _DXN.kind.ECHO:
|
|
424
|
-
if (parts.length !== 2) {
|
|
425
|
-
throw new Error("Invalid DXN.kind.ECHO");
|
|
426
|
-
}
|
|
427
|
-
break;
|
|
428
|
-
}
|
|
429
|
-
this.#kind = kind;
|
|
430
|
-
this.#parts = parts;
|
|
431
|
-
}
|
|
432
|
-
toString() {
|
|
433
|
-
return `dxn:${this.#kind}:${this.#parts.join(":")}`;
|
|
434
|
-
}
|
|
435
|
-
toJSON() {
|
|
436
|
-
return this.toString();
|
|
435
|
+
next() {
|
|
436
|
+
this.#seed = (_SimplePRNG.#a * this.#seed + _SimplePRNG.#c) % _SimplePRNG.#m;
|
|
437
|
+
return this.#seed / _SimplePRNG.#m;
|
|
437
438
|
}
|
|
438
439
|
/**
|
|
439
|
-
*
|
|
440
|
+
* Resets the generator with a new seed.
|
|
441
|
+
* @param seed - New seed value.
|
|
440
442
|
*/
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
return `\x1B[${code}m`;
|
|
444
|
-
};
|
|
445
|
-
return printControlCode(inspectFn.colors.blueBright[0]) + this.toString() + printControlCode(inspectFn.colors.reset[0]);
|
|
446
|
-
}
|
|
447
|
-
get [devtoolsFormatter]() {
|
|
448
|
-
return {
|
|
449
|
-
header: () => {
|
|
450
|
-
return [
|
|
451
|
-
"span",
|
|
452
|
-
{
|
|
453
|
-
style: "font-weight: bold;"
|
|
454
|
-
},
|
|
455
|
-
this.toString()
|
|
456
|
-
];
|
|
457
|
-
}
|
|
458
|
-
};
|
|
459
|
-
}
|
|
460
|
-
get kind() {
|
|
461
|
-
return this.#kind;
|
|
462
|
-
}
|
|
463
|
-
get parts() {
|
|
464
|
-
return this.#parts;
|
|
465
|
-
}
|
|
466
|
-
// TODO(burdon): Should getters fail?
|
|
467
|
-
get typename() {
|
|
468
|
-
invariant2(this.#kind === _DXN.kind.TYPE);
|
|
469
|
-
return this.#parts[0];
|
|
470
|
-
}
|
|
471
|
-
equals(other) {
|
|
472
|
-
return _DXN.equals(this, other);
|
|
473
|
-
}
|
|
474
|
-
hasTypenameOf(typename) {
|
|
475
|
-
return this.#kind === _DXN.kind.TYPE && this.#parts.length === 1 && this.#parts[0] === typename;
|
|
476
|
-
}
|
|
477
|
-
isLocalObjectId() {
|
|
478
|
-
return this.#kind === _DXN.kind.ECHO && this.#parts[0] === LOCAL_SPACE_TAG && this.#parts.length === 2;
|
|
443
|
+
reset(seed) {
|
|
444
|
+
this.#seed = seed;
|
|
479
445
|
}
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
// src/parse-id.ts
|
|
449
|
+
init_inject_globals();
|
|
450
|
+
var SPACE_ID_LENGTH = 33;
|
|
451
|
+
var OBJECT_ID_LENGTH = 26;
|
|
452
|
+
var FQ_ID_LENGTH = SPACE_ID_LENGTH + OBJECT_ID_LENGTH + 1;
|
|
453
|
+
var parseId = (id) => {
|
|
454
|
+
if (!id) {
|
|
455
|
+
return {};
|
|
456
|
+
} else if (id.length === SPACE_ID_LENGTH) {
|
|
485
457
|
return {
|
|
486
|
-
|
|
487
|
-
type,
|
|
488
|
-
version
|
|
458
|
+
spaceId: id
|
|
489
459
|
};
|
|
490
|
-
}
|
|
491
|
-
asEchoDXN() {
|
|
492
|
-
if (this.kind !== _DXN.kind.ECHO) {
|
|
493
|
-
return void 0;
|
|
494
|
-
}
|
|
495
|
-
const [spaceId, echoId] = this.#parts;
|
|
460
|
+
} else if (id.length === OBJECT_ID_LENGTH) {
|
|
496
461
|
return {
|
|
497
|
-
|
|
498
|
-
// TODO(burdon): objectId.
|
|
499
|
-
echoId
|
|
462
|
+
objectId: id
|
|
500
463
|
};
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
if (this.kind !== _DXN.kind.QUEUE) {
|
|
504
|
-
return void 0;
|
|
505
|
-
}
|
|
506
|
-
const [subspaceTag, spaceId, queueId, objectId] = this.#parts;
|
|
507
|
-
if (typeof queueId !== "string") {
|
|
508
|
-
return void 0;
|
|
509
|
-
}
|
|
464
|
+
} else if (id.length === FQ_ID_LENGTH && id.indexOf(":") === SPACE_ID_LENGTH) {
|
|
465
|
+
const [spaceId, objectId] = id.split(":");
|
|
510
466
|
return {
|
|
511
|
-
subspaceTag,
|
|
512
467
|
spaceId,
|
|
513
|
-
queueId,
|
|
514
468
|
objectId
|
|
515
469
|
};
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
* Produces a new DXN with the given parts appended.
|
|
519
|
-
*/
|
|
520
|
-
extend(parts) {
|
|
521
|
-
return new _DXN(this.#kind, [
|
|
522
|
-
...this.#parts,
|
|
523
|
-
...parts
|
|
524
|
-
]);
|
|
470
|
+
} else {
|
|
471
|
+
return {};
|
|
525
472
|
}
|
|
526
473
|
};
|
|
527
474
|
|
|
528
|
-
// src/identity-did.ts
|
|
529
|
-
init_inject_globals();
|
|
530
|
-
var import_base32_decode2 = __toESM(require_base32_decode(), 1);
|
|
531
|
-
import { invariant as invariant3 } from "@dxos/invariant";
|
|
532
|
-
var IdentityDid = Object.freeze({
|
|
533
|
-
byteLength: 20,
|
|
534
|
-
encode: (value) => {
|
|
535
|
-
invariant3(value instanceof Uint8Array, "Invalid type");
|
|
536
|
-
invariant3(value.length === IdentityDid.byteLength, "Invalid length");
|
|
537
|
-
return DID_PREFIX + MULTIBASE_PREFIX2 + base32Encode(value, "RFC4648");
|
|
538
|
-
},
|
|
539
|
-
decode: (value) => {
|
|
540
|
-
invariant3(value.startsWith(DID_PREFIX + MULTIBASE_PREFIX2), "Invalid multibase32 encoding");
|
|
541
|
-
return new Uint8Array((0, import_base32_decode2.default)(value.slice(10), "RFC4648"));
|
|
542
|
-
},
|
|
543
|
-
isValid: (value) => {
|
|
544
|
-
return typeof value === "string" && value.startsWith(DID_PREFIX + MULTIBASE_PREFIX2) && value.length === ENCODED_LENGTH2;
|
|
545
|
-
},
|
|
546
|
-
random: () => {
|
|
547
|
-
return IdentityDid.encode(randomBytes(IdentityDid.byteLength));
|
|
548
|
-
}
|
|
549
|
-
});
|
|
550
|
-
var MULTIBASE_PREFIX2 = "B";
|
|
551
|
-
var DID_PREFIX = "did:halo:";
|
|
552
|
-
var ENCODED_LENGTH2 = 42;
|
|
553
|
-
|
|
554
475
|
// src/public-key.ts
|
|
555
476
|
init_inject_globals();
|
|
556
|
-
var
|
|
557
|
-
import { devtoolsFormatter
|
|
558
|
-
import { invariant as
|
|
477
|
+
var import_base32_decode2 = __toESM(require_base32_decode(), 1);
|
|
478
|
+
import { devtoolsFormatter, equalsSymbol, inspectCustom, truncateKey } from "@dxos/debug";
|
|
479
|
+
import { assertArgument, invariant as invariant2 } from "@dxos/invariant";
|
|
559
480
|
var PUBLIC_KEY_LENGTH = 32;
|
|
560
481
|
var SECRET_KEY_LENGTH = 64;
|
|
561
482
|
var isLikeArrayBuffer = (value) => typeof value === "object" && value !== null && Object.getPrototypeOf(value).constructor.name === "ArrayBuffer";
|
|
@@ -568,7 +489,7 @@ var PublicKey = class _PublicKey {
|
|
|
568
489
|
* @returns PublicKey
|
|
569
490
|
*/
|
|
570
491
|
static from(source) {
|
|
571
|
-
|
|
492
|
+
invariant2(source);
|
|
572
493
|
if (source instanceof _PublicKey) {
|
|
573
494
|
return source;
|
|
574
495
|
} else if (source instanceof Buffer2) {
|
|
@@ -652,7 +573,7 @@ var PublicKey = class _PublicKey {
|
|
|
652
573
|
* @deprecated All keys should be represented as instances of PublicKey.
|
|
653
574
|
*/
|
|
654
575
|
static bufferize(str) {
|
|
655
|
-
|
|
576
|
+
assertArgument(typeof str === "string", "str", "Invalid type");
|
|
656
577
|
const buffer = Buffer2.from(str, "hex");
|
|
657
578
|
return buffer;
|
|
658
579
|
}
|
|
@@ -667,7 +588,7 @@ var PublicKey = class _PublicKey {
|
|
|
667
588
|
} else if (key instanceof Uint8Array) {
|
|
668
589
|
key = Buffer2.from(key.buffer, key.byteOffset, key.byteLength);
|
|
669
590
|
}
|
|
670
|
-
|
|
591
|
+
invariant2(key instanceof Buffer2, "Invalid type");
|
|
671
592
|
return key.toString("hex");
|
|
672
593
|
}
|
|
673
594
|
/**
|
|
@@ -678,8 +599,8 @@ var PublicKey = class _PublicKey {
|
|
|
678
599
|
return key.toHex();
|
|
679
600
|
}
|
|
680
601
|
static fromMultibase32(encoded) {
|
|
681
|
-
|
|
682
|
-
return new _PublicKey(new Uint8Array((0,
|
|
602
|
+
invariant2(encoded.startsWith("B"), "Invalid multibase32 encoding");
|
|
603
|
+
return new _PublicKey(new Uint8Array((0, import_base32_decode2.default)(encoded.slice(1), "RFC4648")));
|
|
683
604
|
}
|
|
684
605
|
constructor(_value) {
|
|
685
606
|
this._value = _value;
|
|
@@ -720,7 +641,7 @@ var PublicKey = class _PublicKey {
|
|
|
720
641
|
/**
|
|
721
642
|
* Used by Node.js to get textual representation of this object when it's printed with a `console.log` statement.
|
|
722
643
|
*/
|
|
723
|
-
[
|
|
644
|
+
[inspectCustom](depth, options, inspectFn) {
|
|
724
645
|
if (!options.colors || typeof process.stdout.hasColors !== "function" || !process.stdout.hasColors()) {
|
|
725
646
|
return `<PublicKey ${this.truncate()}>`;
|
|
726
647
|
}
|
|
@@ -745,7 +666,7 @@ var PublicKey = class _PublicKey {
|
|
|
745
666
|
const color = colors[this.getInsecureHash(colors.length)];
|
|
746
667
|
return `PublicKey(${printControlCode(inspectFn.colors[color][0])}${this.truncate()}${printControlCode(inspectFn.colors.reset[0])})`;
|
|
747
668
|
}
|
|
748
|
-
get [
|
|
669
|
+
get [devtoolsFormatter]() {
|
|
749
670
|
return {
|
|
750
671
|
header: () => {
|
|
751
672
|
const colors = [
|
|
@@ -809,17 +730,47 @@ var PublicKey = class _PublicKey {
|
|
|
809
730
|
return this.equals(other);
|
|
810
731
|
}
|
|
811
732
|
};
|
|
733
|
+
|
|
734
|
+
// src/space-id.ts
|
|
735
|
+
init_inject_globals();
|
|
736
|
+
var import_base32_decode3 = __toESM(require_base32_decode(), 1);
|
|
737
|
+
import * as Schema6 from "effect/Schema";
|
|
738
|
+
import { invariant as invariant3 } from "@dxos/invariant";
|
|
739
|
+
var MULTIBASE_PREFIX2 = "B";
|
|
740
|
+
var ENCODED_LENGTH2 = 33;
|
|
741
|
+
var isValid2 = (value) => {
|
|
742
|
+
return typeof value === "string" && value.startsWith(MULTIBASE_PREFIX2) && value.length === ENCODED_LENGTH2;
|
|
743
|
+
};
|
|
744
|
+
var SpaceId = class extends Schema6.String.pipe(Schema6.filter(isValid2)) {
|
|
745
|
+
static byteLength = 20;
|
|
746
|
+
static encode = (value) => {
|
|
747
|
+
invariant3(value instanceof Uint8Array, "Invalid type");
|
|
748
|
+
invariant3(value.length === SpaceId.byteLength, "Invalid length");
|
|
749
|
+
return MULTIBASE_PREFIX2 + base32Encode(value, "RFC4648");
|
|
750
|
+
};
|
|
751
|
+
static decode = (value) => {
|
|
752
|
+
invariant3(value.startsWith(MULTIBASE_PREFIX2), "Invalid multibase32 encoding");
|
|
753
|
+
return new Uint8Array((0, import_base32_decode3.default)(value.slice(1), "RFC4648"));
|
|
754
|
+
};
|
|
755
|
+
static isValid = isValid2;
|
|
756
|
+
static random = () => {
|
|
757
|
+
return SpaceId.encode(randomBytes(SpaceId.byteLength));
|
|
758
|
+
};
|
|
759
|
+
};
|
|
812
760
|
export {
|
|
813
|
-
DXN,
|
|
814
|
-
|
|
761
|
+
DXN_exports as DXN,
|
|
762
|
+
EID_exports as EID,
|
|
763
|
+
EntityId,
|
|
764
|
+
FQ_ID_LENGTH,
|
|
815
765
|
IdentityDid,
|
|
816
|
-
|
|
817
|
-
ObjectId,
|
|
766
|
+
OBJECT_ID_LENGTH,
|
|
818
767
|
PUBLIC_KEY_LENGTH,
|
|
819
768
|
PublicKey,
|
|
820
|
-
QueueSubspaceTags,
|
|
821
769
|
SECRET_KEY_LENGTH,
|
|
770
|
+
SPACE_ID_LENGTH,
|
|
822
771
|
SimplePRNG,
|
|
823
|
-
SpaceId
|
|
772
|
+
SpaceId,
|
|
773
|
+
URI_exports as URI,
|
|
774
|
+
parseId
|
|
824
775
|
};
|
|
825
776
|
//# sourceMappingURL=index.mjs.map
|