@atproto/did 0.1.5 → 0.2.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 +20 -0
- package/LICENSE.txt +1 -1
- package/dist/atproto.d.ts +3 -1
- package/dist/atproto.d.ts.map +1 -1
- package/dist/atproto.js +44 -22
- package/dist/atproto.js.map +1 -1
- package/dist/did-document.d.ts +16 -16
- package/dist/did-document.d.ts.map +1 -1
- package/dist/did-document.js +19 -12
- package/dist/did-document.js.map +1 -1
- package/dist/did-error.js.map +1 -1
- package/dist/did.d.ts +1 -1
- package/dist/did.d.ts.map +1 -1
- package/dist/did.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/uri.d.ts +7 -0
- package/dist/lib/uri.d.ts.map +1 -0
- package/dist/lib/uri.js +68 -0
- package/dist/lib/uri.js.map +1 -0
- package/dist/methods/plc.d.ts +1 -1
- package/dist/methods/plc.d.ts.map +1 -1
- package/dist/methods/plc.js.map +1 -1
- package/dist/methods/web.d.ts +2 -1
- package/dist/methods/web.d.ts.map +1 -1
- package/dist/methods/web.js +31 -14
- package/dist/methods/web.js.map +1 -1
- package/dist/methods.js.map +1 -1
- package/package.json +1 -1
- package/src/atproto.ts +57 -22
- package/src/did-document.ts +21 -11
- package/src/did.ts +1 -1
- package/src/lib/uri.ts +67 -0
- package/src/methods/plc.ts +1 -1
- package/src/methods/web.ts +40 -19
- package/tsconfig.build.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @atproto/did
|
|
2
2
|
|
|
3
|
+
## 0.2.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#4216](https://github.com/bluesky-social/atproto/pull/4216) [`09439d7d6`](https://github.com/bluesky-social/atproto/commit/09439d7d688294ad1a0c78a74b901ba2f7c5f4c3) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Minor typing improvements
|
|
8
|
+
|
|
9
|
+
## 0.2.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#4108](https://github.com/bluesky-social/atproto/pull/4108) [`f9dc9aa4c`](https://github.com/bluesky-social/atproto/commit/f9dc9aa4c9eaf2f82d140fbf011a9015e7f1a00d) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Enforce proper formatting of relative uris fragments
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- [#4108](https://github.com/bluesky-social/atproto/pull/4108) [`f9dc9aa4c`](https://github.com/bluesky-social/atproto/commit/f9dc9aa4c9eaf2f82d140fbf011a9015e7f1a00d) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Export `AtprotoAudience` type and validation function
|
|
18
|
+
|
|
19
|
+
- [#4108](https://github.com/bluesky-social/atproto/pull/4108) [`f9dc9aa4c`](https://github.com/bluesky-social/atproto/commit/f9dc9aa4c9eaf2f82d140fbf011a9015e7f1a00d) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Small performance improvement
|
|
20
|
+
|
|
21
|
+
- [#4108](https://github.com/bluesky-social/atproto/pull/4108) [`f9dc9aa4c`](https://github.com/bluesky-social/atproto/commit/f9dc9aa4c9eaf2f82d140fbf011a9015e7f1a00d) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Small performance improvement
|
|
22
|
+
|
|
3
23
|
## 0.1.5
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/LICENSE.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Dual MIT/Apache-2.0 License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2022-
|
|
3
|
+
Copyright (c) 2022-2025 Bluesky Social PBC, and Contributors
|
|
4
4
|
|
|
5
5
|
Except as otherwise noted in individual files, this software is licensed under the MIT license (<http://opensource.org/licenses/MIT>), or the Apache License, Version 2.0 (<http://www.apache.org/licenses/LICENSE-2.0>).
|
|
6
6
|
|
package/dist/atproto.d.ts
CHANGED
|
@@ -4,11 +4,13 @@ export type AtprotoIdentityDidMethods = 'plc' | 'web';
|
|
|
4
4
|
export type AtprotoDid = Did<AtprotoIdentityDidMethods>;
|
|
5
5
|
export declare const atprotoDidSchema: z.ZodEffects<z.ZodString, `did:plc:${string}` | `did:web:${string}`, string>;
|
|
6
6
|
export declare function isAtprotoDid(input: unknown): input is AtprotoDid;
|
|
7
|
-
export declare function asAtprotoDid(input:
|
|
7
|
+
export declare function asAtprotoDid<T>(input: T): (T & `did:plc:${string}`) | (T & `did:web:${string}`);
|
|
8
8
|
export declare function assertAtprotoDid(input: unknown): asserts input is AtprotoDid;
|
|
9
9
|
export declare function assertAtprotoDidWeb(input: unknown): asserts input is Did<'web'>;
|
|
10
10
|
/**
|
|
11
11
|
* @see {@link https://atproto.com/specs/did#blessed-did-methods}
|
|
12
12
|
*/
|
|
13
13
|
export declare function isAtprotoDidWeb(input: unknown): input is Did<'web'>;
|
|
14
|
+
export type AtprotoAudience = `${AtprotoDid}#${string}`;
|
|
15
|
+
export declare const isAtprotoAudience: (value: unknown) => value is AtprotoAudience;
|
|
14
16
|
//# sourceMappingURL=atproto.d.ts.map
|
package/dist/atproto.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atproto.d.ts","sourceRoot":"","sources":["../src/atproto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"atproto.d.ts","sourceRoot":"","sources":["../src/atproto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAa9B,MAAM,MAAM,yBAAyB,GAAG,KAAK,GAAG,KAAK,CAAA;AACrD,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,yBAAyB,CAAC,CAAA;AAEvD,eAAO,MAAM,gBAAgB,8EAE6C,CAAA;AAE1E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,yDAGvC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAa5E;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAgB7B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAcnE;AA+BD,MAAM,MAAM,eAAe,GAAG,GAAG,UAAU,IAAI,MAAM,EAAE,CAAA;AACvD,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,eAQ3D,CAAA"}
|
package/dist/atproto.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.atprotoDidSchema = void 0;
|
|
3
|
+
exports.isAtprotoAudience = exports.atprotoDidSchema = void 0;
|
|
4
4
|
exports.isAtprotoDid = isAtprotoDid;
|
|
5
5
|
exports.asAtprotoDid = asAtprotoDid;
|
|
6
6
|
exports.assertAtprotoDid = assertAtprotoDid;
|
|
@@ -8,25 +8,13 @@ exports.assertAtprotoDidWeb = assertAtprotoDidWeb;
|
|
|
8
8
|
exports.isAtprotoDidWeb = isAtprotoDidWeb;
|
|
9
9
|
const zod_1 = require("zod");
|
|
10
10
|
const did_error_js_1 = require("./did-error.js");
|
|
11
|
+
const uri_js_1 = require("./lib/uri.js");
|
|
11
12
|
const methods_js_1 = require("./methods.js");
|
|
12
13
|
exports.atprotoDidSchema = zod_1.z
|
|
13
14
|
.string()
|
|
14
15
|
.refine(isAtprotoDid, `Atproto only allows "plc" and "web" DID methods`);
|
|
15
16
|
function isAtprotoDid(input) {
|
|
16
|
-
|
|
17
|
-
// return isDidPlc(input) || isAtprotoDidWeb(input)
|
|
18
|
-
if (typeof input !== 'string') {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
else if (input.startsWith(methods_js_1.DID_PLC_PREFIX)) {
|
|
22
|
-
return (0, methods_js_1.isDidPlc)(input);
|
|
23
|
-
}
|
|
24
|
-
else if (input.startsWith(methods_js_1.DID_WEB_PREFIX)) {
|
|
25
|
-
return isAtprotoDidWeb(input);
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
17
|
+
return (0, methods_js_1.isDidPlc)(input) || isAtprotoDidWeb(input);
|
|
30
18
|
}
|
|
31
19
|
function asAtprotoDid(input) {
|
|
32
20
|
assertAtprotoDid(input);
|
|
@@ -48,11 +36,10 @@ function assertAtprotoDid(input) {
|
|
|
48
36
|
}
|
|
49
37
|
function assertAtprotoDidWeb(input) {
|
|
50
38
|
(0, methods_js_1.assertDidWeb)(input);
|
|
51
|
-
if (input
|
|
39
|
+
if (isDidWebWithPath(input)) {
|
|
52
40
|
throw new did_error_js_1.InvalidDidError(input, `Atproto does not allow path components in Web DIDs`);
|
|
53
41
|
}
|
|
54
|
-
if (input
|
|
55
|
-
!input.startsWith('did:web:localhost%3A')) {
|
|
42
|
+
if (isDidWebWithHttpsPort(input)) {
|
|
56
43
|
throw new did_error_js_1.InvalidDidError(input, `Atproto does not allow port numbers in Web DIDs, except for localhost`);
|
|
57
44
|
}
|
|
58
45
|
}
|
|
@@ -60,12 +47,47 @@ function assertAtprotoDidWeb(input) {
|
|
|
60
47
|
* @see {@link https://atproto.com/specs/did#blessed-did-methods}
|
|
61
48
|
*/
|
|
62
49
|
function isAtprotoDidWeb(input) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
50
|
+
if (!(0, methods_js_1.isDidWeb)(input)) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
if (isDidWebWithPath(input)) {
|
|
54
|
+
return false;
|
|
66
55
|
}
|
|
67
|
-
|
|
56
|
+
if (isDidWebWithHttpsPort(input)) {
|
|
68
57
|
return false;
|
|
69
58
|
}
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
function isDidWebWithPath(did) {
|
|
62
|
+
return did.includes(':', methods_js_1.DID_WEB_PREFIX.length);
|
|
63
|
+
}
|
|
64
|
+
function isLocalhostDid(did) {
|
|
65
|
+
return (did === 'did:web:localhost' ||
|
|
66
|
+
did.startsWith('did:web:localhost:') ||
|
|
67
|
+
did.startsWith('did:web:localhost%3A'));
|
|
70
68
|
}
|
|
69
|
+
function isDidWebWithHttpsPort(did) {
|
|
70
|
+
if (isLocalhostDid(did))
|
|
71
|
+
return false;
|
|
72
|
+
const pathIdx = did.indexOf(':', methods_js_1.DID_WEB_PREFIX.length);
|
|
73
|
+
const hasPort = pathIdx === -1
|
|
74
|
+
? // No path component, check if there's a port separator anywhere after
|
|
75
|
+
// the "did:web:" prefix
|
|
76
|
+
did.includes('%3A', methods_js_1.DID_WEB_PREFIX.length)
|
|
77
|
+
: // There is a path component; if there is an encoded colon *before* it,
|
|
78
|
+
// then there is a port number
|
|
79
|
+
did.lastIndexOf('%3A', pathIdx) !== -1;
|
|
80
|
+
return hasPort;
|
|
81
|
+
}
|
|
82
|
+
const isAtprotoAudience = (value) => {
|
|
83
|
+
if (typeof value !== 'string')
|
|
84
|
+
return false;
|
|
85
|
+
const hashIndex = value.indexOf('#');
|
|
86
|
+
if (hashIndex === -1)
|
|
87
|
+
return false;
|
|
88
|
+
if (value.indexOf('#', hashIndex + 1) !== -1)
|
|
89
|
+
return false;
|
|
90
|
+
return ((0, uri_js_1.isFragment)(value, hashIndex + 1) && isAtprotoDid(value.slice(0, hashIndex)));
|
|
91
|
+
};
|
|
92
|
+
exports.isAtprotoAudience = isAtprotoAudience;
|
|
71
93
|
//# sourceMappingURL=atproto.js.map
|
package/dist/atproto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atproto.js","sourceRoot":"","sources":["../src/atproto.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"atproto.js","sourceRoot":"","sources":["../src/atproto.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { InvalidDidError } from './did-error.js'\nimport { Did } from './did.js'\nimport { isFragment } from './lib/uri.js'\nimport {\n DID_PLC_PREFIX,\n DID_WEB_PREFIX,\n assertDidPlc,\n assertDidWeb,\n isDidPlc,\n isDidWeb,\n} from './methods.js'\n\n// This file contains atproto-specific DID validation utilities.\n\nexport type AtprotoIdentityDidMethods = 'plc' | 'web'\nexport type AtprotoDid = Did<AtprotoIdentityDidMethods>\n\nexport const atprotoDidSchema = z\n .string()\n .refine(isAtprotoDid, `Atproto only allows \"plc\" and \"web\" DID methods`)\n\nexport function isAtprotoDid(input: unknown): input is AtprotoDid {\n return isDidPlc(input) || isAtprotoDidWeb(input)\n}\n\nexport function asAtprotoDid<T>(input: T) {\n assertAtprotoDid(input)\n return input\n}\n\nexport function assertAtprotoDid(input: unknown): asserts input is AtprotoDid {\n if (typeof input !== 'string') {\n throw new InvalidDidError(typeof input, `DID must be a string`)\n } else if (input.startsWith(DID_PLC_PREFIX)) {\n assertDidPlc(input)\n } else if (input.startsWith(DID_WEB_PREFIX)) {\n assertAtprotoDidWeb(input)\n } else {\n throw new InvalidDidError(\n input,\n `Atproto only allows \"plc\" and \"web\" DID methods`,\n )\n }\n}\n\nexport function assertAtprotoDidWeb(\n input: unknown,\n): asserts input is Did<'web'> {\n assertDidWeb(input)\n\n if (isDidWebWithPath(input)) {\n throw new InvalidDidError(\n input,\n `Atproto does not allow path components in Web DIDs`,\n )\n }\n\n if (isDidWebWithHttpsPort(input)) {\n throw new InvalidDidError(\n input,\n `Atproto does not allow port numbers in Web DIDs, except for localhost`,\n )\n }\n}\n\n/**\n * @see {@link https://atproto.com/specs/did#blessed-did-methods}\n */\nexport function isAtprotoDidWeb(input: unknown): input is Did<'web'> {\n if (!isDidWeb(input)) {\n return false\n }\n\n if (isDidWebWithPath(input)) {\n return false\n }\n\n if (isDidWebWithHttpsPort(input)) {\n return false\n }\n\n return true\n}\n\nfunction isDidWebWithPath(did: Did<'web'>): boolean {\n return did.includes(':', DID_WEB_PREFIX.length)\n}\n\nfunction isLocalhostDid(did: Did<'web'>): boolean {\n return (\n did === 'did:web:localhost' ||\n did.startsWith('did:web:localhost:') ||\n did.startsWith('did:web:localhost%3A')\n )\n}\n\nfunction isDidWebWithHttpsPort(did: Did<'web'>): boolean {\n if (isLocalhostDid(did)) return false\n\n const pathIdx = did.indexOf(':', DID_WEB_PREFIX.length)\n\n const hasPort =\n pathIdx === -1\n ? // No path component, check if there's a port separator anywhere after\n // the \"did:web:\" prefix\n did.includes('%3A', DID_WEB_PREFIX.length)\n : // There is a path component; if there is an encoded colon *before* it,\n // then there is a port number\n did.lastIndexOf('%3A', pathIdx) !== -1\n\n return hasPort\n}\n\nexport type AtprotoAudience = `${AtprotoDid}#${string}`\nexport const isAtprotoAudience = (value: unknown): value is AtprotoAudience => {\n if (typeof value !== 'string') return false\n const hashIndex = value.indexOf('#')\n if (hashIndex === -1) return false\n if (value.indexOf('#', hashIndex + 1) !== -1) return false\n return (\n isFragment(value, hashIndex + 1) && isAtprotoDid(value.slice(0, hashIndex))\n )\n}\n"]}
|
package/dist/did-document.d.ts
CHANGED
|
@@ -5,9 +5,9 @@ import { Did } from './did.js';
|
|
|
5
5
|
* @see {@link https://www.w3.org/TR/did-core/#services}
|
|
6
6
|
*/
|
|
7
7
|
declare const didServiceSchema: z.ZodObject<{
|
|
8
|
-
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
|
|
8
|
+
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
|
|
9
9
|
type: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>;
|
|
10
|
-
serviceEndpoint: z.ZodUnion<[z.
|
|
10
|
+
serviceEndpoint: z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>, "atleastone">]>;
|
|
11
11
|
}, "strip", z.ZodTypeAny, {
|
|
12
12
|
type: string | string[];
|
|
13
13
|
id: string;
|
|
@@ -26,11 +26,11 @@ export declare const didDocumentSchema: z.ZodObject<{
|
|
|
26
26
|
'@context': z.ZodUnion<[z.ZodLiteral<"https://www.w3.org/ns/did/v1">, z.ZodEffects<z.ZodArray<z.ZodString, "atleastone">, [string, ...string[]], [string, ...string[]]>]>;
|
|
27
27
|
id: z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>;
|
|
28
28
|
controller: z.ZodOptional<z.ZodUnion<[z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, z.ZodArray<z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, "many">]>>;
|
|
29
|
-
alsoKnownAs: z.ZodOptional<z.ZodArray<z.
|
|
29
|
+
alsoKnownAs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
30
30
|
service: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
31
|
-
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
|
|
31
|
+
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
|
|
32
32
|
type: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>;
|
|
33
|
-
serviceEndpoint: z.ZodUnion<[z.
|
|
33
|
+
serviceEndpoint: z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>, "atleastone">]>;
|
|
34
34
|
}, "strip", z.ZodTypeAny, {
|
|
35
35
|
type: string | string[];
|
|
36
36
|
id: string;
|
|
@@ -40,8 +40,8 @@ export declare const didDocumentSchema: z.ZodObject<{
|
|
|
40
40
|
id: string;
|
|
41
41
|
serviceEndpoint: string | Record<string, string> | [string | Record<string, string>, ...(string | Record<string, string>)[]];
|
|
42
42
|
}>, "many">>;
|
|
43
|
-
authentication: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>, z.ZodObject<{
|
|
44
|
-
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
|
|
43
|
+
authentication: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>, z.ZodObject<{
|
|
44
|
+
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
|
|
45
45
|
type: z.ZodString;
|
|
46
46
|
controller: z.ZodUnion<[z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, z.ZodArray<z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, "many">]>;
|
|
47
47
|
publicKeyJwk: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
@@ -60,7 +60,7 @@ export declare const didDocumentSchema: z.ZodObject<{
|
|
|
60
60
|
publicKeyMultibase?: string | undefined;
|
|
61
61
|
}>]>, "many">>;
|
|
62
62
|
verificationMethod: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodObject<{
|
|
63
|
-
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
|
|
63
|
+
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
|
|
64
64
|
type: z.ZodString;
|
|
65
65
|
controller: z.ZodUnion<[z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, z.ZodArray<z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, "many">]>;
|
|
66
66
|
publicKeyJwk: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
@@ -77,7 +77,7 @@ export declare const didDocumentSchema: z.ZodObject<{
|
|
|
77
77
|
controller: string | string[];
|
|
78
78
|
publicKeyJwk?: Record<string, unknown> | undefined;
|
|
79
79
|
publicKeyMultibase?: string | undefined;
|
|
80
|
-
}>, z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>]>, "many">>;
|
|
80
|
+
}>, z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>]>, "many">>;
|
|
81
81
|
}, "strip", z.ZodTypeAny, {
|
|
82
82
|
id: `did:${string}:${string}`;
|
|
83
83
|
'@context': "https://www.w3.org/ns/did/v1" | [string, ...string[]];
|
|
@@ -134,11 +134,11 @@ export declare const didDocumentValidator: z.ZodEffects<z.ZodObject<{
|
|
|
134
134
|
'@context': z.ZodUnion<[z.ZodLiteral<"https://www.w3.org/ns/did/v1">, z.ZodEffects<z.ZodArray<z.ZodString, "atleastone">, [string, ...string[]], [string, ...string[]]>]>;
|
|
135
135
|
id: z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>;
|
|
136
136
|
controller: z.ZodOptional<z.ZodUnion<[z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, z.ZodArray<z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, "many">]>>;
|
|
137
|
-
alsoKnownAs: z.ZodOptional<z.ZodArray<z.
|
|
137
|
+
alsoKnownAs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
138
138
|
service: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
139
|
-
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
|
|
139
|
+
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
|
|
140
140
|
type: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>;
|
|
141
|
-
serviceEndpoint: z.ZodUnion<[z.
|
|
141
|
+
serviceEndpoint: z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>, "atleastone">]>;
|
|
142
142
|
}, "strip", z.ZodTypeAny, {
|
|
143
143
|
type: string | string[];
|
|
144
144
|
id: string;
|
|
@@ -148,8 +148,8 @@ export declare const didDocumentValidator: z.ZodEffects<z.ZodObject<{
|
|
|
148
148
|
id: string;
|
|
149
149
|
serviceEndpoint: string | Record<string, string> | [string | Record<string, string>, ...(string | Record<string, string>)[]];
|
|
150
150
|
}>, "many">>;
|
|
151
|
-
authentication: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>, z.ZodObject<{
|
|
152
|
-
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
|
|
151
|
+
authentication: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>, z.ZodObject<{
|
|
152
|
+
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
|
|
153
153
|
type: z.ZodString;
|
|
154
154
|
controller: z.ZodUnion<[z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, z.ZodArray<z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, "many">]>;
|
|
155
155
|
publicKeyJwk: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
@@ -168,7 +168,7 @@ export declare const didDocumentValidator: z.ZodEffects<z.ZodObject<{
|
|
|
168
168
|
publicKeyMultibase?: string | undefined;
|
|
169
169
|
}>]>, "many">>;
|
|
170
170
|
verificationMethod: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodObject<{
|
|
171
|
-
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
|
|
171
|
+
id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
|
|
172
172
|
type: z.ZodString;
|
|
173
173
|
controller: z.ZodUnion<[z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, z.ZodArray<z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, "many">]>;
|
|
174
174
|
publicKeyJwk: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
@@ -185,7 +185,7 @@ export declare const didDocumentValidator: z.ZodEffects<z.ZodObject<{
|
|
|
185
185
|
controller: string | string[];
|
|
186
186
|
publicKeyJwk?: Record<string, unknown> | undefined;
|
|
187
187
|
publicKeyMultibase?: string | undefined;
|
|
188
|
-
}>, z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>]>, "many">>;
|
|
188
|
+
}>, z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>]>, "many">>;
|
|
189
189
|
}, "strip", z.ZodTypeAny, {
|
|
190
190
|
id: `did:${string}:${string}`;
|
|
191
191
|
'@context': "https://www.w3.org/ns/did/v1" | [string, ...string[]];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did-document.d.ts","sourceRoot":"","sources":["../src/did-document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,GAAG,EAAa,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"did-document.d.ts","sourceRoot":"","sources":["../src/did-document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,GAAG,EAAa,MAAM,UAAU,CAAA;AA+EzC;;;GAGG;AACH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;EAIpB,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAQzD;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkB5B,CAAA;AAEF,MAAM,MAAM,WAAW,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,KAAK,CAC/D,OAAO,iBAAiB,CACzB,GAAG;IAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAA;AAGvB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwB7B,CAAA"}
|
package/dist/did-document.js
CHANGED
|
@@ -3,27 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.didDocumentValidator = exports.didDocumentSchema = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const did_js_1 = require("./did.js");
|
|
6
|
+
const uri_js_1 = require("./lib/uri.js");
|
|
6
7
|
/**
|
|
7
8
|
* RFC3968 compliant URI
|
|
8
9
|
*
|
|
9
10
|
* @see {@link https://www.rfc-editor.org/rfc/rfc3986}
|
|
10
11
|
*/
|
|
11
|
-
const rfc3968UriSchema = zod_1.z.string().
|
|
12
|
-
try {
|
|
13
|
-
new URL(data);
|
|
14
|
-
return true;
|
|
15
|
-
}
|
|
16
|
-
catch {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
}, 'RFC3968 compliant URI');
|
|
12
|
+
const rfc3968UriSchema = zod_1.z.string().url('RFC3968 compliant URI');
|
|
20
13
|
const didControllerSchema = zod_1.z.union([did_js_1.didSchema, zod_1.z.array(did_js_1.didSchema)]);
|
|
21
14
|
/**
|
|
22
|
-
* @note this schema
|
|
15
|
+
* @note this schema is too permissive
|
|
23
16
|
*/
|
|
24
17
|
const didRelativeUriSchema = zod_1.z.union([
|
|
25
|
-
rfc3968UriSchema
|
|
26
|
-
|
|
18
|
+
rfc3968UriSchema.refine((value) => {
|
|
19
|
+
const fragmentIndex = value.indexOf('#');
|
|
20
|
+
if (fragmentIndex === -1)
|
|
21
|
+
return false;
|
|
22
|
+
return (0, uri_js_1.isFragment)(value, fragmentIndex + 1);
|
|
23
|
+
}, {
|
|
24
|
+
message: 'Missing or invalid fragment in RFC3968 URI',
|
|
25
|
+
}),
|
|
26
|
+
zod_1.z
|
|
27
|
+
.string()
|
|
28
|
+
.refine((value) => value.charCodeAt(0) === 35 /* # */, {
|
|
29
|
+
message: 'Fragment must start with #',
|
|
30
|
+
})
|
|
31
|
+
.refine((value) => (0, uri_js_1.isFragment)(value, 1), {
|
|
32
|
+
message: 'Invalid char in URI fragment',
|
|
33
|
+
}),
|
|
27
34
|
]);
|
|
28
35
|
const didVerificationMethodSchema = zod_1.z.object({
|
|
29
36
|
id: didRelativeUriSchema,
|
package/dist/did-document.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did-document.js","sourceRoot":"","sources":["../src/did-document.ts"],"names":[],"mappings":";;;AAAA,6BAAuB;AACvB,qCAAyC;AAEzC;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"did-document.js","sourceRoot":"","sources":["../src/did-document.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { Did, didSchema } from './did.js'\nimport { isFragment } from './lib/uri.js'\n\n/**\n * RFC3968 compliant URI\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc3986}\n */\nconst rfc3968UriSchema = z.string().url('RFC3968 compliant URI')\n\nconst didControllerSchema = z.union([didSchema, z.array(didSchema)])\n\n/**\n * @note this schema is too permissive\n */\nconst didRelativeUriSchema = z.union([\n rfc3968UriSchema.refine(\n (value) => {\n const fragmentIndex = value.indexOf('#')\n if (fragmentIndex === -1) return false\n return isFragment(value, fragmentIndex + 1)\n },\n {\n message: 'Missing or invalid fragment in RFC3968 URI',\n },\n ),\n z\n .string()\n .refine((value) => value.charCodeAt(0) === 35 /* # */, {\n message: 'Fragment must start with #',\n })\n .refine((value) => isFragment(value, 1), {\n message: 'Invalid char in URI fragment',\n }),\n])\n\nconst didVerificationMethodSchema = z.object({\n id: didRelativeUriSchema,\n type: z.string().min(1),\n controller: didControllerSchema,\n publicKeyJwk: z.record(z.string(), z.unknown()).optional(),\n publicKeyMultibase: z.string().optional(),\n})\n\n/**\n * The value of the id property MUST be a URI conforming to [RFC3986]. A\n * conforming producer MUST NOT produce multiple service entries with the same\n * id. A conforming consumer MUST produce an error if it detects multiple\n * service entries with the same id.\n *\n * @note Normally, only rfc3968UriSchema should be allowed here. However, the\n * did:plc uses relative URI. For this reason, we also allow relative URIs\n * here.\n */\nconst didServiceIdSchema = didRelativeUriSchema\n\n/**\n * The value of the type property MUST be a string or a set of strings. In order\n * to maximize interoperability, the service type and its associated properties\n * SHOULD be registered in the DID Specification Registries\n * [DID-SPEC-REGISTRIES].\n */\nconst didServiceTypeSchema = z.union([z.string(), z.array(z.string())])\n\n/**\n * The value of the serviceEndpoint property MUST be a string, a map, or a set\n * composed of one or more strings and/or maps. All string values MUST be valid\n * URIs conforming to [RFC3986] and normalized according to the Normalization\n * and Comparison rules in RFC3986 and to any normalization rules in its\n * applicable URI scheme specification.\n */\nconst didServiceEndpointSchema = z.union([\n rfc3968UriSchema,\n z.record(z.string(), rfc3968UriSchema),\n z\n .array(z.union([rfc3968UriSchema, z.record(z.string(), rfc3968UriSchema)]))\n .nonempty(),\n])\n\n/**\n * Each service map MUST contain id, type, and serviceEndpoint properties.\n * @see {@link https://www.w3.org/TR/did-core/#services}\n */\nconst didServiceSchema = z.object({\n id: didServiceIdSchema,\n type: didServiceTypeSchema,\n serviceEndpoint: didServiceEndpointSchema,\n})\n\nexport type DidService = z.infer<typeof didServiceSchema>\n\nconst didAuthenticationSchema = z.union([\n //\n didRelativeUriSchema,\n didVerificationMethodSchema,\n])\n\n/**\n * @note This schema is incomplete\n * @see {@link https://www.w3.org/TR/did-core/#production-0}\n */\nexport const didDocumentSchema = z.object({\n '@context': z.union([\n z.literal('https://www.w3.org/ns/did/v1'),\n z\n .array(z.string().url())\n .nonempty()\n .refine((data) => data[0] === 'https://www.w3.org/ns/did/v1', {\n message: 'First @context must be https://www.w3.org/ns/did/v1',\n }),\n ]),\n id: didSchema,\n controller: didControllerSchema.optional(),\n alsoKnownAs: z.array(rfc3968UriSchema).optional(),\n service: z.array(didServiceSchema).optional(),\n authentication: z.array(didAuthenticationSchema).optional(),\n verificationMethod: z\n .array(z.union([didVerificationMethodSchema, didRelativeUriSchema]))\n .optional(),\n})\n\nexport type DidDocument<Method extends string = string> = z.infer<\n typeof didDocumentSchema\n> & { id: Did<Method> }\n\n// @TODO: add other refinements ?\nexport const didDocumentValidator = didDocumentSchema\n // Ensure that every service id is unique\n .superRefine(({ id: did, service }, ctx) => {\n if (service) {\n const visited = new Set()\n\n for (let i = 0; i < service.length; i++) {\n const current = service[i]\n\n const serviceId = current.id.startsWith('#')\n ? `${did}${current.id}`\n : current.id\n\n if (!visited.has(serviceId)) {\n visited.add(serviceId)\n } else {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Duplicate service id (${current.id}) found in the document`,\n path: ['service', i, 'id'],\n })\n }\n }\n }\n })\n"]}
|
package/dist/did-error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did-error.js","sourceRoot":"","sources":["../src/did-error.ts"],"names":[],"mappings":";;;AAAA,MAAa,QAAS,SAAQ,KAAK;IACjC,YACkB,GAAW,EAC3B,OAAe,EACC,IAAY,EACZ,SAAS,GAAG,EAC5B,KAAe;QAEf,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QANzB;;;;mBAAgB,GAAG;WAAQ;QAE3B;;;;mBAAgB,IAAI;WAAQ;QAC5B;;;;mBAAgB,MAAM;WAAM;IAI9B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAEQ,QAAQ;QACf,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;IAC/E,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,KAAc,EAAE,GAAW;QACrC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,OAAO,GACX,KAAK,YAAY,KAAK;YACpB,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;gBACzB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,2BAA2B,CAAA;QAEnC,MAAM,MAAM,GACV,CAAC,OAAO,KAAK,EAAE,CAAC,YAAY,CAAC,KAAK,QAAQ;YACxC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;YACrB,CAAC,CAAC,SAAS,CAAC;YACd,CAAC,OAAO,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAEvE,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACvE,CAAC;CACF;AA1CD,4BA0CC;AAED,MAAa,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,GAAW,EAAE,OAAe,EAAE,KAAe;QACvD,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;CACF;AAJD,0CAIC"}
|
|
1
|
+
{"version":3,"file":"did-error.js","sourceRoot":"","sources":["../src/did-error.ts"],"names":[],"mappings":";;;AAAA,MAAa,QAAS,SAAQ,KAAK;IACjC,YACkB,GAAW,EAC3B,OAAe,EACC,IAAY,EACZ,SAAS,GAAG,EAC5B,KAAe;QAEf,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QANzB;;;;mBAAgB,GAAG;WAAQ;QAE3B;;;;mBAAgB,IAAI;WAAQ;QAC5B;;;;mBAAgB,MAAM;WAAM;IAI9B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAEQ,QAAQ;QACf,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;IAC/E,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,KAAc,EAAE,GAAW;QACrC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,OAAO,GACX,KAAK,YAAY,KAAK;YACpB,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;gBACzB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,2BAA2B,CAAA;QAEnC,MAAM,MAAM,GACV,CAAC,OAAO,KAAK,EAAE,CAAC,YAAY,CAAC,KAAK,QAAQ;YACxC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;YACrB,CAAC,CAAC,SAAS,CAAC;YACd,CAAC,OAAO,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAEvE,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACvE,CAAC;CACF;AA1CD,4BA0CC;AAED,MAAa,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,GAAW,EAAE,OAAe,EAAE,KAAe;QACvD,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;CACF;AAJD,0CAIC","sourcesContent":["export class DidError extends Error {\n constructor(\n public readonly did: string,\n message: string,\n public readonly code: string,\n public readonly status = 400,\n cause?: unknown,\n ) {\n super(message, { cause })\n }\n\n /**\n * For compatibility with error handlers in common HTTP frameworks.\n */\n get statusCode() {\n return this.status\n }\n\n override toString() {\n return `${this.constructor.name} ${this.code} (${this.did}): ${this.message}`\n }\n\n static from(cause: unknown, did: string): DidError {\n if (cause instanceof DidError) {\n return cause\n }\n\n const message =\n cause instanceof Error\n ? cause.message\n : typeof cause === 'string'\n ? cause\n : 'An unknown error occurred'\n\n const status =\n (typeof cause?.['statusCode'] === 'number'\n ? cause['statusCode']\n : undefined) ??\n (typeof cause?.['status'] === 'number' ? cause['status'] : undefined)\n\n return new DidError(did, message, 'did-unknown-error', status, cause)\n }\n}\n\nexport class InvalidDidError extends DidError {\n constructor(did: string, message: string, cause?: unknown) {\n super(did, message, 'did-invalid', 400, cause)\n }\n}\n"]}
|
package/dist/did.d.ts
CHANGED
|
@@ -52,6 +52,6 @@ export declare function extractDidMethod<D extends Did>(did: D): D extends Did<i
|
|
|
52
52
|
export declare function assertDidMsid(input: string, start?: number, end?: number): void;
|
|
53
53
|
export declare function assertDid(input: unknown): asserts input is Did;
|
|
54
54
|
export declare function isDid(input: unknown): input is Did;
|
|
55
|
-
export declare function asDid(input:
|
|
55
|
+
export declare function asDid<T>(input: T): T & `did:${string}:${string}`;
|
|
56
56
|
export declare const didSchema: z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>;
|
|
57
57
|
//# sourceMappingURL=did.d.ts.map
|
package/dist/did.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did.d.ts","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,QAAA,MAAM,UAAU,SAAS,CAAA;AAEzB,OAAO,EAAE,UAAU,EAAE,CAAA;AAErB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAA;AAE9E;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC,GACzC,MAAM,GACN,mBAAmB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAE9B,KAAK,gBAAgB,GAAG,SAAS,GAAG,cAAc,CAAA;AAClD,KAAK,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAC1E,KAAK,cAAc,GACf,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,CAAA;AAEP,KAAK,mBAAmB,CACtB,CAAC,EACD,GAAG,SAAS,MAAM,IAChB,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,GAChC,CAAC,SAAS,gBAAgB,GACxB,mBAAmB,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GACpC,KAAK,GACP,GAAG,SAAS,EAAE,GACZ,KAAK,GACL,GAAG,CAAA;AAET;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,EACT,GAAG,SAAe,GACjB,IAAI,CA0BN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,CAAC,GAGnC,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CACrD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,EACT,GAAG,SAAe,GACjB,IAAI,CAuEN;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAqB9D;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAYlD;AAED,wBAAgB,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"did.d.ts","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,QAAA,MAAM,UAAU,SAAS,CAAA;AAEzB,OAAO,EAAE,UAAU,EAAE,CAAA;AAErB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAA;AAE9E;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC,GACzC,MAAM,GACN,mBAAmB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAE9B,KAAK,gBAAgB,GAAG,SAAS,GAAG,cAAc,CAAA;AAClD,KAAK,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAC1E,KAAK,cAAc,GACf,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,CAAA;AAEP,KAAK,mBAAmB,CACtB,CAAC,EACD,GAAG,SAAS,MAAM,IAChB,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,GAChC,CAAC,SAAS,gBAAgB,GACxB,mBAAmB,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GACpC,KAAK,GACP,GAAG,SAAS,EAAE,GACZ,KAAK,GACL,GAAG,CAAA;AAET;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,EACT,GAAG,SAAe,GACjB,IAAI,CA0BN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,CAAC,GAGnC,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CACrD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,EACT,GAAG,SAAe,GACjB,IAAI,CAuEN;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAqB9D;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAYlD;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,iCAGhC;AAED,eAAO,MAAM,SAAS,8DAalB,CAAA"}
|
package/dist/did.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did.js","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"did.js","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { DidError, InvalidDidError } from './did-error.js'\n\nconst DID_PREFIX = 'did:'\nconst DID_PREFIX_LENGTH = DID_PREFIX.length\nexport { DID_PREFIX }\n\n/**\n * Type representation of a Did, with method.\n *\n * ```bnf\n * did = \"did:\" method-name \":\" method-specific-id\n * method-name = 1*method-char\n * method-char = %x61-7A / DIGIT\n * method-specific-id = *( *idchar \":\" ) 1*idchar\n * idchar = ALPHA / DIGIT / \".\" / \"-\" / \"_\" / pct-encoded\n * pct-encoded = \"%\" HEXDIG HEXDIG\n * ```\n *\n * @example\n * ```ts\n * type DidWeb = Did<'web'> // `did:web:${string}`\n * type DidCustom = Did<'web' | 'plc'> // `did:${'web' | 'plc'}:${string}`\n * type DidNever = Did<' invalid 🥴 '> // never\n * type DidFoo = Did<'foo' | ' invalid 🥴 '> // `did:foo:${string}`\n * ```\n *\n * @see {@link https://www.w3.org/TR/did-core/#did-syntax}\n */\nexport type Did<M extends string = string> = `did:${AsDidMethod<M>}:${string}`\n\n/**\n * DID Method\n */\nexport type AsDidMethod<M> = string extends M\n ? string // can't know...\n : AsDidMethodInternal<M, ''>\n\ntype AlphanumericChar = DigitChar | LowerAlphaChar\ntype DigitChar = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'\ntype LowerAlphaChar =\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n\ntype AsDidMethodInternal<\n S,\n Acc extends string,\n> = S extends `${infer H}${infer T}`\n ? H extends AlphanumericChar\n ? AsDidMethodInternal<T, `${Acc}${H}`>\n : never\n : Acc extends ''\n ? never\n : Acc\n\n/**\n * DID Method-name check function.\n *\n * Check if the input is a valid DID method name, at the position between\n * `start` (inclusive) and `end` (exclusive).\n */\nexport function assertDidMethod(\n input: string,\n start = 0,\n end = input.length,\n): void {\n if (\n !Number.isFinite(end) ||\n !Number.isFinite(start) ||\n end < start ||\n end > input.length\n ) {\n throw new TypeError('Invalid start or end position')\n }\n if (end === start) {\n throw new InvalidDidError(input, `Empty method name`)\n }\n\n let c: number\n for (let i = start; i < end; i++) {\n c = input.charCodeAt(i)\n if (\n (c < 0x61 || c > 0x7a) && // a-z\n (c < 0x30 || c > 0x39) // 0-9\n ) {\n throw new InvalidDidError(\n input,\n `Invalid character at position ${i} in DID method name`,\n )\n }\n }\n}\n\n/**\n * This method assumes the input is a valid Did\n */\nexport function extractDidMethod<D extends Did>(did: D) {\n const msidSep = did.indexOf(':', DID_PREFIX_LENGTH)\n const method = did.slice(DID_PREFIX_LENGTH, msidSep)\n return method as D extends Did<infer M> ? M : string\n}\n\n/**\n * DID Method-specific identifier check function.\n *\n * Check if the input is a valid DID method-specific identifier, at the position\n * between `start` (inclusive) and `end` (exclusive).\n */\nexport function assertDidMsid(\n input: string,\n start = 0,\n end = input.length,\n): void {\n if (\n !Number.isFinite(end) ||\n !Number.isFinite(start) ||\n end < start ||\n end > input.length\n ) {\n throw new TypeError('Invalid start or end position')\n }\n if (end === start) {\n throw new InvalidDidError(input, `DID method-specific id must not be empty`)\n }\n\n let c: number\n for (let i = start; i < end; i++) {\n c = input.charCodeAt(i)\n\n // Check for frequent chars first\n if (\n (c < 0x61 || c > 0x7a) && // a-z\n (c < 0x41 || c > 0x5a) && // A-Z\n (c < 0x30 || c > 0x39) && // 0-9\n c !== 0x2e && // .\n c !== 0x2d && // -\n c !== 0x5f // _\n ) {\n // Less frequent chars are checked here\n\n // \":\"\n if (c === 0x3a) {\n if (i === end - 1) {\n throw new InvalidDidError(input, `DID cannot end with \":\"`)\n }\n continue\n }\n\n // pct-encoded\n if (c === 0x25) {\n c = input.charCodeAt(++i)\n if ((c < 0x30 || c > 0x39) && (c < 0x41 || c > 0x46)) {\n throw new InvalidDidError(\n input,\n `Invalid pct-encoded character at position ${i}`,\n )\n }\n\n c = input.charCodeAt(++i)\n if ((c < 0x30 || c > 0x39) && (c < 0x41 || c > 0x46)) {\n throw new InvalidDidError(\n input,\n `Invalid pct-encoded character at position ${i}`,\n )\n }\n\n // There must always be 2 HEXDIG after a \"%\"\n if (i >= end) {\n throw new InvalidDidError(\n input,\n `Incomplete pct-encoded character at position ${i - 2}`,\n )\n }\n\n continue\n }\n\n throw new InvalidDidError(\n input,\n `Disallowed character in DID at position ${i}`,\n )\n }\n }\n}\n\nexport function assertDid(input: unknown): asserts input is Did {\n if (typeof input !== 'string') {\n throw new InvalidDidError(typeof input, `DID must be a string`)\n }\n\n const { length } = input\n if (length > 2048) {\n throw new InvalidDidError(input, `DID is too long (2048 chars max)`)\n }\n\n if (!input.startsWith(DID_PREFIX)) {\n throw new InvalidDidError(input, `DID requires \"${DID_PREFIX}\" prefix`)\n }\n\n const idSep = input.indexOf(':', DID_PREFIX_LENGTH)\n if (idSep === -1) {\n throw new InvalidDidError(input, `Missing colon after method name`)\n }\n\n assertDidMethod(input, DID_PREFIX_LENGTH, idSep)\n assertDidMsid(input, idSep + 1, length)\n}\n\nexport function isDid(input: unknown): input is Did {\n try {\n assertDid(input)\n return true\n } catch (err) {\n if (err instanceof DidError) {\n return false\n }\n\n // Unexpected TypeError (should never happen)\n throw err\n }\n}\n\nexport function asDid<T>(input: T) {\n assertDid(input)\n return input\n}\n\nexport const didSchema = z\n .string()\n .superRefine((value: string, ctx: z.RefinementCtx): value is Did => {\n try {\n assertDid(value)\n return true\n } catch (err) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: err instanceof Error ? err.message : 'Unexpected error',\n })\n return false\n }\n })\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA4B;AAC5B,oDAAiC;AACjC,iDAA8B;AAC9B,2CAAwB;AACxB,+CAA4B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA4B;AAC5B,oDAAiC;AACjC,iDAA8B;AAC9B,2CAAwB;AACxB,+CAA4B","sourcesContent":["export * from './atproto.js'\nexport * from './did-document.js'\nexport * from './did-error.js'\nexport * from './did.js'\nexport * from './methods.js'\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @see {@link https://www.w3.org/TR/did-1.0/#dfn-did-fragments}
|
|
3
|
+
* @see {@link https://datatracker.ietf.org/doc/html/rfc3986#section-3.5}
|
|
4
|
+
*/
|
|
5
|
+
export declare function isFragment(value: string, startIdx?: number, endIdx?: number): boolean;
|
|
6
|
+
export declare function isHexDigit(code: number): boolean;
|
|
7
|
+
//# sourceMappingURL=uri.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../../src/lib/uri.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,QAAQ,SAAI,EACZ,MAAM,SAAe,GACpB,OAAO,CAkDT;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMhD"}
|
package/dist/lib/uri.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isFragment = isFragment;
|
|
4
|
+
exports.isHexDigit = isHexDigit;
|
|
5
|
+
/**
|
|
6
|
+
* @see {@link https://www.w3.org/TR/did-1.0/#dfn-did-fragments}
|
|
7
|
+
* @see {@link https://datatracker.ietf.org/doc/html/rfc3986#section-3.5}
|
|
8
|
+
*/
|
|
9
|
+
function isFragment(value, startIdx = 0, endIdx = value.length) {
|
|
10
|
+
let charCode;
|
|
11
|
+
for (let i = startIdx; i < endIdx; i++) {
|
|
12
|
+
charCode = value.charCodeAt(i);
|
|
13
|
+
// fragment = *( pchar / "/" / "?" )
|
|
14
|
+
// pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
|
|
15
|
+
// unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
|
|
16
|
+
// pct-encoded = "%" HEXDIG HEXDIG
|
|
17
|
+
// sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
|
|
18
|
+
if ((charCode >= 65 /* A */ && charCode <= 90) /* Z */ ||
|
|
19
|
+
(charCode >= 97 /* a */ && charCode <= 122) /* z */ ||
|
|
20
|
+
(charCode >= 48 /* 0 */ && charCode <= 57) /* 9 */ ||
|
|
21
|
+
charCode === 45 /* "-" */ ||
|
|
22
|
+
charCode === 46 /* "." */ ||
|
|
23
|
+
charCode === 95 /* "_" */ ||
|
|
24
|
+
charCode === 126 /* "~" */) {
|
|
25
|
+
// unreserved
|
|
26
|
+
}
|
|
27
|
+
else if (charCode === 33 /* "!" */ ||
|
|
28
|
+
charCode === 36 /* "$" */ ||
|
|
29
|
+
charCode === 38 /* "&" */ ||
|
|
30
|
+
charCode === 39 /* "'" */ ||
|
|
31
|
+
charCode === 40 /* "(" */ ||
|
|
32
|
+
charCode === 41 /* ")" */ ||
|
|
33
|
+
charCode === 42 /* "*" */ ||
|
|
34
|
+
charCode === 43 /* "+" */ ||
|
|
35
|
+
charCode === 44 /* "," */ ||
|
|
36
|
+
charCode === 59 /* ";" */ ||
|
|
37
|
+
charCode === 61 /* "=" */) {
|
|
38
|
+
// sub-delims
|
|
39
|
+
}
|
|
40
|
+
else if (charCode === 58 /* ":" */ || charCode === 64 /* "@" */) {
|
|
41
|
+
// pchar extra
|
|
42
|
+
}
|
|
43
|
+
else if (charCode === 47 /* "/" */ || charCode === 63 /* "?" */) {
|
|
44
|
+
// fragment extra
|
|
45
|
+
}
|
|
46
|
+
else if (charCode === 37 /* "%" */) {
|
|
47
|
+
// pct-enc
|
|
48
|
+
if (i + 2 >= endIdx)
|
|
49
|
+
return false;
|
|
50
|
+
if (!isHexDigit(value.charCodeAt(i + 1)))
|
|
51
|
+
return false;
|
|
52
|
+
if (!isHexDigit(value.charCodeAt(i + 2)))
|
|
53
|
+
return false;
|
|
54
|
+
i += 2;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
function isHexDigit(code) {
|
|
63
|
+
return ((code >= 48 && code <= 57) || // 0-9
|
|
64
|
+
(code >= 65 && code <= 70) || // A-F
|
|
65
|
+
(code >= 97 && code <= 102) // a-f
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=uri.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/lib/uri.ts"],"names":[],"mappings":";;AAIA,gCAsDC;AAED,gCAMC;AAlED;;;GAGG;AACH,SAAgB,UAAU,CACxB,KAAa,EACb,QAAQ,GAAG,CAAC,EACZ,MAAM,GAAG,KAAK,CAAC,MAAM;IAErB,IAAI,QAAgB,CAAA;IACpB,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAE9B,uCAAuC;QACvC,kEAAkE;QAClE,sDAAsD;QACtD,kCAAkC;QAClC,gFAAgF;QAChF,IACE,CAAC,QAAQ,IAAI,EAAE,CAAC,OAAO,IAAI,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO;YAClD,CAAC,QAAQ,IAAI,EAAE,CAAC,OAAO,IAAI,QAAQ,IAAI,GAAG,CAAC,CAAC,OAAO;YACnD,CAAC,QAAQ,IAAI,EAAE,CAAC,OAAO,IAAI,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO;YAClD,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,GAAG,CAAC,SAAS,EAC1B,CAAC;YACD,aAAa;QACf,CAAC;aAAM,IACL,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS,EACzB,CAAC;YACD,aAAa;QACf,CAAC;aAAM,IAAI,QAAQ,KAAK,EAAE,CAAC,SAAS,IAAI,QAAQ,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC;YAClE,cAAc;QAChB,CAAC;aAAM,IAAI,QAAQ,KAAK,EAAE,CAAC,SAAS,IAAI,QAAQ,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC;YAClE,iBAAiB;QACnB,CAAC;aAAM,IAAI,QAAQ,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC;YACrC,UAAU;YACV,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM;gBAAE,OAAO,KAAK,CAAA;YACjC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAA;YACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAA;YACtD,CAAC,IAAI,CAAC,CAAA;QACR,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,CACL,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM;QACpC,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM;QACpC,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,MAAM;KACnC,CAAA;AACH,CAAC","sourcesContent":["/**\n * @see {@link https://www.w3.org/TR/did-1.0/#dfn-did-fragments}\n * @see {@link https://datatracker.ietf.org/doc/html/rfc3986#section-3.5}\n */\nexport function isFragment(\n value: string,\n startIdx = 0,\n endIdx = value.length,\n): boolean {\n let charCode: number\n for (let i = startIdx; i < endIdx; i++) {\n charCode = value.charCodeAt(i)\n\n // fragment = *( pchar / \"/\" / \"?\" )\n // pchar = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n // unreserved = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n // pct-encoded = \"%\" HEXDIG HEXDIG\n // sub-delims = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\" / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n if (\n (charCode >= 65 /* A */ && charCode <= 90) /* Z */ ||\n (charCode >= 97 /* a */ && charCode <= 122) /* z */ ||\n (charCode >= 48 /* 0 */ && charCode <= 57) /* 9 */ ||\n charCode === 45 /* \"-\" */ ||\n charCode === 46 /* \".\" */ ||\n charCode === 95 /* \"_\" */ ||\n charCode === 126 /* \"~\" */\n ) {\n // unreserved\n } else if (\n charCode === 33 /* \"!\" */ ||\n charCode === 36 /* \"$\" */ ||\n charCode === 38 /* \"&\" */ ||\n charCode === 39 /* \"'\" */ ||\n charCode === 40 /* \"(\" */ ||\n charCode === 41 /* \")\" */ ||\n charCode === 42 /* \"*\" */ ||\n charCode === 43 /* \"+\" */ ||\n charCode === 44 /* \",\" */ ||\n charCode === 59 /* \";\" */ ||\n charCode === 61 /* \"=\" */\n ) {\n // sub-delims\n } else if (charCode === 58 /* \":\" */ || charCode === 64 /* \"@\" */) {\n // pchar extra\n } else if (charCode === 47 /* \"/\" */ || charCode === 63 /* \"?\" */) {\n // fragment extra\n } else if (charCode === 37 /* \"%\" */) {\n // pct-enc\n if (i + 2 >= endIdx) return false\n if (!isHexDigit(value.charCodeAt(i + 1))) return false\n if (!isHexDigit(value.charCodeAt(i + 2))) return false\n i += 2\n } else {\n return false\n }\n }\n\n return true\n}\n\nexport function isHexDigit(code: number): boolean {\n return (\n (code >= 48 && code <= 57) || // 0-9\n (code >= 65 && code <= 70) || // A-F\n (code >= 97 && code <= 102) // a-f\n )\n}\n"]}
|
package/dist/methods/plc.d.ts
CHANGED
|
@@ -2,6 +2,6 @@ import { Did } from '../did.js';
|
|
|
2
2
|
declare const DID_PLC_PREFIX = "did:plc:";
|
|
3
3
|
export { DID_PLC_PREFIX };
|
|
4
4
|
export declare function isDidPlc(input: unknown): input is Did<'plc'>;
|
|
5
|
-
export declare function asDidPlc(input:
|
|
5
|
+
export declare function asDidPlc<T>(input: T): T & `did:plc:${string}`;
|
|
6
6
|
export declare function assertDidPlc(input: unknown): asserts input is Did<'plc'>;
|
|
7
7
|
//# sourceMappingURL=plc.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plc.d.ts","sourceRoot":"","sources":["../../src/methods/plc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAE/B,QAAA,MAAM,cAAc,aAAa,CAAA;AAIjC,OAAO,EAAE,cAAc,EAAE,CAAA;AAEzB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAS5D;AAED,wBAAgB,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"plc.d.ts","sourceRoot":"","sources":["../../src/methods/plc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAE/B,QAAA,MAAM,cAAc,aAAa,CAAA;AAIjC,OAAO,EAAE,cAAc,EAAE,CAAA;AAEzB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAS5D;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,2BAGnC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAyBxE"}
|
package/dist/methods/plc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plc.js","sourceRoot":"","sources":["../../src/methods/plc.ts"],"names":[],"mappings":";;;AASA,4BASC;AAED,4BAGC;AAED,oCAyBC;AAlDD,kDAAiD;AAGjD,MAAM,cAAc,GAAG,UAAU,CAAA;AAIxB,wCAAc;AAHvB,MAAM,qBAAqB,GAAG,cAAc,CAAC,MAAM,CAAA;AACnD,MAAM,cAAc,GAAG,EAAE,CAAA;AAIzB,SAAgB,QAAQ,CAAC,KAAc;IACrC,8DAA8D;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc;QAAE,OAAO,KAAK,CAAA;IACjD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,KAAK,CAAA;IACnD,KAAK,IAAI,CAAC,GAAG,qBAAqB,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IACtD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAgB,QAAQ,
|
|
1
|
+
{"version":3,"file":"plc.js","sourceRoot":"","sources":["../../src/methods/plc.ts"],"names":[],"mappings":";;;AASA,4BASC;AAED,4BAGC;AAED,oCAyBC;AAlDD,kDAAiD;AAGjD,MAAM,cAAc,GAAG,UAAU,CAAA;AAIxB,wCAAc;AAHvB,MAAM,qBAAqB,GAAG,cAAc,CAAC,MAAM,CAAA;AACnD,MAAM,cAAc,GAAG,EAAE,CAAA;AAIzB,SAAgB,QAAQ,CAAC,KAAc;IACrC,8DAA8D;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc;QAAE,OAAO,KAAK,CAAA;IACjD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,KAAK,CAAA;IACnD,KAAK,IAAI,CAAC,GAAG,qBAAqB,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IACtD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAgB,QAAQ,CAAI,KAAQ;IAClC,YAAY,CAAC,KAAK,CAAC,CAAA;IACnB,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,YAAY,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,8BAAe,CAAC,OAAO,KAAK,EAAE,sBAAsB,CAAC,CAAA;IACjE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,8BAAe,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QACpC,MAAM,IAAI,8BAAe,CACvB,KAAK,EACL,mBAAmB,cAAc,kBAAkB,CACpD,CAAA;IACH,CAAC;IAED,2EAA2E;IAE3E,8CAA8C;IAE9C,KAAK,IAAI,CAAC,GAAG,qBAAqB,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,8BAAe,CAAC,KAAK,EAAE,iCAAiC,CAAC,EAAE,CAAC,CAAA;QACxE,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,CAAS,EAAW,EAAE,CAC1C,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,CAAA,CAAC,WAAW","sourcesContent":["import { InvalidDidError } from '../did-error.js'\nimport { Did } from '../did.js'\n\nconst DID_PLC_PREFIX = `did:plc:`\nconst DID_PLC_PREFIX_LENGTH = DID_PLC_PREFIX.length\nconst DID_PLC_LENGTH = 32\n\nexport { DID_PLC_PREFIX }\n\nexport function isDidPlc(input: unknown): input is Did<'plc'> {\n // Optimization: equivalent to try/catch around \"assertDidPlc\"\n if (typeof input !== 'string') return false\n if (input.length !== DID_PLC_LENGTH) return false\n if (!input.startsWith(DID_PLC_PREFIX)) return false\n for (let i = DID_PLC_PREFIX_LENGTH; i < DID_PLC_LENGTH; i++) {\n if (!isBase32Char(input.charCodeAt(i))) return false\n }\n return true\n}\n\nexport function asDidPlc<T>(input: T) {\n assertDidPlc(input)\n return input\n}\n\nexport function assertDidPlc(input: unknown): asserts input is Did<'plc'> {\n if (typeof input !== 'string') {\n throw new InvalidDidError(typeof input, `DID must be a string`)\n }\n\n if (!input.startsWith(DID_PLC_PREFIX)) {\n throw new InvalidDidError(input, `Invalid did:plc prefix`)\n }\n\n if (input.length !== DID_PLC_LENGTH) {\n throw new InvalidDidError(\n input,\n `did:plc must be ${DID_PLC_LENGTH} characters long`,\n )\n }\n\n // The following check is not necessary, as the check below is more strict:\n\n // assertDidMsid(input, DID_PLC_PREFIX.length)\n\n for (let i = DID_PLC_PREFIX_LENGTH; i < DID_PLC_LENGTH; i++) {\n if (!isBase32Char(input.charCodeAt(i))) {\n throw new InvalidDidError(input, `Invalid character at position ${i}`)\n }\n }\n}\n\nconst isBase32Char = (c: number): boolean =>\n (c >= 0x61 && c <= 0x7a) || (c >= 0x32 && c <= 0x37) // [a-z2-7]\n"]}
|
package/dist/methods/web.d.ts
CHANGED
|
@@ -4,10 +4,11 @@ export declare const DID_WEB_PREFIX = "did:web:";
|
|
|
4
4
|
* This function checks if the input is a valid Web DID, as per DID spec.
|
|
5
5
|
*/
|
|
6
6
|
export declare function isDidWeb(input: unknown): input is Did<'web'>;
|
|
7
|
-
export declare function asDidWeb(input:
|
|
7
|
+
export declare function asDidWeb<T>(input: T): T & `did:web:${string}`;
|
|
8
8
|
export declare function assertDidWeb(input: unknown): asserts input is Did<'web'>;
|
|
9
9
|
export declare function didWebToUrl(did: Did<'web'>): URL & {
|
|
10
10
|
protocol: "http:" | "https:";
|
|
11
11
|
};
|
|
12
12
|
export declare function urlToDidWeb(url: URL): Did<'web'>;
|
|
13
|
+
export declare function buildDidWebUrl(did: Did<'web'>): string;
|
|
13
14
|
//# sourceMappingURL=web.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/methods/web.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAiB,MAAM,WAAW,CAAA;AAE9C,eAAO,MAAM,cAAc,aAAkC,CAAA;
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/methods/web.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAiB,MAAM,WAAW,CAAA;AAE9C,eAAO,MAAM,cAAc,aAAkC,CAAA;AAa7D;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAa5D;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,2BAGnC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAmBxE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC;cAG3B,OAAO,GAAG,QAAQ;EAKjC;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAKhD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAetD"}
|
package/dist/methods/web.js
CHANGED
|
@@ -6,9 +6,20 @@ exports.asDidWeb = asDidWeb;
|
|
|
6
6
|
exports.assertDidWeb = assertDidWeb;
|
|
7
7
|
exports.didWebToUrl = didWebToUrl;
|
|
8
8
|
exports.urlToDidWeb = urlToDidWeb;
|
|
9
|
+
exports.buildDidWebUrl = buildDidWebUrl;
|
|
9
10
|
const did_error_js_1 = require("../did-error.js");
|
|
10
11
|
const did_js_1 = require("../did.js");
|
|
11
12
|
exports.DID_WEB_PREFIX = `did:web:`;
|
|
13
|
+
const canParse = URL.canParse?.bind(URL) ??
|
|
14
|
+
((url, base) => {
|
|
15
|
+
try {
|
|
16
|
+
new URL(url, base);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
12
23
|
/**
|
|
13
24
|
* This function checks if the input is a valid Web DID, as per DID spec.
|
|
14
25
|
*/
|
|
@@ -21,12 +32,12 @@ function isDidWeb(input) {
|
|
|
21
32
|
if (input.charAt(exports.DID_WEB_PREFIX.length) === ':')
|
|
22
33
|
return false;
|
|
23
34
|
try {
|
|
24
|
-
|
|
25
|
-
return true;
|
|
35
|
+
(0, did_js_1.assertDidMsid)(input, exports.DID_WEB_PREFIX.length);
|
|
26
36
|
}
|
|
27
37
|
catch {
|
|
28
38
|
return false;
|
|
29
39
|
}
|
|
40
|
+
return canParse(buildDidWebUrl(input));
|
|
30
41
|
}
|
|
31
42
|
function asDidWeb(input) {
|
|
32
43
|
assertDidWeb(input);
|
|
@@ -42,21 +53,15 @@ function assertDidWeb(input) {
|
|
|
42
53
|
if (input.charAt(exports.DID_WEB_PREFIX.length) === ':') {
|
|
43
54
|
throw new did_error_js_1.InvalidDidError(input, 'did:web MSID must not start with a colon');
|
|
44
55
|
}
|
|
45
|
-
|
|
56
|
+
// Make sure every char is valid (per DID spec)
|
|
57
|
+
(0, did_js_1.assertDidMsid)(input, exports.DID_WEB_PREFIX.length);
|
|
58
|
+
if (!canParse(buildDidWebUrl(input))) {
|
|
59
|
+
throw new did_error_js_1.InvalidDidError(input, 'Invalid Web DID');
|
|
60
|
+
}
|
|
46
61
|
}
|
|
47
62
|
function didWebToUrl(did) {
|
|
48
|
-
// Make sure every char is valid (per DID spec)
|
|
49
|
-
(0, did_js_1.assertDidMsid)(did, exports.DID_WEB_PREFIX.length);
|
|
50
|
-
const hostIdx = exports.DID_WEB_PREFIX.length;
|
|
51
|
-
const pathIdx = did.indexOf(':', hostIdx);
|
|
52
|
-
const host = pathIdx === -1 ? did.slice(hostIdx) : did.slice(hostIdx, pathIdx);
|
|
53
|
-
const path = pathIdx === -1 ? '' : did.slice(pathIdx);
|
|
54
63
|
try {
|
|
55
|
-
|
|
56
|
-
if (url.hostname === 'localhost') {
|
|
57
|
-
url.protocol = 'http:';
|
|
58
|
-
}
|
|
59
|
-
return url;
|
|
64
|
+
return new URL(buildDidWebUrl(did));
|
|
60
65
|
}
|
|
61
66
|
catch (cause) {
|
|
62
67
|
throw new did_error_js_1.InvalidDidError(did, 'Invalid Web DID', cause);
|
|
@@ -67,4 +72,16 @@ function urlToDidWeb(url) {
|
|
|
67
72
|
const path = url.pathname === '/' ? '' : url.pathname.replaceAll('/', ':');
|
|
68
73
|
return `did:web:${url.hostname}${port}${path}`;
|
|
69
74
|
}
|
|
75
|
+
function buildDidWebUrl(did) {
|
|
76
|
+
const hostIdx = exports.DID_WEB_PREFIX.length;
|
|
77
|
+
const pathIdx = did.indexOf(':', hostIdx);
|
|
78
|
+
const hostEnc = pathIdx === -1 ? did.slice(hostIdx) : did.slice(hostIdx, pathIdx);
|
|
79
|
+
const host = hostEnc.replaceAll('%3A', ':');
|
|
80
|
+
const path = pathIdx === -1 ? '' : did.slice(pathIdx).replaceAll(':', '/');
|
|
81
|
+
const proto = host.startsWith('localhost') &&
|
|
82
|
+
(host.length === 9 || host.charCodeAt(9) === 58) /* ':' */
|
|
83
|
+
? 'http'
|
|
84
|
+
: 'https';
|
|
85
|
+
return `${proto}://${host}${path}`;
|
|
86
|
+
}
|
|
70
87
|
//# sourceMappingURL=web.js.map
|
package/dist/methods/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/methods/web.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/methods/web.ts"],"names":[],"mappings":";;;AAmBA,4BAaC;AAED,4BAGC;AAED,oCAmBC;AAED,kCAQC;AAED,kCAKC;AAED,wCAeC;AA5FD,kDAAiD;AACjD,sCAA8C;AAEjC,QAAA,cAAc,GAAG,UAA+B,CAAA;AAE7D,MAAM,QAAQ,GACZ,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC;IACvB,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YAClB,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC,CAAC,CAAA;AAEJ;;GAEG;AACH,SAAgB,QAAQ,CAAC,KAAc;IACrC,wCAAwC;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,sBAAc,CAAC;QAAE,OAAO,KAAK,CAAA;IACnD,IAAI,KAAK,CAAC,MAAM,CAAC,sBAAc,CAAC,MAAM,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IAE7D,IAAI,CAAC;QACH,IAAA,sBAAa,EAAC,KAAK,EAAE,sBAAc,CAAC,MAAM,CAAC,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,QAAQ,CAAC,cAAc,CAAC,KAAmB,CAAC,CAAC,CAAA;AACtD,CAAC;AAED,SAAgB,QAAQ,CAAI,KAAQ;IAClC,YAAY,CAAC,KAAK,CAAC,CAAA;IACnB,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,YAAY,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,8BAAe,CAAC,OAAO,KAAK,EAAE,sBAAsB,CAAC,CAAA;IACjE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,sBAAc,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,8BAAe,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,CAAC,sBAAc,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QAChD,MAAM,IAAI,8BAAe,CAAC,KAAK,EAAE,0CAA0C,CAAC,CAAA;IAC9E,CAAC;IAED,+CAA+C;IAC/C,IAAA,sBAAa,EAAC,KAAK,EAAE,sBAAc,CAAC,MAAM,CAAC,CAAA;IAE3C,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAmB,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,8BAAe,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;IACrD,CAAC;AACH,CAAC;AAED,SAAgB,WAAW,CAAC,GAAe;IACzC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAEjC,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,8BAAe,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,SAAgB,WAAW,CAAC,GAAQ;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAE1E,OAAO,WAAW,GAAG,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,EAAE,CAAA;AAChD,CAAC;AAED,SAAgB,cAAc,CAAC,GAAe;IAC5C,MAAM,OAAO,GAAG,sBAAc,CAAC,MAAM,CAAA;IACrC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAEzC,MAAM,OAAO,GACX,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC3C,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC1E,MAAM,KAAK,GACT,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAC5B,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS;QACxD,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,CAAA;IAEb,OAAO,GAAG,KAAK,MAAM,IAAI,GAAG,IAAI,EAAE,CAAA;AACpC,CAAC","sourcesContent":["import { InvalidDidError } from '../did-error.js'\nimport { Did, assertDidMsid } from '../did.js'\n\nexport const DID_WEB_PREFIX = `did:web:` satisfies Did<'web'>\n\nconst canParse =\n URL.canParse?.bind(URL) ??\n ((url, base) => {\n try {\n new URL(url, base)\n return true\n } catch {\n return false\n }\n })\n\n/**\n * This function checks if the input is a valid Web DID, as per DID spec.\n */\nexport function isDidWeb(input: unknown): input is Did<'web'> {\n // Optimization: make cheap checks first\n if (typeof input !== 'string') return false\n if (!input.startsWith(DID_WEB_PREFIX)) return false\n if (input.charAt(DID_WEB_PREFIX.length) === ':') return false\n\n try {\n assertDidMsid(input, DID_WEB_PREFIX.length)\n } catch {\n return false\n }\n\n return canParse(buildDidWebUrl(input as Did<'web'>))\n}\n\nexport function asDidWeb<T>(input: T) {\n assertDidWeb(input)\n return input\n}\n\nexport function assertDidWeb(input: unknown): asserts input is Did<'web'> {\n if (typeof input !== 'string') {\n throw new InvalidDidError(typeof input, `DID must be a string`)\n }\n\n if (!input.startsWith(DID_WEB_PREFIX)) {\n throw new InvalidDidError(input, `Invalid did:web prefix`)\n }\n\n if (input.charAt(DID_WEB_PREFIX.length) === ':') {\n throw new InvalidDidError(input, 'did:web MSID must not start with a colon')\n }\n\n // Make sure every char is valid (per DID spec)\n assertDidMsid(input, DID_WEB_PREFIX.length)\n\n if (!canParse(buildDidWebUrl(input as Did<'web'>))) {\n throw new InvalidDidError(input, 'Invalid Web DID')\n }\n}\n\nexport function didWebToUrl(did: Did<'web'>) {\n try {\n return new URL(buildDidWebUrl(did)) as URL & {\n protocol: 'http:' | 'https:'\n }\n } catch (cause) {\n throw new InvalidDidError(did, 'Invalid Web DID', cause)\n }\n}\n\nexport function urlToDidWeb(url: URL): Did<'web'> {\n const port = url.port ? `%3A${url.port}` : ''\n const path = url.pathname === '/' ? '' : url.pathname.replaceAll('/', ':')\n\n return `did:web:${url.hostname}${port}${path}`\n}\n\nexport function buildDidWebUrl(did: Did<'web'>): string {\n const hostIdx = DID_WEB_PREFIX.length\n const pathIdx = did.indexOf(':', hostIdx)\n\n const hostEnc =\n pathIdx === -1 ? did.slice(hostIdx) : did.slice(hostIdx, pathIdx)\n const host = hostEnc.replaceAll('%3A', ':')\n const path = pathIdx === -1 ? '' : did.slice(pathIdx).replaceAll(':', '/')\n const proto =\n host.startsWith('localhost') &&\n (host.length === 9 || host.charCodeAt(9) === 58) /* ':' */\n ? 'http'\n : 'https'\n\n return `${proto}://${host}${path}`\n}\n"]}
|
package/dist/methods.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAgC;AAChC,mDAAgC"}
|
|
1
|
+
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAgC;AAChC,mDAAgC","sourcesContent":["export * from './methods/plc.js'\nexport * from './methods/web.js'\n"]}
|
package/package.json
CHANGED
package/src/atproto.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
2
|
import { InvalidDidError } from './did-error.js'
|
|
3
3
|
import { Did } from './did.js'
|
|
4
|
+
import { isFragment } from './lib/uri.js'
|
|
4
5
|
import {
|
|
5
6
|
DID_PLC_PREFIX,
|
|
6
7
|
DID_WEB_PREFIX,
|
|
7
8
|
assertDidPlc,
|
|
8
9
|
assertDidWeb,
|
|
9
10
|
isDidPlc,
|
|
11
|
+
isDidWeb,
|
|
10
12
|
} from './methods.js'
|
|
11
13
|
|
|
12
14
|
// This file contains atproto-specific DID validation utilities.
|
|
@@ -19,21 +21,10 @@ export const atprotoDidSchema = z
|
|
|
19
21
|
.refine(isAtprotoDid, `Atproto only allows "plc" and "web" DID methods`)
|
|
20
22
|
|
|
21
23
|
export function isAtprotoDid(input: unknown): input is AtprotoDid {
|
|
22
|
-
|
|
23
|
-
// return isDidPlc(input) || isAtprotoDidWeb(input)
|
|
24
|
-
|
|
25
|
-
if (typeof input !== 'string') {
|
|
26
|
-
return false
|
|
27
|
-
} else if (input.startsWith(DID_PLC_PREFIX)) {
|
|
28
|
-
return isDidPlc(input)
|
|
29
|
-
} else if (input.startsWith(DID_WEB_PREFIX)) {
|
|
30
|
-
return isAtprotoDidWeb(input)
|
|
31
|
-
} else {
|
|
32
|
-
return false
|
|
33
|
-
}
|
|
24
|
+
return isDidPlc(input) || isAtprotoDidWeb(input)
|
|
34
25
|
}
|
|
35
26
|
|
|
36
|
-
export function asAtprotoDid(input:
|
|
27
|
+
export function asAtprotoDid<T>(input: T) {
|
|
37
28
|
assertAtprotoDid(input)
|
|
38
29
|
return input
|
|
39
30
|
}
|
|
@@ -58,17 +49,14 @@ export function assertAtprotoDidWeb(
|
|
|
58
49
|
): asserts input is Did<'web'> {
|
|
59
50
|
assertDidWeb(input)
|
|
60
51
|
|
|
61
|
-
if (input
|
|
52
|
+
if (isDidWebWithPath(input)) {
|
|
62
53
|
throw new InvalidDidError(
|
|
63
54
|
input,
|
|
64
55
|
`Atproto does not allow path components in Web DIDs`,
|
|
65
56
|
)
|
|
66
57
|
}
|
|
67
58
|
|
|
68
|
-
if (
|
|
69
|
-
input.includes('%3A', DID_WEB_PREFIX.length) &&
|
|
70
|
-
!input.startsWith('did:web:localhost%3A')
|
|
71
|
-
) {
|
|
59
|
+
if (isDidWebWithHttpsPort(input)) {
|
|
72
60
|
throw new InvalidDidError(
|
|
73
61
|
input,
|
|
74
62
|
`Atproto does not allow port numbers in Web DIDs, except for localhost`,
|
|
@@ -80,10 +68,57 @@ export function assertAtprotoDidWeb(
|
|
|
80
68
|
* @see {@link https://atproto.com/specs/did#blessed-did-methods}
|
|
81
69
|
*/
|
|
82
70
|
export function isAtprotoDidWeb(input: unknown): input is Did<'web'> {
|
|
83
|
-
|
|
84
|
-
assertAtprotoDidWeb(input)
|
|
85
|
-
return true
|
|
86
|
-
} catch {
|
|
71
|
+
if (!isDidWeb(input)) {
|
|
87
72
|
return false
|
|
88
73
|
}
|
|
74
|
+
|
|
75
|
+
if (isDidWebWithPath(input)) {
|
|
76
|
+
return false
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (isDidWebWithHttpsPort(input)) {
|
|
80
|
+
return false
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return true
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function isDidWebWithPath(did: Did<'web'>): boolean {
|
|
87
|
+
return did.includes(':', DID_WEB_PREFIX.length)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function isLocalhostDid(did: Did<'web'>): boolean {
|
|
91
|
+
return (
|
|
92
|
+
did === 'did:web:localhost' ||
|
|
93
|
+
did.startsWith('did:web:localhost:') ||
|
|
94
|
+
did.startsWith('did:web:localhost%3A')
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function isDidWebWithHttpsPort(did: Did<'web'>): boolean {
|
|
99
|
+
if (isLocalhostDid(did)) return false
|
|
100
|
+
|
|
101
|
+
const pathIdx = did.indexOf(':', DID_WEB_PREFIX.length)
|
|
102
|
+
|
|
103
|
+
const hasPort =
|
|
104
|
+
pathIdx === -1
|
|
105
|
+
? // No path component, check if there's a port separator anywhere after
|
|
106
|
+
// the "did:web:" prefix
|
|
107
|
+
did.includes('%3A', DID_WEB_PREFIX.length)
|
|
108
|
+
: // There is a path component; if there is an encoded colon *before* it,
|
|
109
|
+
// then there is a port number
|
|
110
|
+
did.lastIndexOf('%3A', pathIdx) !== -1
|
|
111
|
+
|
|
112
|
+
return hasPort
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export type AtprotoAudience = `${AtprotoDid}#${string}`
|
|
116
|
+
export const isAtprotoAudience = (value: unknown): value is AtprotoAudience => {
|
|
117
|
+
if (typeof value !== 'string') return false
|
|
118
|
+
const hashIndex = value.indexOf('#')
|
|
119
|
+
if (hashIndex === -1) return false
|
|
120
|
+
if (value.indexOf('#', hashIndex + 1) !== -1) return false
|
|
121
|
+
return (
|
|
122
|
+
isFragment(value, hashIndex + 1) && isAtprotoDid(value.slice(0, hashIndex))
|
|
123
|
+
)
|
|
89
124
|
}
|
package/src/did-document.ts
CHANGED
|
@@ -1,28 +1,38 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
2
|
import { Did, didSchema } from './did.js'
|
|
3
|
+
import { isFragment } from './lib/uri.js'
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* RFC3968 compliant URI
|
|
6
7
|
*
|
|
7
8
|
* @see {@link https://www.rfc-editor.org/rfc/rfc3986}
|
|
8
9
|
*/
|
|
9
|
-
const rfc3968UriSchema = z.string().
|
|
10
|
-
try {
|
|
11
|
-
new URL(data)
|
|
12
|
-
return true
|
|
13
|
-
} catch {
|
|
14
|
-
return false
|
|
15
|
-
}
|
|
16
|
-
}, 'RFC3968 compliant URI')
|
|
10
|
+
const rfc3968UriSchema = z.string().url('RFC3968 compliant URI')
|
|
17
11
|
|
|
18
12
|
const didControllerSchema = z.union([didSchema, z.array(didSchema)])
|
|
19
13
|
|
|
20
14
|
/**
|
|
21
|
-
* @note this schema
|
|
15
|
+
* @note this schema is too permissive
|
|
22
16
|
*/
|
|
23
17
|
const didRelativeUriSchema = z.union([
|
|
24
|
-
rfc3968UriSchema
|
|
25
|
-
|
|
18
|
+
rfc3968UriSchema.refine(
|
|
19
|
+
(value) => {
|
|
20
|
+
const fragmentIndex = value.indexOf('#')
|
|
21
|
+
if (fragmentIndex === -1) return false
|
|
22
|
+
return isFragment(value, fragmentIndex + 1)
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
message: 'Missing or invalid fragment in RFC3968 URI',
|
|
26
|
+
},
|
|
27
|
+
),
|
|
28
|
+
z
|
|
29
|
+
.string()
|
|
30
|
+
.refine((value) => value.charCodeAt(0) === 35 /* # */, {
|
|
31
|
+
message: 'Fragment must start with #',
|
|
32
|
+
})
|
|
33
|
+
.refine((value) => isFragment(value, 1), {
|
|
34
|
+
message: 'Invalid char in URI fragment',
|
|
35
|
+
}),
|
|
26
36
|
])
|
|
27
37
|
|
|
28
38
|
const didVerificationMethodSchema = z.object({
|
package/src/did.ts
CHANGED
package/src/lib/uri.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @see {@link https://www.w3.org/TR/did-1.0/#dfn-did-fragments}
|
|
3
|
+
* @see {@link https://datatracker.ietf.org/doc/html/rfc3986#section-3.5}
|
|
4
|
+
*/
|
|
5
|
+
export function isFragment(
|
|
6
|
+
value: string,
|
|
7
|
+
startIdx = 0,
|
|
8
|
+
endIdx = value.length,
|
|
9
|
+
): boolean {
|
|
10
|
+
let charCode: number
|
|
11
|
+
for (let i = startIdx; i < endIdx; i++) {
|
|
12
|
+
charCode = value.charCodeAt(i)
|
|
13
|
+
|
|
14
|
+
// fragment = *( pchar / "/" / "?" )
|
|
15
|
+
// pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
|
|
16
|
+
// unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
|
|
17
|
+
// pct-encoded = "%" HEXDIG HEXDIG
|
|
18
|
+
// sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
|
|
19
|
+
if (
|
|
20
|
+
(charCode >= 65 /* A */ && charCode <= 90) /* Z */ ||
|
|
21
|
+
(charCode >= 97 /* a */ && charCode <= 122) /* z */ ||
|
|
22
|
+
(charCode >= 48 /* 0 */ && charCode <= 57) /* 9 */ ||
|
|
23
|
+
charCode === 45 /* "-" */ ||
|
|
24
|
+
charCode === 46 /* "." */ ||
|
|
25
|
+
charCode === 95 /* "_" */ ||
|
|
26
|
+
charCode === 126 /* "~" */
|
|
27
|
+
) {
|
|
28
|
+
// unreserved
|
|
29
|
+
} else if (
|
|
30
|
+
charCode === 33 /* "!" */ ||
|
|
31
|
+
charCode === 36 /* "$" */ ||
|
|
32
|
+
charCode === 38 /* "&" */ ||
|
|
33
|
+
charCode === 39 /* "'" */ ||
|
|
34
|
+
charCode === 40 /* "(" */ ||
|
|
35
|
+
charCode === 41 /* ")" */ ||
|
|
36
|
+
charCode === 42 /* "*" */ ||
|
|
37
|
+
charCode === 43 /* "+" */ ||
|
|
38
|
+
charCode === 44 /* "," */ ||
|
|
39
|
+
charCode === 59 /* ";" */ ||
|
|
40
|
+
charCode === 61 /* "=" */
|
|
41
|
+
) {
|
|
42
|
+
// sub-delims
|
|
43
|
+
} else if (charCode === 58 /* ":" */ || charCode === 64 /* "@" */) {
|
|
44
|
+
// pchar extra
|
|
45
|
+
} else if (charCode === 47 /* "/" */ || charCode === 63 /* "?" */) {
|
|
46
|
+
// fragment extra
|
|
47
|
+
} else if (charCode === 37 /* "%" */) {
|
|
48
|
+
// pct-enc
|
|
49
|
+
if (i + 2 >= endIdx) return false
|
|
50
|
+
if (!isHexDigit(value.charCodeAt(i + 1))) return false
|
|
51
|
+
if (!isHexDigit(value.charCodeAt(i + 2))) return false
|
|
52
|
+
i += 2
|
|
53
|
+
} else {
|
|
54
|
+
return false
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return true
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function isHexDigit(code: number): boolean {
|
|
62
|
+
return (
|
|
63
|
+
(code >= 48 && code <= 57) || // 0-9
|
|
64
|
+
(code >= 65 && code <= 70) || // A-F
|
|
65
|
+
(code >= 97 && code <= 102) // a-f
|
|
66
|
+
)
|
|
67
|
+
}
|
package/src/methods/plc.ts
CHANGED
package/src/methods/web.ts
CHANGED
|
@@ -3,6 +3,17 @@ import { Did, assertDidMsid } from '../did.js'
|
|
|
3
3
|
|
|
4
4
|
export const DID_WEB_PREFIX = `did:web:` satisfies Did<'web'>
|
|
5
5
|
|
|
6
|
+
const canParse =
|
|
7
|
+
URL.canParse?.bind(URL) ??
|
|
8
|
+
((url, base) => {
|
|
9
|
+
try {
|
|
10
|
+
new URL(url, base)
|
|
11
|
+
return true
|
|
12
|
+
} catch {
|
|
13
|
+
return false
|
|
14
|
+
}
|
|
15
|
+
})
|
|
16
|
+
|
|
6
17
|
/**
|
|
7
18
|
* This function checks if the input is a valid Web DID, as per DID spec.
|
|
8
19
|
*/
|
|
@@ -13,14 +24,15 @@ export function isDidWeb(input: unknown): input is Did<'web'> {
|
|
|
13
24
|
if (input.charAt(DID_WEB_PREFIX.length) === ':') return false
|
|
14
25
|
|
|
15
26
|
try {
|
|
16
|
-
|
|
17
|
-
return true
|
|
27
|
+
assertDidMsid(input, DID_WEB_PREFIX.length)
|
|
18
28
|
} catch {
|
|
19
29
|
return false
|
|
20
30
|
}
|
|
31
|
+
|
|
32
|
+
return canParse(buildDidWebUrl(input as Did<'web'>))
|
|
21
33
|
}
|
|
22
34
|
|
|
23
|
-
export function asDidWeb(input:
|
|
35
|
+
export function asDidWeb<T>(input: T) {
|
|
24
36
|
assertDidWeb(input)
|
|
25
37
|
return input
|
|
26
38
|
}
|
|
@@ -38,27 +50,19 @@ export function assertDidWeb(input: unknown): asserts input is Did<'web'> {
|
|
|
38
50
|
throw new InvalidDidError(input, 'did:web MSID must not start with a colon')
|
|
39
51
|
}
|
|
40
52
|
|
|
41
|
-
void didWebToUrl(input as Did<'web'>)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function didWebToUrl(did: Did<'web'>) {
|
|
45
53
|
// Make sure every char is valid (per DID spec)
|
|
46
|
-
assertDidMsid(
|
|
47
|
-
|
|
48
|
-
const hostIdx = DID_WEB_PREFIX.length
|
|
49
|
-
const pathIdx = did.indexOf(':', hostIdx)
|
|
54
|
+
assertDidMsid(input, DID_WEB_PREFIX.length)
|
|
50
55
|
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
if (!canParse(buildDidWebUrl(input as Did<'web'>))) {
|
|
57
|
+
throw new InvalidDidError(input, 'Invalid Web DID')
|
|
58
|
+
}
|
|
59
|
+
}
|
|
53
60
|
|
|
61
|
+
export function didWebToUrl(did: Did<'web'>) {
|
|
54
62
|
try {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
) as URL & { protocol: 'http:' | 'https:' }
|
|
58
|
-
if (url.hostname === 'localhost') {
|
|
59
|
-
url.protocol = 'http:'
|
|
63
|
+
return new URL(buildDidWebUrl(did)) as URL & {
|
|
64
|
+
protocol: 'http:' | 'https:'
|
|
60
65
|
}
|
|
61
|
-
return url
|
|
62
66
|
} catch (cause) {
|
|
63
67
|
throw new InvalidDidError(did, 'Invalid Web DID', cause)
|
|
64
68
|
}
|
|
@@ -70,3 +74,20 @@ export function urlToDidWeb(url: URL): Did<'web'> {
|
|
|
70
74
|
|
|
71
75
|
return `did:web:${url.hostname}${port}${path}`
|
|
72
76
|
}
|
|
77
|
+
|
|
78
|
+
export function buildDidWebUrl(did: Did<'web'>): string {
|
|
79
|
+
const hostIdx = DID_WEB_PREFIX.length
|
|
80
|
+
const pathIdx = did.indexOf(':', hostIdx)
|
|
81
|
+
|
|
82
|
+
const hostEnc =
|
|
83
|
+
pathIdx === -1 ? did.slice(hostIdx) : did.slice(hostIdx, pathIdx)
|
|
84
|
+
const host = hostEnc.replaceAll('%3A', ':')
|
|
85
|
+
const path = pathIdx === -1 ? '' : did.slice(pathIdx).replaceAll(':', '/')
|
|
86
|
+
const proto =
|
|
87
|
+
host.startsWith('localhost') &&
|
|
88
|
+
(host.length === 9 || host.charCodeAt(9) === 58) /* ':' */
|
|
89
|
+
? 'http'
|
|
90
|
+
: 'https'
|
|
91
|
+
|
|
92
|
+
return `${proto}://${host}${path}`
|
|
93
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["./src/atproto.ts","./src/did-document.ts","./src/did-error.ts","./src/did.ts","./src/index.ts","./src/methods.ts","./src/methods/plc.ts","./src/methods/web.ts"],"version":"5.
|
|
1
|
+
{"root":["./src/atproto.ts","./src/did-document.ts","./src/did-error.ts","./src/did.ts","./src/index.ts","./src/methods.ts","./src/lib/uri.ts","./src/methods/plc.ts","./src/methods/web.ts"],"version":"5.8.2"}
|