@atproto/did 0.2.3 → 0.2.4

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atproto/did
2
2
 
3
+ ## 0.2.4
4
+
5
+ ### Patch Changes
6
+
7
+ - [#4501](https://github.com/bluesky-social/atproto/pull/4501) [`2f78893`](https://github.com/bluesky-social/atproto/commit/2f78893ace3bbf14d4bac36837820ddb46658c98) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Expose new `AtprotoDidDocument` type
8
+
3
9
  ## 0.2.3
4
10
 
5
11
  ### Patch Changes
package/dist/atproto.d.ts CHANGED
@@ -4,6 +4,7 @@ import { Did } from './did.js';
4
4
  import { Identifier } from './utils.js';
5
5
  export type AtprotoIdentityDidMethods = 'plc' | 'web';
6
6
  export type AtprotoDid = Did<AtprotoIdentityDidMethods>;
7
+ export type AtprotoDidDocument = DidDocument<AtprotoIdentityDidMethods>;
7
8
  export declare const atprotoDidSchema: z.ZodEffects<z.ZodString, `did:plc:${string}` | `did:web:${string}`, string>;
8
9
  export declare function isAtprotoDid(input: unknown): input is AtprotoDid;
9
10
  export declare function asAtprotoDid<T>(input: T): (T & `did:plc:${string}`) | (T & `did:web:${string}`);
@@ -22,7 +23,7 @@ export type AtprotoData<M extends AtprotoIdentityDidMethods = AtprotoIdentityDid
22
23
  pds?: AtprotoPersonalDataServerService<M>;
23
24
  };
24
25
  export declare function extractAtprotoData<M extends AtprotoIdentityDidMethods>(document: DidDocument<M>): AtprotoData<M>;
25
- export declare function extractPdsUrl(document: DidDocument<AtprotoIdentityDidMethods>): URL;
26
+ export declare function extractPdsUrl(document: AtprotoDidDocument): URL;
26
27
  export type AtprotoAka = `at://${string}`;
27
28
  export declare function isAtprotoAka(value: string): value is AtprotoAka;
28
29
  export type AtprotoPersonalDataServerService<M extends AtprotoIdentityDidMethods = AtprotoIdentityDidMethods> = DidService & {
@@ -1 +1 @@
1
- {"version":3,"file":"atproto.d.ts","sourceRoot":"","sources":["../src/atproto.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"atproto.d.ts","sourceRoot":"","sources":["../src/atproto.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"atproto.js","sourceRoot":"","sources":["../src/atproto.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { DidDocument, DidService } from './did-document.js'\nimport { DidError, InvalidDidError } from './did-error.js'\nimport { Did } from './did.js'\nimport { canParse, 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'\nimport { Identifier, matchesIdentifier } from './utils.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\nexport type AtprotoData<\n M extends AtprotoIdentityDidMethods = AtprotoIdentityDidMethods,\n> = {\n did: Did<M>\n aka?: string\n key?: AtprotoVerificationMethod<M>\n pds?: AtprotoPersonalDataServerService<M>\n}\n\nexport function extractAtprotoData<M extends AtprotoIdentityDidMethods>(\n document: DidDocument<M>,\n): AtprotoData<M> {\n return {\n did: document.id,\n aka: document.alsoKnownAs?.find(isAtprotoAka)?.slice(5),\n key: document.verificationMethod?.find(\n isAtprotoVerificationMethod<M>,\n document,\n ),\n pds: document.service?.find(\n isAtprotoPersonalDataServerService<M>,\n document,\n ),\n }\n}\n\nexport function extractPdsUrl(\n document: DidDocument<AtprotoIdentityDidMethods>,\n): URL {\n const service = document.service?.find(\n isAtprotoPersonalDataServerService,\n document,\n )\n\n if (!service) {\n throw new DidError(\n document.id,\n `Document ${document.id} does not contain a (valid) #atproto_pds service URL`,\n 'did-service-not-found',\n )\n }\n\n return new URL(service.serviceEndpoint)\n}\n\nexport type AtprotoAka = `at://${string}`\nexport function isAtprotoAka(value: string): value is AtprotoAka {\n return value.startsWith('at://')\n}\n\nexport type AtprotoPersonalDataServerService<\n M extends AtprotoIdentityDidMethods = AtprotoIdentityDidMethods,\n> = DidService & {\n id: Identifier<Did<M>, 'atproto_pds'>\n type: 'AtprotoPersonalDataServer'\n serviceEndpoint: string\n}\n\nexport function isAtprotoPersonalDataServerService<\n M extends AtprotoIdentityDidMethods = AtprotoIdentityDidMethods,\n>(\n this: DidDocument<M>,\n service: null | undefined | DidService,\n): service is AtprotoPersonalDataServerService<M> {\n return (\n service?.type === 'AtprotoPersonalDataServer' &&\n typeof service.serviceEndpoint === 'string' &&\n canParse(service.serviceEndpoint) &&\n matchesIdentifier(this.id, 'atproto_pds', service.id)\n )\n}\n\nexport const ATPROTO_VERIFICATION_METHOD_TYPES = Object.freeze([\n 'EcdsaSecp256r1VerificationKey2019',\n 'EcdsaSecp256k1VerificationKey2019',\n 'Multikey',\n] as const)\nexport type SupportedAtprotoVerificationMethodType =\n (typeof ATPROTO_VERIFICATION_METHOD_TYPES)[number]\n\ntype VerificationMethod = NonNullable<DidDocument['verificationMethod']>[number]\nexport type AtprotoVerificationMethod<\n M extends AtprotoIdentityDidMethods = AtprotoIdentityDidMethods,\n> = Extract<VerificationMethod, object> & {\n id: Identifier<Did<M>, 'atproto'>\n type: SupportedAtprotoVerificationMethodType\n publicKeyMultibase: string\n}\n\nexport function isAtprotoVerificationMethod<\n M extends AtprotoIdentityDidMethods = AtprotoIdentityDidMethods,\n>(\n this: DidDocument<M>,\n method:\n | null\n | undefined\n | NonNullable<DidDocument<M>['verificationMethod']>[number],\n): method is AtprotoVerificationMethod<M> {\n return (\n typeof method === 'object' &&\n typeof method?.publicKeyMultibase === 'string' &&\n (ATPROTO_VERIFICATION_METHOD_TYPES as readonly unknown[]).includes(\n method.type,\n ) &&\n matchesIdentifier(this.id, 'atproto', method.id)\n )\n}\n"]}
1
+ {"version":3,"file":"atproto.js","sourceRoot":"","sources":["../src/atproto.ts"],"names":[],"mappings":";;;AAyBA,oCAEC;AAED,oCAGC;AAED,4CAaC;AAED,kDAkBC;AAKD,0CAcC;AAmDD,gDAeC;AAED,sCAeC;AAGD,oCAEC;AAUD,gFAYC;AAmBD,kEAiBC;AAxOD,6BAAuB;AAEvB,iDAA0D;AAE1D,yCAAmD;AACnD,6CAOqB;AACrB,yCAA0D;AAQ7C,QAAA,gBAAgB,GAAG,OAAC;KAC9B,MAAM,EAAE;KACR,MAAM,CAAC,YAAY,EAAE,iDAAiD,CAAC,CAAA;AAE1E,SAAgB,YAAY,CAAC,KAAc;IACzC,OAAO,IAAA,qBAAQ,EAAC,KAAK,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAA;AAClD,CAAC;AAED,SAAgB,YAAY,CAAI,KAAQ;IACtC,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,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,8BAAe,CACvB,KAAK,EACL,oDAAoD,CACrD,CAAA;IACH,CAAC;IAED,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,8BAAe,CACvB,KAAK,EACL,uEAAuE,CACxE,CAAA;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAc;IAC5C,IAAI,CAAC,IAAA,qBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAe;IACvC,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,2BAAc,CAAC,MAAM,CAAC,CAAA;AACjD,CAAC;AAED,SAAS,cAAc,CAAC,GAAe;IACrC,OAAO,CACL,GAAG,KAAK,mBAAmB;QAC3B,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC;QACpC,GAAG,CAAC,UAAU,CAAC,sBAAsB,CAAC,CACvC,CAAA;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAe;IAC5C,IAAI,cAAc,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA;IAErC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,2BAAc,CAAC,MAAM,CAAC,CAAA;IAEvD,MAAM,OAAO,GACX,OAAO,KAAK,CAAC,CAAC;QACZ,CAAC,CAAC,sEAAsE;YACtE,wBAAwB;YACxB,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,2BAAc,CAAC,MAAM,CAAC;QAC5C,CAAC,CAAC,uEAAuE;YACvE,8BAA8B;YAC9B,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IAE5C,OAAO,OAAO,CAAA;AAChB,CAAC;AAGM,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAA4B,EAAE;IAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACpC,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAC1D,OAAO,CACL,IAAA,mBAAU,EAAC,KAAK,EAAE,SAAS,GAAG,CAAC,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAC5E,CAAA;AACH,CAAC,CAAA;AARY,QAAA,iBAAiB,qBAQ7B;AAWD,SAAgB,kBAAkB,CAChC,QAAwB;IAExB,OAAO;QACL,GAAG,EAAE,QAAQ,CAAC,EAAE;QAChB,GAAG,EAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACvD,GAAG,EAAE,QAAQ,CAAC,kBAAkB,EAAE,IAAI,CACpC,CAAA,2BAA8B,CAAA,EAC9B,QAAQ,CACT;QACD,GAAG,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CACzB,CAAA,kCAAqC,CAAA,EACrC,QAAQ,CACT;KACF,CAAA;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,QAA4B;IACxD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CACpC,kCAAkC,EAClC,QAAQ,CACT,CAAA;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,uBAAQ,CAChB,QAAQ,CAAC,EAAE,EACX,YAAY,QAAQ,CAAC,EAAE,sDAAsD,EAC7E,uBAAuB,CACxB,CAAA;IACH,CAAC;IAED,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;AACzC,CAAC;AAGD,SAAgB,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;AAClC,CAAC;AAUD,SAAgB,kCAAkC,CAIhD,OAAsC;IAEtC,OAAO,CACL,OAAO,EAAE,IAAI,KAAK,2BAA2B;QAC7C,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ;QAC3C,IAAA,iBAAQ,EAAC,OAAO,CAAC,eAAe,CAAC;QACjC,IAAA,4BAAiB,EAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC,CACtD,CAAA;AACH,CAAC;AAEY,QAAA,iCAAiC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7D,mCAAmC;IACnC,mCAAmC;IACnC,UAAU;CACF,CAAC,CAAA;AAaX,SAAgB,2BAA2B,CAIzC,MAG6D;IAE7D,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;QAC1B,OAAO,MAAM,EAAE,kBAAkB,KAAK,QAAQ;QAC7C,yCAAwD,CAAC,QAAQ,CAChE,MAAM,CAAC,IAAI,CACZ;QACD,IAAA,4BAAiB,EAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CACjD,CAAA;AACH,CAAC","sourcesContent":["import { z } from 'zod'\nimport { DidDocument, DidService } from './did-document.js'\nimport { DidError, InvalidDidError } from './did-error.js'\nimport { Did } from './did.js'\nimport { canParse, 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'\nimport { Identifier, matchesIdentifier } from './utils.js'\n\n// This file contains atproto-specific DID validation utilities.\n\nexport type AtprotoIdentityDidMethods = 'plc' | 'web'\nexport type AtprotoDid = Did<AtprotoIdentityDidMethods>\nexport type AtprotoDidDocument = DidDocument<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\nexport type AtprotoData<\n M extends AtprotoIdentityDidMethods = AtprotoIdentityDidMethods,\n> = {\n did: Did<M>\n aka?: string\n key?: AtprotoVerificationMethod<M>\n pds?: AtprotoPersonalDataServerService<M>\n}\n\nexport function extractAtprotoData<M extends AtprotoIdentityDidMethods>(\n document: DidDocument<M>,\n): AtprotoData<M> {\n return {\n did: document.id,\n aka: document.alsoKnownAs?.find(isAtprotoAka)?.slice(5),\n key: document.verificationMethod?.find(\n isAtprotoVerificationMethod<M>,\n document,\n ),\n pds: document.service?.find(\n isAtprotoPersonalDataServerService<M>,\n document,\n ),\n }\n}\n\nexport function extractPdsUrl(document: AtprotoDidDocument): URL {\n const service = document.service?.find(\n isAtprotoPersonalDataServerService,\n document,\n )\n\n if (!service) {\n throw new DidError(\n document.id,\n `Document ${document.id} does not contain a (valid) #atproto_pds service URL`,\n 'did-service-not-found',\n )\n }\n\n return new URL(service.serviceEndpoint)\n}\n\nexport type AtprotoAka = `at://${string}`\nexport function isAtprotoAka(value: string): value is AtprotoAka {\n return value.startsWith('at://')\n}\n\nexport type AtprotoPersonalDataServerService<\n M extends AtprotoIdentityDidMethods = AtprotoIdentityDidMethods,\n> = DidService & {\n id: Identifier<Did<M>, 'atproto_pds'>\n type: 'AtprotoPersonalDataServer'\n serviceEndpoint: string\n}\n\nexport function isAtprotoPersonalDataServerService<\n M extends AtprotoIdentityDidMethods = AtprotoIdentityDidMethods,\n>(\n this: DidDocument<M>,\n service: null | undefined | DidService,\n): service is AtprotoPersonalDataServerService<M> {\n return (\n service?.type === 'AtprotoPersonalDataServer' &&\n typeof service.serviceEndpoint === 'string' &&\n canParse(service.serviceEndpoint) &&\n matchesIdentifier(this.id, 'atproto_pds', service.id)\n )\n}\n\nexport const ATPROTO_VERIFICATION_METHOD_TYPES = Object.freeze([\n 'EcdsaSecp256r1VerificationKey2019',\n 'EcdsaSecp256k1VerificationKey2019',\n 'Multikey',\n] as const)\nexport type SupportedAtprotoVerificationMethodType =\n (typeof ATPROTO_VERIFICATION_METHOD_TYPES)[number]\n\ntype VerificationMethod = NonNullable<DidDocument['verificationMethod']>[number]\nexport type AtprotoVerificationMethod<\n M extends AtprotoIdentityDidMethods = AtprotoIdentityDidMethods,\n> = Extract<VerificationMethod, object> & {\n id: Identifier<Did<M>, 'atproto'>\n type: SupportedAtprotoVerificationMethodType\n publicKeyMultibase: string\n}\n\nexport function isAtprotoVerificationMethod<\n M extends AtprotoIdentityDidMethods = AtprotoIdentityDidMethods,\n>(\n this: DidDocument<M>,\n method:\n | null\n | undefined\n | NonNullable<DidDocument<M>['verificationMethod']>[number],\n): method is AtprotoVerificationMethod<M> {\n return (\n typeof method === 'object' &&\n typeof method?.publicKeyMultibase === 'string' &&\n (ATPROTO_VERIFICATION_METHOD_TYPES as readonly unknown[]).includes(\n method.type,\n ) &&\n matchesIdentifier(this.id, 'atproto', method.id)\n )\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/did",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "license": "MIT",
5
5
  "description": "DID resolution and verification library",
6
6
  "keywords": [
package/src/atproto.ts CHANGED
@@ -17,6 +17,7 @@ import { Identifier, matchesIdentifier } from './utils.js'
17
17
 
18
18
  export type AtprotoIdentityDidMethods = 'plc' | 'web'
19
19
  export type AtprotoDid = Did<AtprotoIdentityDidMethods>
20
+ export type AtprotoDidDocument = DidDocument<AtprotoIdentityDidMethods>
20
21
 
21
22
  export const atprotoDidSchema = z
22
23
  .string()
@@ -151,9 +152,7 @@ export function extractAtprotoData<M extends AtprotoIdentityDidMethods>(
151
152
  }
152
153
  }
153
154
 
154
- export function extractPdsUrl(
155
- document: DidDocument<AtprotoIdentityDidMethods>,
156
- ): URL {
155
+ export function extractPdsUrl(document: AtprotoDidDocument): URL {
157
156
  const service = document.service?.find(
158
157
  isAtprotoPersonalDataServerService,
159
158
  document,