@atproto/common-web 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/arrays.d.ts.map +1 -1
- package/dist/arrays.js.map +1 -1
- package/dist/async.d.ts +1 -1
- package/dist/async.d.ts.map +1 -1
- package/dist/check.d.ts +2 -2
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +5 -1
- package/dist/check.js.map +1 -1
- package/dist/did-doc.d.ts +5 -5
- package/dist/did-doc.d.ts.map +1 -1
- package/dist/did-doc.js +58 -43
- package/dist/did-doc.js.map +1 -1
- package/dist/util.d.ts +1 -0
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +7 -1
- package/dist/util.js.map +1 -1
- package/package.json +2 -2
- package/src/arrays.ts +7 -4
- package/src/check.ts +8 -2
- package/src/did-doc.ts +83 -39
- package/src/util.ts +15 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# @atproto/common-web
|
|
2
2
|
|
|
3
|
+
## 0.3.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#2770](https://github.com/bluesky-social/atproto/pull/2770) [`a07b21151`](https://github.com/bluesky-social/atproto/commit/a07b21151f1850340c4b7797ebb11521b1a6cdf3) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Add omit() utility
|
|
8
|
+
|
|
9
|
+
- [#2770](https://github.com/bluesky-social/atproto/pull/2770) [`a07b21151`](https://github.com/bluesky-social/atproto/commit/a07b21151f1850340c4b7797ebb11521b1a6cdf3) Thanks [@matthieusieben](https://github.com/matthieusieben)! - DID document parsing optimization
|
|
10
|
+
|
|
11
|
+
- [#2835](https://github.com/bluesky-social/atproto/pull/2835) [`eb20ff64a`](https://github.com/bluesky-social/atproto/commit/eb20ff64a2d8e3061c652e1e247bf9b0fe3c41a6) Thanks [@matthieusieben](https://github.com/matthieusieben)! - ponyfill URL.canParse
|
|
12
|
+
|
|
3
13
|
## 0.3.0
|
|
4
14
|
|
|
5
15
|
### Minor Changes
|
package/dist/arrays.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrays.d.ts","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"arrays.d.ts","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,WAAY,CAAC,EAAE,OAAO,MAAM,KAAG,OAAO,MAAM,EAAE,CAAC,CAQhE,CAAA;AAED,eAAO,MAAM,UAAU,cAChB,CAAC,EAAE,MACJ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,SAAS,KAC5B,CAAC,EASH,CAAA"}
|
package/dist/arrays.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":";;;AAAO,MAAM,KAAK,GAAG,CAAI,GAAQ,EAAE,GAAW,EAAqB,EAAE;IACnE,OAAO,GAAG,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":";;;AAAO,MAAM,KAAK,GAAG,CAAI,GAAQ,EAAE,GAAW,EAAqB,EAAE;IACnE,OAAO,GAAG,CAAC,MAAM,CACf,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACX,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;QACnB,OAAO,GAAG,CAAA;IACZ,CAAC,EACD,EAAuB,CACxB,CAAA;AACH,CAAC,CAAA;AARY,QAAA,KAAK,SAQjB;AAEM,MAAM,UAAU,GAAG,CACxB,GAAQ,EACR,EAA6B,EACxB,EAAE;IACP,MAAM,MAAM,GAAQ,EAAE,CAAA;IACtB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QACpB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAZY,QAAA,UAAU,cAYtB"}
|
package/dist/async.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const readFromGenerator: <T>(gen: AsyncGenerator<T
|
|
1
|
+
export declare const readFromGenerator: <T>(gen: AsyncGenerator<T>, isDone: (last?: T) => Promise<boolean> | boolean, waitFor?: Promise<unknown>, maxLength?: number) => Promise<T[]>;
|
|
2
2
|
export type Deferrable = {
|
|
3
3
|
resolve: () => void;
|
|
4
4
|
complete: Promise<void>;
|
package/dist/async.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB,WACvB,eAAe,CAAC,CAAC,UACd,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,QAAQ,OAAO,CAAC,GAAG,OAAO,YACvC,QAAQ,OAAO,CAAC,yBAExB,QAAQ,CAAC,EAAE,CAiCb,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAO,UAMnC,CAAA;AAED,eAAO,MAAM,iBAAiB,UAAW,MAAM,KAAG,UAAU,EAM3D,CAAA;AAED,eAAO,MAAM,WAAW,gBAAuB,UAAU,EAAE,KAAG,QAAQ,IAAI,CAEzE,CAAA;AAED,qBAAa,WAAW,CAAC,CAAC;IAOL,OAAO,CAAC;IAN3B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAAqB;gBAEjB,OAAO,CAAC,oBAAQ;IAOnC,IAAI,IAAI,IAAI,CAAC,EAAE,CAEd;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,YAAY;IAIZ,IAAI,CAAC,IAAI,EAAE,CAAC;IAKZ,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE;IAKZ,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC;IA0BlC,KAAK,CAAC,GAAG,EAAE,OAAO;IAMlB,KAAK;CAIN;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAG5B;AAED,eAAO,MAAM,sBAAsB,YACxB,qBAAqB,OAAO,CAAC,EAAE,SAazC,CAAA"}
|
package/dist/check.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ZodError } from 'zod';
|
|
2
1
|
export interface Checkable<T> {
|
|
3
2
|
parse: (obj: unknown) => T;
|
|
4
3
|
safeParse: (obj: unknown) => {
|
|
@@ -6,7 +5,7 @@ export interface Checkable<T> {
|
|
|
6
5
|
data: T;
|
|
7
6
|
} | {
|
|
8
7
|
success: false;
|
|
9
|
-
error:
|
|
8
|
+
error: Error;
|
|
10
9
|
};
|
|
11
10
|
}
|
|
12
11
|
export interface Def<T> {
|
|
@@ -14,6 +13,7 @@ export interface Def<T> {
|
|
|
14
13
|
schema: Checkable<T>;
|
|
15
14
|
}
|
|
16
15
|
export declare const is: <T>(obj: unknown, def: Checkable<T>) => obj is T;
|
|
16
|
+
export declare const create: <T>(def: Checkable<T>) => (v: unknown) => v is T;
|
|
17
17
|
export declare const assure: <T>(def: Checkable<T>, obj: unknown) => T;
|
|
18
18
|
export declare const isObject: (obj: unknown) => obj is Record<string, unknown>;
|
|
19
19
|
//# sourceMappingURL=check.d.ts.map
|
package/dist/check.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,CAAA;IAC1B,SAAS,EAAE,CACT,GAAG,EAAE,OAAO,KACT;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAA;CACnE;AAED,MAAM,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;CACrB;AAED,eAAO,MAAM,EAAE,WAAY,OAAO,OAAO,UAAU,CAAC,CAAC,aAEpD,CAAA;AAED,eAAO,MAAM,MAAM,WACR,UAAU,CAAC,CAAC,SACjB,OAAO,WACe,CAAA;AAE5B,eAAO,MAAM,MAAM,WAAY,UAAU,CAAC,CAAC,OAAO,OAAO,KAAG,CAE3D,CAAA;AAED,eAAO,MAAM,QAAQ,QAAS,OAAO,mCAEpC,CAAA"}
|
package/dist/check.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// Explicitly not using "zod" types here to avoid mismatching types due to
|
|
3
|
+
// version differences.
|
|
2
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isObject = exports.assure = exports.is = void 0;
|
|
5
|
+
exports.isObject = exports.assure = exports.create = exports.is = void 0;
|
|
4
6
|
const is = (obj, def) => {
|
|
5
7
|
return def.safeParse(obj).success;
|
|
6
8
|
};
|
|
7
9
|
exports.is = is;
|
|
10
|
+
const create = (def) => (v) => def.safeParse(v).success;
|
|
11
|
+
exports.create = create;
|
|
8
12
|
const assure = (def, obj) => {
|
|
9
13
|
return def.parse(obj);
|
|
10
14
|
};
|
package/dist/check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":";AAAA,0EAA0E;AAC1E,uBAAuB;;;AAchB,MAAM,EAAE,GAAG,CAAI,GAAY,EAAE,GAAiB,EAAY,EAAE;IACjE,OAAO,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAA;AACnC,CAAC,CAAA;AAFY,QAAA,EAAE,MAEd;AAEM,MAAM,MAAM,GACjB,CAAI,GAAiB,EAAE,EAAE,CACzB,CAAC,CAAU,EAAU,EAAE,CACrB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;AAHf,QAAA,MAAM,UAGS;AAErB,MAAM,MAAM,GAAG,CAAI,GAAiB,EAAE,GAAY,EAAK,EAAE;IAC9D,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACvB,CAAC,CAAA;AAFY,QAAA,MAAM,UAElB;AAEM,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAkC,EAAE;IACvE,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAA;AAChD,CAAC,CAAA;AAFY,QAAA,QAAQ,YAEpB"}
|
package/dist/did-doc.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export declare const isValidDidDoc: (doc: unknown) => doc is {
|
|
|
11
11
|
service?: {
|
|
12
12
|
id: string;
|
|
13
13
|
type: string;
|
|
14
|
-
serviceEndpoint:
|
|
14
|
+
serviceEndpoint: string | Record<string, unknown>;
|
|
15
15
|
}[] | undefined;
|
|
16
16
|
};
|
|
17
17
|
export declare const getDid: (doc: DidDocument) => string;
|
|
@@ -58,11 +58,11 @@ export declare const didDocument: z.ZodObject<{
|
|
|
58
58
|
}, "strip", z.ZodTypeAny, {
|
|
59
59
|
id: string;
|
|
60
60
|
type: string;
|
|
61
|
-
serviceEndpoint:
|
|
61
|
+
serviceEndpoint: string | Record<string, unknown>;
|
|
62
62
|
}, {
|
|
63
63
|
id: string;
|
|
64
64
|
type: string;
|
|
65
|
-
serviceEndpoint:
|
|
65
|
+
serviceEndpoint: string | Record<string, unknown>;
|
|
66
66
|
}>, "many">>;
|
|
67
67
|
}, "strip", z.ZodTypeAny, {
|
|
68
68
|
id: string;
|
|
@@ -76,7 +76,7 @@ export declare const didDocument: z.ZodObject<{
|
|
|
76
76
|
service?: {
|
|
77
77
|
id: string;
|
|
78
78
|
type: string;
|
|
79
|
-
serviceEndpoint:
|
|
79
|
+
serviceEndpoint: string | Record<string, unknown>;
|
|
80
80
|
}[] | undefined;
|
|
81
81
|
}, {
|
|
82
82
|
id: string;
|
|
@@ -90,7 +90,7 @@ export declare const didDocument: z.ZodObject<{
|
|
|
90
90
|
service?: {
|
|
91
91
|
id: string;
|
|
92
92
|
type: string;
|
|
93
|
-
serviceEndpoint:
|
|
93
|
+
serviceEndpoint: string | Record<string, unknown>;
|
|
94
94
|
}[] | undefined;
|
|
95
95
|
}>;
|
|
96
96
|
export type DidDocument = z.infer<typeof didDocument>;
|
package/dist/did-doc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did-doc.d.ts","sourceRoot":"","sources":["../src/did-doc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,aAAa,QAAS,OAAO;;;;;;;;;;;;;;CAEzC,CAAA;AAED,eAAO,MAAM,MAAM,QAAS,WAAW,KAAG,MAMzC,CAAA;AAED,eAAO,MAAM,SAAS,QAAS,WAAW,KAAG,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"did-doc.d.ts","sourceRoot":"","sources":["../src/did-doc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,aAAa,QAAS,OAAO;;;;;;;;;;;;;;CAEzC,CAAA;AAED,eAAO,MAAM,MAAM,QAAS,WAAW,KAAG,MAMzC,CAAA;AAED,eAAO,MAAM,SAAS,QAAS,WAAW,KAAG,MAAM,GAAG,SAYrD,CAAA;AAGD,eAAO,MAAM,aAAa,QACnB,WAAW,KACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,GAAG,SAEjD,CAAA;AAED,eAAO,MAAM,uBAAuB,QAC7B,WAAW,SACT,MAAM,KACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,GAAG,SAgBjD,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAS,WAAW,KAAG,MAAM,GAAG,SAI5D,CAAA;AAED,eAAO,MAAM,cAAc,QAAS,WAAW,KAAG,MAAM,GAAG,SAK1D,CAAA;AAED,eAAO,MAAM,kBAAkB,QAAS,WAAW,KAAG,MAAM,GAAG,SAK9D,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAS,WAAW,KAAG,MAAM,GAAG,SAK5D,CAAA;AAED,eAAO,MAAM,kBAAkB,QACxB,WAAW,QACV;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,uBAkBpC,CAAA;AA4ED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKtB,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA"}
|
package/dist/did-doc.js
CHANGED
|
@@ -18,13 +18,16 @@ const getDid = (doc) => {
|
|
|
18
18
|
exports.getDid = getDid;
|
|
19
19
|
const getHandle = (doc) => {
|
|
20
20
|
const aka = doc.alsoKnownAs;
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
if (aka) {
|
|
22
|
+
for (let i = 0; i < aka.length; i++) {
|
|
23
|
+
const alias = aka[i];
|
|
24
|
+
if (alias.startsWith('at://')) {
|
|
25
|
+
// strip off "at://" prefix
|
|
26
|
+
return alias.slice(5);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
28
31
|
};
|
|
29
32
|
exports.getHandle = getHandle;
|
|
30
33
|
// @NOTE we parse to type/publicKeyMultibase to avoid the dependency on @atproto/crypto
|
|
@@ -33,21 +36,17 @@ const getSigningKey = (doc) => {
|
|
|
33
36
|
};
|
|
34
37
|
exports.getSigningKey = getSigningKey;
|
|
35
38
|
const getVerificationMaterial = (doc, keyId) => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (!
|
|
39
|
-
return undefined;
|
|
40
|
-
if (typeof keys !== 'object')
|
|
39
|
+
// /!\ Hot path
|
|
40
|
+
const key = findItemById(doc, 'verificationMethod', `#${keyId}`);
|
|
41
|
+
if (!key) {
|
|
41
42
|
return undefined;
|
|
42
|
-
if (!Array.isArray(keys)) {
|
|
43
|
-
keys = [keys];
|
|
44
43
|
}
|
|
45
|
-
|
|
46
|
-
if (!found?.publicKeyMultibase)
|
|
44
|
+
if (!key.publicKeyMultibase) {
|
|
47
45
|
return undefined;
|
|
46
|
+
}
|
|
48
47
|
return {
|
|
49
|
-
type:
|
|
50
|
-
publicKeyMultibase:
|
|
48
|
+
type: key.type,
|
|
49
|
+
publicKeyMultibase: key.publicKeyMultibase,
|
|
51
50
|
};
|
|
52
51
|
};
|
|
53
52
|
exports.getVerificationMaterial = getVerificationMaterial;
|
|
@@ -80,46 +79,62 @@ const getNotifEndpoint = (doc) => {
|
|
|
80
79
|
};
|
|
81
80
|
exports.getNotifEndpoint = getNotifEndpoint;
|
|
82
81
|
const getServiceEndpoint = (doc, opts) => {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if (!
|
|
86
|
-
return undefined;
|
|
87
|
-
if (typeof services !== 'object')
|
|
82
|
+
// /!\ Hot path
|
|
83
|
+
const service = findItemById(doc, 'service', opts.id);
|
|
84
|
+
if (!service) {
|
|
88
85
|
return undefined;
|
|
89
|
-
if (!Array.isArray(services)) {
|
|
90
|
-
services = [services];
|
|
91
86
|
}
|
|
92
|
-
|
|
93
|
-
if (!found)
|
|
94
|
-
return undefined;
|
|
95
|
-
if (opts.type && found.type !== opts.type) {
|
|
87
|
+
if (opts.type && service.type !== opts.type) {
|
|
96
88
|
return undefined;
|
|
97
89
|
}
|
|
98
|
-
if (typeof
|
|
90
|
+
if (typeof service.serviceEndpoint !== 'string') {
|
|
99
91
|
return undefined;
|
|
100
92
|
}
|
|
101
|
-
return validateUrl(
|
|
93
|
+
return validateUrl(service.serviceEndpoint);
|
|
102
94
|
};
|
|
103
95
|
exports.getServiceEndpoint = getServiceEndpoint;
|
|
96
|
+
function findItemById(doc, type, id) {
|
|
97
|
+
// /!\ Hot path
|
|
98
|
+
const items = doc[type];
|
|
99
|
+
if (items) {
|
|
100
|
+
for (let i = 0; i < items.length; i++) {
|
|
101
|
+
const item = items[i];
|
|
102
|
+
const itemId = item.id;
|
|
103
|
+
if (itemId[0] === '#'
|
|
104
|
+
? itemId === id
|
|
105
|
+
: // Optimized version of: itemId === `${doc.id}${id}`
|
|
106
|
+
itemId.length === doc.id.length + id.length &&
|
|
107
|
+
itemId[doc.id.length] === '#' &&
|
|
108
|
+
itemId.endsWith(id) &&
|
|
109
|
+
itemId.startsWith(doc.id) // <== We could probably skip this check
|
|
110
|
+
) {
|
|
111
|
+
return item;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
104
117
|
// Check protocol and hostname to prevent potential SSRF
|
|
105
118
|
const validateUrl = (urlStr) => {
|
|
106
|
-
|
|
107
|
-
try {
|
|
108
|
-
url = new URL(urlStr);
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
return undefined;
|
|
112
|
-
}
|
|
113
|
-
if (!['http:', 'https:'].includes(url.protocol)) {
|
|
119
|
+
if (!urlStr.startsWith('http://') && !urlStr.startsWith('https://')) {
|
|
114
120
|
return undefined;
|
|
115
121
|
}
|
|
116
|
-
|
|
122
|
+
if (!canParseUrl(urlStr)) {
|
|
117
123
|
return undefined;
|
|
118
124
|
}
|
|
119
|
-
|
|
120
|
-
return urlStr;
|
|
121
|
-
}
|
|
125
|
+
return urlStr;
|
|
122
126
|
};
|
|
127
|
+
const canParseUrl = URL.canParse ??
|
|
128
|
+
// URL.canParse is not available in Node.js < 18.17.0
|
|
129
|
+
((urlStr) => {
|
|
130
|
+
try {
|
|
131
|
+
new URL(urlStr);
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
123
138
|
// Types
|
|
124
139
|
// --------
|
|
125
140
|
const verificationMethod = zod_1.z.object({
|
package/dist/did-doc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did-doc.js","sourceRoot":"","sources":["../src/did-doc.ts"],"names":[],"mappings":";;;AAAA,6BAAuB;AAEvB,uBAAuB;AACvB,WAAW;AAEJ,MAAM,aAAa,GAAG,CAAC,GAAY,EAAsB,EAAE;IAChE,OAAO,mBAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAA;AAC3C,CAAC,CAAA;AAFY,QAAA,aAAa,iBAEzB;AAEM,MAAM,MAAM,GAAG,CAAC,GAAgB,EAAU,EAAE;IACjD,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAA;IACjB,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AANY,QAAA,MAAM,UAMlB;AAEM,MAAM,SAAS,GAAG,CAAC,GAAgB,EAAsB,EAAE;IAChE,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAA;IAC3B,IAAI,
|
|
1
|
+
{"version":3,"file":"did-doc.js","sourceRoot":"","sources":["../src/did-doc.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
export declare const noUndefinedVals: <T>(obj: Record<string, T | undefined>) => Record<string, T>;
|
|
3
|
+
export declare function omit<T extends undefined | Record<string, unknown>, K extends keyof NonNullable<T>>(obj: T, keys: readonly K[]): T extends undefined ? undefined : Omit<T, K>;
|
|
3
4
|
export declare const jitter: (maxMs: number) => number;
|
|
4
5
|
export declare const wait: (ms: number) => Promise<unknown>;
|
|
5
6
|
export type BailableWait = {
|
package/dist/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";AAAA,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";AAAA,eAAO,MAAM,eAAe,WACrB,OAAO,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,KACjC,OAAO,MAAM,EAAE,CAAC,CAOlB,CAAA;AAED,wBAAgB,IAAI,CAClB,CAAC,SAAS,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,CAAC,SAAS,MAAM,WAAW,CAAC,CAAC,CAAC,EAC9B,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,SAAS,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAY3E,eAAO,MAAM,MAAM,UAAW,MAAM,WAEnC,CAAA;AAED,eAAO,MAAM,IAAI,OAAQ,MAAM,qBAE9B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,YAAY,OAAQ,MAAM,KAAG,YAUzC,CAAA;AAED,eAAO,MAAM,kBAAkB,SAAU,UAAU,EAAE,KAAG,UAWvD,CAAA;AAED,eAAO,MAAM,cAAc,WACjB,cAAc,UAAU,CAAC,KAChC,QAAQ,UAAU,CAMpB,CAAA;AAID,eAAO,MAAM,SAAS,MAAO,MAAM,KAAG,MAQrC,CAAA;AAED,eAAO,MAAM,SAAS,MAAO,MAAM,KAAG,MAMrC,CAAA;AAED,eAAO,MAAM,WAAW,WACjB,CAAC,EAAE,MACJ,CAAC,CAAC,EAAE,CAAC,KAAK,QAAQ,OAAO,CAAC,iBAI/B,CAAA;AAED,eAAO,MAAM,gBAAgB,QACtB,OAAO,iCAGb,CAAA;AAED,eAAO,MAAM,SAAS,QAAS,OAAO,OAAO,MAAM,KAAG,OAErD,CAAA;AAED,eAAO,MAAM,UAAU,WAAY,CAAC,EAAE,aAAa,MAAM,KAAG,CAAC,EAAE,EAS9D,CAAA;AAED,eAAO,MAAM,KAAK,QAAS,MAAM,KAAG,MAAM,EAMzC,CAAA;AAED,eAAO,MAAM,UAAU,SAAU,MAAM,EAAE,KAAG,MAAM,EAEjD,CAAA;AAED,eAAO,MAAM,oBAAoB,aACxB,MAAM,GAAG,SAAS,YACf,CAAC,KACV,MAAM,GAAG,CAGX,CAAA"}
|
package/dist/util.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseIntWithFallback = exports.dedupeStrs = exports.range = exports.chunkArray = exports.errHasMsg = exports.isErrnoException = exports.asyncFilter = exports.s32decode = exports.s32encode = exports.streamToBuffer = exports.flattenUint8Arrays = exports.bailableWait = exports.wait = exports.jitter = exports.noUndefinedVals = void 0;
|
|
3
|
+
exports.parseIntWithFallback = exports.dedupeStrs = exports.range = exports.chunkArray = exports.errHasMsg = exports.isErrnoException = exports.asyncFilter = exports.s32decode = exports.s32encode = exports.streamToBuffer = exports.flattenUint8Arrays = exports.bailableWait = exports.wait = exports.jitter = exports.omit = exports.noUndefinedVals = void 0;
|
|
4
4
|
const noUndefinedVals = (obj) => {
|
|
5
5
|
Object.keys(obj).forEach((k) => {
|
|
6
6
|
if (obj[k] === undefined) {
|
|
@@ -10,6 +10,12 @@ const noUndefinedVals = (obj) => {
|
|
|
10
10
|
return obj;
|
|
11
11
|
};
|
|
12
12
|
exports.noUndefinedVals = noUndefinedVals;
|
|
13
|
+
function omit(obj, keys) {
|
|
14
|
+
if (!obj)
|
|
15
|
+
return obj;
|
|
16
|
+
return Object.fromEntries(Object.entries(obj).filter((entry) => !keys.includes(entry[0])));
|
|
17
|
+
}
|
|
18
|
+
exports.omit = omit;
|
|
13
19
|
const jitter = (maxMs) => {
|
|
14
20
|
return Math.round((Math.random() - 0.5) * maxMs * 2);
|
|
15
21
|
};
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/common-web",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Shared web-platform-friendly code for atproto libraries",
|
|
6
6
|
"keywords": [
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"graphemer": "^1.4.0",
|
|
19
19
|
"multiformats": "^9.9.0",
|
|
20
20
|
"uint8arrays": "3.0.0",
|
|
21
|
-
"zod": "^3.
|
|
21
|
+
"zod": "^3.23.8"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"jest": "^28.1.2"
|
package/src/arrays.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
export const keyBy = <T>(arr: T[], key: string): Record<string, T> => {
|
|
2
|
-
return arr.reduce(
|
|
3
|
-
acc
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
return arr.reduce(
|
|
3
|
+
(acc, cur) => {
|
|
4
|
+
acc[cur[key]] = cur
|
|
5
|
+
return acc
|
|
6
|
+
},
|
|
7
|
+
{} as Record<string, T>,
|
|
8
|
+
)
|
|
6
9
|
}
|
|
7
10
|
|
|
8
11
|
export const mapDefined = <T, S>(
|
package/src/check.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
// Explicitly not using "zod" types here to avoid mismatching types due to
|
|
2
|
+
// version differences.
|
|
2
3
|
|
|
3
4
|
export interface Checkable<T> {
|
|
4
5
|
parse: (obj: unknown) => T
|
|
5
6
|
safeParse: (
|
|
6
7
|
obj: unknown,
|
|
7
|
-
) => { success: true; data: T } | { success: false; error:
|
|
8
|
+
) => { success: true; data: T } | { success: false; error: Error }
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
export interface Def<T> {
|
|
@@ -16,6 +17,11 @@ export const is = <T>(obj: unknown, def: Checkable<T>): obj is T => {
|
|
|
16
17
|
return def.safeParse(obj).success
|
|
17
18
|
}
|
|
18
19
|
|
|
20
|
+
export const create =
|
|
21
|
+
<T>(def: Checkable<T>) =>
|
|
22
|
+
(v: unknown): v is T =>
|
|
23
|
+
def.safeParse(v).success
|
|
24
|
+
|
|
19
25
|
export const assure = <T>(def: Checkable<T>, obj: unknown): T => {
|
|
20
26
|
return def.parse(obj)
|
|
21
27
|
}
|
package/src/did-doc.ts
CHANGED
|
@@ -17,11 +17,16 @@ export const getDid = (doc: DidDocument): string => {
|
|
|
17
17
|
|
|
18
18
|
export const getHandle = (doc: DidDocument): string | undefined => {
|
|
19
19
|
const aka = doc.alsoKnownAs
|
|
20
|
-
if (
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
if (aka) {
|
|
21
|
+
for (let i = 0; i < aka.length; i++) {
|
|
22
|
+
const alias = aka[i]
|
|
23
|
+
if (alias.startsWith('at://')) {
|
|
24
|
+
// strip off "at://" prefix
|
|
25
|
+
return alias.slice(5)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return undefined
|
|
25
30
|
}
|
|
26
31
|
|
|
27
32
|
// @NOTE we parse to type/publicKeyMultibase to avoid the dependency on @atproto/crypto
|
|
@@ -35,20 +40,20 @@ export const getVerificationMaterial = (
|
|
|
35
40
|
doc: DidDocument,
|
|
36
41
|
keyId: string,
|
|
37
42
|
): { type: string; publicKeyMultibase: string } | undefined => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
// /!\ Hot path
|
|
44
|
+
|
|
45
|
+
const key = findItemById(doc, 'verificationMethod', `#${keyId}`)
|
|
46
|
+
if (!key) {
|
|
47
|
+
return undefined
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (!key.publicKeyMultibase) {
|
|
51
|
+
return undefined
|
|
44
52
|
}
|
|
45
|
-
|
|
46
|
-
(key) => key.id === `#${keyId}` || key.id === `${did}#${keyId}`,
|
|
47
|
-
)
|
|
48
|
-
if (!found?.publicKeyMultibase) return undefined
|
|
53
|
+
|
|
49
54
|
return {
|
|
50
|
-
type:
|
|
51
|
-
publicKeyMultibase:
|
|
55
|
+
type: key.type,
|
|
56
|
+
publicKeyMultibase: key.publicKeyMultibase,
|
|
52
57
|
}
|
|
53
58
|
}
|
|
54
59
|
|
|
@@ -83,43 +88,82 @@ export const getServiceEndpoint = (
|
|
|
83
88
|
doc: DidDocument,
|
|
84
89
|
opts: { id: string; type?: string },
|
|
85
90
|
) => {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
services = [services]
|
|
91
|
+
// /!\ Hot path
|
|
92
|
+
|
|
93
|
+
const service = findItemById(doc, 'service', opts.id)
|
|
94
|
+
if (!service) {
|
|
95
|
+
return undefined
|
|
92
96
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
)
|
|
96
|
-
if (!found) return undefined
|
|
97
|
-
if (opts.type && found.type !== opts.type) {
|
|
97
|
+
|
|
98
|
+
if (opts.type && service.type !== opts.type) {
|
|
98
99
|
return undefined
|
|
99
100
|
}
|
|
100
|
-
|
|
101
|
+
|
|
102
|
+
if (typeof service.serviceEndpoint !== 'string') {
|
|
101
103
|
return undefined
|
|
102
104
|
}
|
|
103
|
-
|
|
105
|
+
|
|
106
|
+
return validateUrl(service.serviceEndpoint)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function findItemById<
|
|
110
|
+
D extends DidDocument,
|
|
111
|
+
T extends 'verificationMethod' | 'service',
|
|
112
|
+
>(doc: D, type: T, id: string): NonNullable<D[T]>[number] | undefined
|
|
113
|
+
function findItemById(
|
|
114
|
+
doc: DidDocument,
|
|
115
|
+
type: 'verificationMethod' | 'service',
|
|
116
|
+
id: string,
|
|
117
|
+
) {
|
|
118
|
+
// /!\ Hot path
|
|
119
|
+
|
|
120
|
+
const items = doc[type]
|
|
121
|
+
if (items) {
|
|
122
|
+
for (let i = 0; i < items.length; i++) {
|
|
123
|
+
const item = items[i]
|
|
124
|
+
const itemId = item.id
|
|
125
|
+
|
|
126
|
+
if (
|
|
127
|
+
itemId[0] === '#'
|
|
128
|
+
? itemId === id
|
|
129
|
+
: // Optimized version of: itemId === `${doc.id}${id}`
|
|
130
|
+
itemId.length === doc.id.length + id.length &&
|
|
131
|
+
itemId[doc.id.length] === '#' &&
|
|
132
|
+
itemId.endsWith(id) &&
|
|
133
|
+
itemId.startsWith(doc.id) // <== We could probably skip this check
|
|
134
|
+
) {
|
|
135
|
+
return item
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return undefined
|
|
104
140
|
}
|
|
105
141
|
|
|
106
142
|
// Check protocol and hostname to prevent potential SSRF
|
|
107
143
|
const validateUrl = (urlStr: string): string | undefined => {
|
|
108
|
-
|
|
109
|
-
try {
|
|
110
|
-
url = new URL(urlStr)
|
|
111
|
-
} catch {
|
|
144
|
+
if (!urlStr.startsWith('http://') && !urlStr.startsWith('https://')) {
|
|
112
145
|
return undefined
|
|
113
146
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
} else if (!url.hostname) {
|
|
147
|
+
|
|
148
|
+
if (!canParseUrl(urlStr)) {
|
|
117
149
|
return undefined
|
|
118
|
-
} else {
|
|
119
|
-
return urlStr
|
|
120
150
|
}
|
|
151
|
+
|
|
152
|
+
return urlStr
|
|
121
153
|
}
|
|
122
154
|
|
|
155
|
+
const canParseUrl =
|
|
156
|
+
URL.canParse ??
|
|
157
|
+
// URL.canParse is not available in Node.js < 18.17.0
|
|
158
|
+
((urlStr: string): boolean => {
|
|
159
|
+
try {
|
|
160
|
+
new URL(urlStr)
|
|
161
|
+
return true
|
|
162
|
+
} catch {
|
|
163
|
+
return false
|
|
164
|
+
}
|
|
165
|
+
})
|
|
166
|
+
|
|
123
167
|
// Types
|
|
124
168
|
// --------
|
|
125
169
|
|
package/src/util.ts
CHANGED
|
@@ -9,6 +9,21 @@ export const noUndefinedVals = <T>(
|
|
|
9
9
|
return obj as Record<string, T>
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
+
export function omit<
|
|
13
|
+
T extends undefined | Record<string, unknown>,
|
|
14
|
+
K extends keyof NonNullable<T>,
|
|
15
|
+
>(obj: T, keys: readonly K[]): T extends undefined ? undefined : Omit<T, K>
|
|
16
|
+
export function omit(
|
|
17
|
+
obj: Record<string, unknown>,
|
|
18
|
+
keys: readonly string[],
|
|
19
|
+
): undefined | Record<string, unknown> {
|
|
20
|
+
if (!obj) return obj
|
|
21
|
+
|
|
22
|
+
return Object.fromEntries(
|
|
23
|
+
Object.entries(obj).filter((entry) => !keys.includes(entry[0])),
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
|
|
12
27
|
export const jitter = (maxMs: number) => {
|
|
13
28
|
return Math.round((Math.random() - 0.5) * maxMs * 2)
|
|
14
29
|
}
|