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