@atproto/did 0.1.3 → 0.1.5
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 +12 -0
- package/dist/atproto.d.ts.map +1 -1
- package/dist/atproto.js.map +1 -1
- package/dist/did-document.d.ts.map +1 -1
- package/dist/did-document.js.map +1 -1
- package/dist/methods/plc.js +3 -3
- package/dist/methods/plc.js.map +1 -1
- package/dist/methods/web.d.ts +3 -1
- package/dist/methods/web.d.ts.map +1 -1
- package/dist/methods/web.js +19 -14
- package/dist/methods/web.js.map +1 -1
- package/jest.config.js +13 -0
- package/package.json +5 -2
- package/src/atproto.ts +2 -3
- package/src/did-document.ts +0 -1
- package/src/methods/plc.ts +4 -4
- package/src/methods/web.ts +23 -17
- package/tests/methods/plc.test.ts +72 -0
- package/tests/methods/web.test.ts +109 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @atproto/did
|
|
2
2
|
|
|
3
|
+
## 0.1.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#3220](https://github.com/bluesky-social/atproto/pull/3220) [`61dc0d60e`](https://github.com/bluesky-social/atproto/commit/61dc0d60e19b88c6427a54c6d95a391b5f4da7bd) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Apply new linting rules regarding import order
|
|
8
|
+
|
|
9
|
+
## 0.1.4
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [#3454](https://github.com/bluesky-social/atproto/pull/3454) [`cc2a1222b`](https://github.com/bluesky-social/atproto/commit/cc2a1222bd2b8ddd70d70dad174c1c63246a2d87) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Fix encoding and decoding of did:web
|
|
14
|
+
|
|
3
15
|
## 0.1.3
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
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;
|
|
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;AAW9B,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,CAahE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAGvD;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,CAmB7B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAOnE"}
|
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":";;;AAoBA,oCAaC;AAED,oCAGC;AAED,4CAaC;AAED,kDAqBC;AAKD,0CAOC;AAxFD,6BAAuB;AACvB,iDAAgD;AAEhD,6CAMqB;AAOR,QAAA,gBAAgB,GAAG,OAAC;KAC9B,MAAM,EAAE;KACR,MAAM,CAAC,YAAY,EAAE,iDAAiD,CAAC,CAAA;AAE1E,SAAgB,YAAY,CAAC,KAAc;IACzC,2BAA2B;IAC3B,mDAAmD;IAEnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,IAAI,KAAK,CAAC,UAAU,CAAC,2BAAc,CAAC,EAAE,CAAC;QAC5C,OAAO,IAAA,qBAAQ,EAAC,KAAK,CAAC,CAAA;IACxB,CAAC;SAAM,IAAI,KAAK,CAAC,UAAU,CAAC,2BAAc,CAAC,EAAE,CAAC;QAC5C,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;SAAM,CAAC;QACN,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,KAAc;IACzC,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACvB,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,8BAAe,CAAC,OAAO,KAAK,EAAE,sBAAsB,CAAC,CAAA;IACjE,CAAC;SAAM,IAAI,KAAK,CAAC,UAAU,CAAC,2BAAc,CAAC,EAAE,CAAC;QAC5C,IAAA,yBAAY,EAAC,KAAK,CAAC,CAAA;IACrB,CAAC;SAAM,IAAI,KAAK,CAAC,UAAU,CAAC,2BAAc,CAAC,EAAE,CAAC;QAC5C,mBAAmB,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,8BAAe,CACvB,KAAK,EACL,iDAAiD,CAClD,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CACjC,KAAc;IAEd,IAAA,yBAAY,EAAC,KAAK,CAAC,CAAA;IAEnB,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,2BAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,8BAAe,CACvB,KAAK,EACL,oDAAoD,CACrD,CAAA;IACH,CAAC;IAED,IACE,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,2BAAc,CAAC,MAAM,CAAC;QAC5C,CAAC,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC,EACzC,CAAC;QACD,MAAM,IAAI,8BAAe,CACvB,KAAK,EACL,uEAAuE,CACxE,CAAA;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAc;IAC5C,IAAI,CAAC;QACH,mBAAmB,CAAC,KAAK,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
|
|
@@ -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;
|
|
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;AAqEzC;;;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.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did-document.js","sourceRoot":"","sources":["../src/did-document.ts"],"names":[],"mappings":";;;AAAA,6BAAuB;
|
|
1
|
+
{"version":3,"file":"did-document.js","sourceRoot":"","sources":["../src/did-document.ts"],"names":[],"mappings":"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"}
|
package/dist/methods/plc.js
CHANGED
|
@@ -31,12 +31,12 @@ function assertDidPlc(input) {
|
|
|
31
31
|
if (typeof input !== 'string') {
|
|
32
32
|
throw new did_error_js_1.InvalidDidError(typeof input, `DID must be a string`);
|
|
33
33
|
}
|
|
34
|
-
if (input.length !== DID_PLC_LENGTH) {
|
|
35
|
-
throw new did_error_js_1.InvalidDidError(input, `did:plc must be ${DID_PLC_LENGTH} characters long`);
|
|
36
|
-
}
|
|
37
34
|
if (!input.startsWith(DID_PLC_PREFIX)) {
|
|
38
35
|
throw new did_error_js_1.InvalidDidError(input, `Invalid did:plc prefix`);
|
|
39
36
|
}
|
|
37
|
+
if (input.length !== DID_PLC_LENGTH) {
|
|
38
|
+
throw new did_error_js_1.InvalidDidError(input, `did:plc must be ${DID_PLC_LENGTH} characters long`);
|
|
39
|
+
}
|
|
40
40
|
// The following check is not necessary, as the check below is more strict:
|
|
41
41
|
// assertDidMsid(input, DID_PLC_PREFIX.length)
|
|
42
42
|
for (let i = DID_PLC_PREFIX_LENGTH; i < DID_PLC_LENGTH; i++) {
|
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,CAAC,KAAc;IACrC,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,KAAK,CAAC,
|
|
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,CAAC,KAAc;IACrC,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"}
|
package/dist/methods/web.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export declare const DID_WEB_PREFIX = "did:web:";
|
|
|
6
6
|
export declare function isDidWeb(input: unknown): input is Did<'web'>;
|
|
7
7
|
export declare function asDidWeb(input: unknown): Did<'web'>;
|
|
8
8
|
export declare function assertDidWeb(input: unknown): asserts input is Did<'web'>;
|
|
9
|
-
export declare function didWebToUrl(did:
|
|
9
|
+
export declare function didWebToUrl(did: Did<'web'>): URL & {
|
|
10
|
+
protocol: "http:" | "https:";
|
|
11
|
+
};
|
|
10
12
|
export declare function urlToDidWeb(url: URL): Did<'web'>;
|
|
11
13
|
//# 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;AAE7D;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,
|
|
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;AAE7D;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAY5D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAGnD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAcxE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC;cAahB,OAAO,GAAG,QAAQ;EAQ5C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAKhD"}
|
package/dist/methods/web.js
CHANGED
|
@@ -16,8 +16,12 @@ function isDidWeb(input) {
|
|
|
16
16
|
// Optimization: make cheap checks first
|
|
17
17
|
if (typeof input !== 'string')
|
|
18
18
|
return false;
|
|
19
|
+
if (!input.startsWith(exports.DID_WEB_PREFIX))
|
|
20
|
+
return false;
|
|
21
|
+
if (input.charAt(exports.DID_WEB_PREFIX.length) === ':')
|
|
22
|
+
return false;
|
|
19
23
|
try {
|
|
20
|
-
|
|
24
|
+
didWebToUrl(input);
|
|
21
25
|
return true;
|
|
22
26
|
}
|
|
23
27
|
catch {
|
|
@@ -32,21 +36,23 @@ function assertDidWeb(input) {
|
|
|
32
36
|
if (typeof input !== 'string') {
|
|
33
37
|
throw new did_error_js_1.InvalidDidError(typeof input, `DID must be a string`);
|
|
34
38
|
}
|
|
39
|
+
if (!input.startsWith(exports.DID_WEB_PREFIX)) {
|
|
40
|
+
throw new did_error_js_1.InvalidDidError(input, `Invalid did:web prefix`);
|
|
41
|
+
}
|
|
42
|
+
if (input.charAt(exports.DID_WEB_PREFIX.length) === ':') {
|
|
43
|
+
throw new did_error_js_1.InvalidDidError(input, 'did:web MSID must not start with a colon');
|
|
44
|
+
}
|
|
35
45
|
void didWebToUrl(input);
|
|
36
46
|
}
|
|
37
47
|
function didWebToUrl(did) {
|
|
38
|
-
if (!did.startsWith(exports.DID_WEB_PREFIX)) {
|
|
39
|
-
throw new did_error_js_1.InvalidDidError(did, `did:web must start with ${exports.DID_WEB_PREFIX}`);
|
|
40
|
-
}
|
|
41
|
-
if (did.charAt(exports.DID_WEB_PREFIX.length) === ':') {
|
|
42
|
-
throw new did_error_js_1.InvalidDidError(did, 'did:web MSID must not start with a colon');
|
|
43
|
-
}
|
|
44
48
|
// Make sure every char is valid (per DID spec)
|
|
45
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);
|
|
46
54
|
try {
|
|
47
|
-
const
|
|
48
|
-
const parts = msid.split(':').map(decodeURIComponent);
|
|
49
|
-
const url = new URL(`https://${parts.join('/')}`);
|
|
55
|
+
const url = new URL(`https://${host.replaceAll('%3A', ':')}${path.replaceAll(':', '/')}`);
|
|
50
56
|
if (url.hostname === 'localhost') {
|
|
51
57
|
url.protocol = 'http:';
|
|
52
58
|
}
|
|
@@ -57,9 +63,8 @@ function didWebToUrl(did) {
|
|
|
57
63
|
}
|
|
58
64
|
}
|
|
59
65
|
function urlToDidWeb(url) {
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
return `did:web:${encodeURIComponent(url.host)}${path ? `:${path}` : ''}`;
|
|
66
|
+
const port = url.port ? `%3A${url.port}` : '';
|
|
67
|
+
const path = url.pathname === '/' ? '' : url.pathname.replaceAll('/', ':');
|
|
68
|
+
return `did:web:${url.hostname}${port}${path}`;
|
|
64
69
|
}
|
|
65
70
|
//# 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":";;;AAQA,
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/methods/web.ts"],"names":[],"mappings":"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"}
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** @type {import('jest').Config} */
|
|
2
|
+
module.exports = {
|
|
3
|
+
displayName: 'PDS',
|
|
4
|
+
transform: { '^.+\\.(t|j)s$': '@swc/jest' },
|
|
5
|
+
// Jest requires all ESM dependencies to be transpiled (even if they are
|
|
6
|
+
// dynamically import()ed).
|
|
7
|
+
transformIgnorePatterns: [
|
|
8
|
+
`/node_modules/.pnpm/(?!(get-port|lande|toygrad)@)`,
|
|
9
|
+
],
|
|
10
|
+
testTimeout: 60000,
|
|
11
|
+
setupFiles: ['<rootDir>/../../jest.setup.ts'],
|
|
12
|
+
moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] },
|
|
13
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/did",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "DID resolution and verification library",
|
|
6
6
|
"keywords": [
|
|
@@ -28,9 +28,12 @@
|
|
|
28
28
|
"zod": "^3.23.8"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
+
"@swc/jest": "^0.2.24",
|
|
32
|
+
"jest": "^28.1.2",
|
|
31
33
|
"typescript": "^5.6.3"
|
|
32
34
|
},
|
|
33
35
|
"scripts": {
|
|
34
|
-
"build": "tsc --build tsconfig.build.json"
|
|
36
|
+
"build": "tsc --build tsconfig.build.json",
|
|
37
|
+
"test": "jest"
|
|
35
38
|
}
|
|
36
39
|
}
|
package/src/atproto.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
|
-
|
|
3
2
|
import { InvalidDidError } from './did-error.js'
|
|
4
3
|
import { Did } from './did.js'
|
|
5
4
|
import {
|
|
6
|
-
assertDidPlc,
|
|
7
|
-
assertDidWeb,
|
|
8
5
|
DID_PLC_PREFIX,
|
|
9
6
|
DID_WEB_PREFIX,
|
|
7
|
+
assertDidPlc,
|
|
8
|
+
assertDidWeb,
|
|
10
9
|
isDidPlc,
|
|
11
10
|
} from './methods.js'
|
|
12
11
|
|
package/src/did-document.ts
CHANGED
package/src/methods/plc.ts
CHANGED
|
@@ -28,6 +28,10 @@ export function assertDidPlc(input: unknown): asserts input is Did<'plc'> {
|
|
|
28
28
|
throw new InvalidDidError(typeof input, `DID must be a string`)
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
if (!input.startsWith(DID_PLC_PREFIX)) {
|
|
32
|
+
throw new InvalidDidError(input, `Invalid did:plc prefix`)
|
|
33
|
+
}
|
|
34
|
+
|
|
31
35
|
if (input.length !== DID_PLC_LENGTH) {
|
|
32
36
|
throw new InvalidDidError(
|
|
33
37
|
input,
|
|
@@ -35,10 +39,6 @@ export function assertDidPlc(input: unknown): asserts input is Did<'plc'> {
|
|
|
35
39
|
)
|
|
36
40
|
}
|
|
37
41
|
|
|
38
|
-
if (!input.startsWith(DID_PLC_PREFIX)) {
|
|
39
|
-
throw new InvalidDidError(input, `Invalid did:plc prefix`)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
42
|
// The following check is not necessary, as the check below is more strict:
|
|
43
43
|
|
|
44
44
|
// assertDidMsid(input, DID_PLC_PREFIX.length)
|
package/src/methods/web.ts
CHANGED
|
@@ -9,9 +9,11 @@ export const DID_WEB_PREFIX = `did:web:` satisfies Did<'web'>
|
|
|
9
9
|
export function isDidWeb(input: unknown): input is Did<'web'> {
|
|
10
10
|
// Optimization: make cheap checks first
|
|
11
11
|
if (typeof input !== 'string') return false
|
|
12
|
+
if (!input.startsWith(DID_WEB_PREFIX)) return false
|
|
13
|
+
if (input.charAt(DID_WEB_PREFIX.length) === ':') return false
|
|
12
14
|
|
|
13
15
|
try {
|
|
14
|
-
|
|
16
|
+
didWebToUrl(input as Did<'web'>)
|
|
15
17
|
return true
|
|
16
18
|
} catch {
|
|
17
19
|
return false
|
|
@@ -28,25 +30,31 @@ export function assertDidWeb(input: unknown): asserts input is Did<'web'> {
|
|
|
28
30
|
throw new InvalidDidError(typeof input, `DID must be a string`)
|
|
29
31
|
}
|
|
30
32
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
export function didWebToUrl(did: string): URL {
|
|
35
|
-
if (!did.startsWith(DID_WEB_PREFIX)) {
|
|
36
|
-
throw new InvalidDidError(did, `did:web must start with ${DID_WEB_PREFIX}`)
|
|
33
|
+
if (!input.startsWith(DID_WEB_PREFIX)) {
|
|
34
|
+
throw new InvalidDidError(input, `Invalid did:web prefix`)
|
|
37
35
|
}
|
|
38
36
|
|
|
39
|
-
if (
|
|
40
|
-
throw new InvalidDidError(
|
|
37
|
+
if (input.charAt(DID_WEB_PREFIX.length) === ':') {
|
|
38
|
+
throw new InvalidDidError(input, 'did:web MSID must not start with a colon')
|
|
41
39
|
}
|
|
42
40
|
|
|
41
|
+
void didWebToUrl(input as Did<'web'>)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function didWebToUrl(did: Did<'web'>) {
|
|
43
45
|
// Make sure every char is valid (per DID spec)
|
|
44
46
|
assertDidMsid(did, DID_WEB_PREFIX.length)
|
|
45
47
|
|
|
48
|
+
const hostIdx = DID_WEB_PREFIX.length
|
|
49
|
+
const pathIdx = did.indexOf(':', hostIdx)
|
|
50
|
+
|
|
51
|
+
const host = pathIdx === -1 ? did.slice(hostIdx) : did.slice(hostIdx, pathIdx)
|
|
52
|
+
const path = pathIdx === -1 ? '' : did.slice(pathIdx)
|
|
53
|
+
|
|
46
54
|
try {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
55
|
+
const url = new URL(
|
|
56
|
+
`https://${host.replaceAll('%3A', ':')}${path.replaceAll(':', '/')}`,
|
|
57
|
+
) as URL & { protocol: 'http:' | 'https:' }
|
|
50
58
|
if (url.hostname === 'localhost') {
|
|
51
59
|
url.protocol = 'http:'
|
|
52
60
|
}
|
|
@@ -57,10 +65,8 @@ export function didWebToUrl(did: string): URL {
|
|
|
57
65
|
}
|
|
58
66
|
|
|
59
67
|
export function urlToDidWeb(url: URL): Did<'web'> {
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
? ''
|
|
63
|
-
: url.pathname.slice(1).split('/').map(encodeURIComponent).join(':')
|
|
68
|
+
const port = url.port ? `%3A${url.port}` : ''
|
|
69
|
+
const path = url.pathname === '/' ? '' : url.pathname.replaceAll('/', ':')
|
|
64
70
|
|
|
65
|
-
return `did:web:${
|
|
71
|
+
return `did:web:${url.hostname}${port}${path}`
|
|
66
72
|
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { InvalidDidError } from '../../src/did-error.js'
|
|
2
|
+
import { Did } from '../../src/did.js'
|
|
3
|
+
import { asDidPlc, assertDidPlc, isDidPlc } from '../../src/methods/plc.js'
|
|
4
|
+
|
|
5
|
+
const VALID: Did<'plc'>[] = [
|
|
6
|
+
'did:plc:l3rouwludahu3ui3bt66mfvj',
|
|
7
|
+
'did:plc:aaaaaaaaaaaaaaaaaaaaaaaa',
|
|
8
|
+
'did:plc:zzzzzzzzzzzzzzzzzzzzzzzz',
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
const INVALID: [value: unknown, message: string][] = [
|
|
12
|
+
['did:plc:l3rouwludahu3ui3bt66mfv0', 'Invalid character at position 31'],
|
|
13
|
+
['did:plc:l3rouwludahu3ui3bt66mfv1', 'Invalid character at position 31'],
|
|
14
|
+
['did:plc:l3rouwludahu3ui3bt66mfv9', 'Invalid character at position 31'],
|
|
15
|
+
['did:plc:l3rouwludahu3ui3bt66mfv', 'did:plc must be 32 characters long'],
|
|
16
|
+
['did:plc:l3rouwludahu3ui3bt66mfvja', 'did:plc must be 32 characters long'],
|
|
17
|
+
['did:plc:example.com:', 'did:plc must be 32 characters long'],
|
|
18
|
+
['did:plc:exam%3Aple.com%3A8080', 'did:plc must be 32 characters long'],
|
|
19
|
+
[3, 'DID must be a string'],
|
|
20
|
+
[{ toString: () => 'did:plc:foo.com' }, 'DID must be a string'],
|
|
21
|
+
[[''], 'DID must be a string'],
|
|
22
|
+
['random-string', 'Invalid did:plc prefix'],
|
|
23
|
+
['did plc', 'Invalid did:plc prefix'],
|
|
24
|
+
['lorem ipsum dolor sit', 'Invalid did:plc prefix'],
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
describe('isDidPlc', () => {
|
|
28
|
+
it('returns true for various valid dids', () => {
|
|
29
|
+
for (const did of VALID) {
|
|
30
|
+
expect(isDidPlc(did)).toBe(true)
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
it('returns false for invalid dids', () => {
|
|
35
|
+
for (const [did] of INVALID) {
|
|
36
|
+
expect(isDidPlc(did)).toBe(false)
|
|
37
|
+
}
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
describe('assertDidPlc', () => {
|
|
42
|
+
it('does not throw on valid dids', () => {
|
|
43
|
+
for (const did of VALID) {
|
|
44
|
+
expect(() => assertDidPlc(did)).not.toThrow()
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
it('throws if called with non string argument', () => {
|
|
49
|
+
for (const [val, message] of INVALID) {
|
|
50
|
+
expect(() => assertDidPlc(val)).toThrowError(
|
|
51
|
+
new InvalidDidError(
|
|
52
|
+
typeof val === 'string' ? val : typeof val,
|
|
53
|
+
message,
|
|
54
|
+
),
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
describe('asDidPlc', () => {
|
|
61
|
+
it('returns the input for valid dids', () => {
|
|
62
|
+
for (const did of VALID) {
|
|
63
|
+
expect(asDidPlc(did)).toBe(did)
|
|
64
|
+
}
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it('throws if called with invalid dids', () => {
|
|
68
|
+
for (const [val] of INVALID) {
|
|
69
|
+
expect(() => asDidPlc(val)).toThrowError(InvalidDidError)
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
})
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { InvalidDidError } from '../../src/did-error.js'
|
|
2
|
+
import { Did } from '../../src/did.js'
|
|
3
|
+
import {
|
|
4
|
+
asDidWeb,
|
|
5
|
+
assertDidWeb,
|
|
6
|
+
didWebToUrl,
|
|
7
|
+
isDidWeb,
|
|
8
|
+
urlToDidWeb,
|
|
9
|
+
} from '../../src/methods/web.js'
|
|
10
|
+
|
|
11
|
+
const VALID: [Did<'web'>, string][] = [
|
|
12
|
+
['did:web:example.com', 'https://example.com/'],
|
|
13
|
+
['did:web:sub.example.com', 'https://sub.example.com/'],
|
|
14
|
+
['did:web:example.com%3A8080', 'https://example.com:8080/'],
|
|
15
|
+
[
|
|
16
|
+
'did:web:example.com:path:to:resource',
|
|
17
|
+
'https://example.com/path/to/resource',
|
|
18
|
+
],
|
|
19
|
+
[
|
|
20
|
+
'did:web:example.com%3A8080:path:to:resource',
|
|
21
|
+
'https://example.com:8080/path/to/resource',
|
|
22
|
+
],
|
|
23
|
+
[
|
|
24
|
+
'did:web:xn--b48h.com%3A8080:path:to:resource',
|
|
25
|
+
'https://🙃.com:8080/path/to/resource',
|
|
26
|
+
],
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
const INVALID: [value: unknown, message: string][] = [
|
|
30
|
+
['did:web:', 'DID method-specific id must not be empty'],
|
|
31
|
+
['did:web:foo@example.com', 'Disallowed character in DID at position 11'],
|
|
32
|
+
['did:web::example.com', 'did:web MSID must not start with a colon'],
|
|
33
|
+
['did:web:example.com:', 'DID cannot end with ":"'],
|
|
34
|
+
['did:web:exam%3Aple.com%3A8080', 'Invalid Web DID'],
|
|
35
|
+
[3, 'DID must be a string'],
|
|
36
|
+
[{ toString: () => 'did:web:foo.com' }, 'DID must be a string'],
|
|
37
|
+
[[''], 'DID must be a string'],
|
|
38
|
+
['random-string', 'Invalid did:web prefix'],
|
|
39
|
+
['did web', 'Invalid did:web prefix'],
|
|
40
|
+
['lorem ipsum dolor sit', 'Invalid did:web prefix'],
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
describe('isDidWeb', () => {
|
|
44
|
+
it('returns true for various valid dids', () => {
|
|
45
|
+
for (const [did] of VALID) {
|
|
46
|
+
expect(isDidWeb(did)).toBe(true)
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
it('returns false for invalid dids', () => {
|
|
51
|
+
for (const did of INVALID) {
|
|
52
|
+
expect(isDidWeb(did)).toBe(false)
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
describe('assertDidWeb', () => {
|
|
58
|
+
it('does not throw on valid dids', () => {
|
|
59
|
+
for (const [did] of VALID) {
|
|
60
|
+
expect(() => assertDidWeb(did)).not.toThrow()
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it('throws if called with non string argument', () => {
|
|
65
|
+
for (const [val, message] of INVALID) {
|
|
66
|
+
expect(() => assertDidWeb(val)).toThrowError(
|
|
67
|
+
new InvalidDidError(
|
|
68
|
+
typeof val === 'string' ? val : typeof val,
|
|
69
|
+
message,
|
|
70
|
+
),
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
describe('didWebToUrl', () => {
|
|
77
|
+
it('converts valid did:web to URL', () => {
|
|
78
|
+
for (const [did, url] of VALID) {
|
|
79
|
+
expect(didWebToUrl(did)).toStrictEqual(new URL(url))
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
describe('urlToDidWeb', () => {
|
|
85
|
+
it('converts URL to valid did:web', () => {
|
|
86
|
+
for (const [did, url] of VALID) {
|
|
87
|
+
expect(urlToDidWeb(new URL(url))).toBe(did)
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
describe('asDidWeb', () => {
|
|
93
|
+
it('returns the input for valid dids', () => {
|
|
94
|
+
for (const [did] of VALID) {
|
|
95
|
+
expect(asDidWeb(did)).toBe(did)
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
it('throws if called with invalid dids', () => {
|
|
100
|
+
for (const [val, message] of INVALID) {
|
|
101
|
+
expect(() => asDidWeb(val)).toThrowError(
|
|
102
|
+
new InvalidDidError(
|
|
103
|
+
typeof val === 'string' ? val : typeof val,
|
|
104
|
+
message,
|
|
105
|
+
),
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
})
|
|
109
|
+
})
|