kitty-agent 1.1.2 → 2.0.0

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.
@@ -0,0 +1,57 @@
1
+ /*!
2
+ https://github.com/mary-ext/atcute
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
21
+ */
22
+ import type { At } from "@atcute/client/lexicons";
23
+ /**
24
+ * DID document
25
+ */
26
+ interface DidDocument {
27
+ id: string;
28
+ alsoKnownAs?: string[];
29
+ verificationMethod?: Array<{
30
+ id: string;
31
+ type: string;
32
+ controller: string;
33
+ publicKeyMultibase?: string;
34
+ }>;
35
+ service?: Array<{
36
+ id: string;
37
+ type: string;
38
+ serviceEndpoint: string | Record<string, unknown>;
39
+ }>;
40
+ }
41
+ /**
42
+ * Retrieves AT Protocol PDS endpoint from the DID document, if available
43
+ * @param doc DID document
44
+ * @returns The PDS endpoint, if available
45
+ */
46
+ export declare function getPdsEndpoint(doc: DidDocument): string | undefined;
47
+ /**
48
+ * Retrieve a service endpoint from the DID document, if available
49
+ * @param doc DID document
50
+ * @param serviceId Service ID
51
+ * @param serviceType Service type
52
+ * @returns The requested service endpoint, if available
53
+ */
54
+ export declare function getServiceEndpoint(doc: DidDocument, serviceId: string, serviceType: string): string | undefined;
55
+ export declare function getDidDocument(did: At.DID): Promise<DidDocument>;
56
+ export {};
57
+ //# sourceMappingURL=did-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"did-document.d.ts","sourceRoot":"","sources":["../../src/handles/did-document.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;EAoBE;AAEF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAElD;;GAEG;AACH,UAAU,WAAW;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,eAAe,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClD,CAAC,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAEnE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAC9B,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GACpB,MAAM,GAAG,SAAS,CAWpB;AAiBD,wBAAsB,cAAc,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CA0CtE"}
@@ -0,0 +1,93 @@
1
+ /*!
2
+ https://github.com/mary-ext/atcute
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
21
+ */
22
+ /**
23
+ * Retrieves AT Protocol PDS endpoint from the DID document, if available
24
+ * @param doc DID document
25
+ * @returns The PDS endpoint, if available
26
+ */
27
+ export function getPdsEndpoint(doc) {
28
+ return getServiceEndpoint(doc, '#atproto_pds', 'AtprotoPersonalDataServer');
29
+ }
30
+ /**
31
+ * Retrieve a service endpoint from the DID document, if available
32
+ * @param doc DID document
33
+ * @param serviceId Service ID
34
+ * @param serviceType Service type
35
+ * @returns The requested service endpoint, if available
36
+ */
37
+ export function getServiceEndpoint(doc, serviceId, serviceType) {
38
+ const did = doc.id;
39
+ const didServiceId = did + serviceId;
40
+ const found = doc.service?.find((service) => service.id === serviceId || service.id === didServiceId);
41
+ if (!found || found.type !== serviceType || typeof found.serviceEndpoint !== 'string') {
42
+ return undefined;
43
+ }
44
+ return validateUrl(found.serviceEndpoint);
45
+ }
46
+ function validateUrl(urlStr) {
47
+ let url;
48
+ try {
49
+ url = new URL(urlStr);
50
+ }
51
+ catch {
52
+ return undefined;
53
+ }
54
+ const proto = url.protocol;
55
+ if (url.hostname && (proto === 'http:' || proto === 'https:')) {
56
+ return urlStr;
57
+ }
58
+ }
59
+ export async function getDidDocument(did) {
60
+ const colon_index = did.indexOf(':', 4);
61
+ const type = did.slice(4, colon_index);
62
+ const ident = did.slice(colon_index + 1);
63
+ // 2. retrieve their DID documents
64
+ let doc;
65
+ if (type === 'plc') {
66
+ const response = await fetch(`https://plc.directory/${did}`);
67
+ if (response.status === 404) {
68
+ throw new Error(`did not found in directory`);
69
+ }
70
+ else if (!response.ok) {
71
+ throw new Error(`directory is unreachable`);
72
+ }
73
+ const json = await response.json();
74
+ doc = json;
75
+ }
76
+ else if (type === 'web') {
77
+ const DID_WEB_RE = /^([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,}))$/;
78
+ if (!DID_WEB_RE.test(ident)) {
79
+ throw new Error(`invalid identifier`);
80
+ }
81
+ const response = await fetch(`https://${ident}/.well-known/did.json`);
82
+ if (!response.ok) {
83
+ throw new Error(`did document is unreachable`);
84
+ }
85
+ const json = await response.json();
86
+ doc = json;
87
+ }
88
+ else {
89
+ throw new Error(`unsupported did method`);
90
+ }
91
+ return doc;
92
+ }
93
+ //# sourceMappingURL=did-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"did-document.js","sourceRoot":"","sources":["../../src/handles/did-document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { At } from "@atcute/client/lexicons";
2
+ export declare const resolveHandleViaDoH: (handle: string) => Promise<At.DID>;
3
+ //# sourceMappingURL=doh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doh.d.ts","sourceRoot":"","sources":["../../src/handles/doh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAMlD,eAAO,MAAM,mBAAmB,WAAkB,MAAM,KAAG,OAAO,CAAC,EAAE,CAAC,GAAG,CAiDxE,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { isDid } from "./index.js";
2
+ const SUBDOMAIN = '_atproto';
3
+ const PREFIX = 'did=';
4
+ export const resolveHandleViaDoH = async (handle) => {
5
+ const url = new URL('https://mozilla.cloudflare-dns.com/dns-query');
6
+ url.searchParams.set('type', 'TXT');
7
+ url.searchParams.set('name', `${SUBDOMAIN}.${handle}`);
8
+ const response = await fetch(url, {
9
+ method: 'GET',
10
+ headers: { accept: 'application/dns-json' },
11
+ redirect: 'follow',
12
+ });
13
+ const type = response.headers.get('content-type')?.trim();
14
+ if (!response.ok) {
15
+ const message = type?.startsWith('text/plain')
16
+ ? await response.text()
17
+ : `failed to resolve ${handle}`;
18
+ throw new Error(message);
19
+ }
20
+ if (type !== 'application/dns-json') {
21
+ throw new Error(`unexpected response from DoH server`);
22
+ }
23
+ const result = asResult(await response.json());
24
+ const answers = result.Answer?.filter(isAnswerTxt).map(extractTxtData) ?? [];
25
+ for (let i = 0; i < answers.length; i++) {
26
+ // skip if the line does not start with "did="
27
+ if (!answers[i].startsWith(PREFIX)) {
28
+ continue;
29
+ }
30
+ // ensure there is no other entry starting with "did="
31
+ for (let j = i + 1; j < answers.length; j++) {
32
+ if (answers[j].startsWith(PREFIX)) {
33
+ break;
34
+ }
35
+ }
36
+ const did = answers[i].slice(PREFIX.length);
37
+ if (isDid(did)) {
38
+ return did;
39
+ }
40
+ break;
41
+ }
42
+ throw new Error(`failed to resolve ${handle}`);
43
+ };
44
+ const isResult = (result) => {
45
+ if (result === null || typeof result !== 'object') {
46
+ return false;
47
+ }
48
+ return ('Status' in result &&
49
+ typeof result.Status === 'number' &&
50
+ (!('Answer' in result) || (Array.isArray(result.Answer) && result.Answer.every(isAnswer))));
51
+ };
52
+ const asResult = (result) => {
53
+ if (!isResult(result)) {
54
+ throw new TypeError(`unexpected DoH response`);
55
+ }
56
+ return result;
57
+ };
58
+ const isAnswer = (answer) => {
59
+ if (answer === null || typeof answer !== 'object') {
60
+ return false;
61
+ }
62
+ return ('name' in answer &&
63
+ typeof answer.name === 'string' &&
64
+ 'type' in answer &&
65
+ typeof answer.type === 'number' &&
66
+ 'data' in answer &&
67
+ typeof answer.data === 'string' &&
68
+ 'TTL' in answer &&
69
+ typeof answer.TTL === 'number');
70
+ };
71
+ const isAnswerTxt = (answer) => {
72
+ return answer.type === 16;
73
+ };
74
+ const extractTxtData = (answer) => {
75
+ return answer.data.replace(/^"|"$/g, '').replace(/\\"/g, '"');
76
+ };
77
+ //# sourceMappingURL=doh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doh.js","sourceRoot":"","sources":["../../src/handles/doh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { At } from "@atcute/client/lexicons";
2
+ export declare const resolveHandleViaHttp: (handle: string) => Promise<At.DID>;
3
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/handles/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAGlD,eAAO,MAAM,oBAAoB,WAAkB,MAAM,KAAG,OAAO,CAAC,EAAE,CAAC,GAAG,CAgBzE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { isDid } from "./index.js";
2
+ export const resolveHandleViaHttp = async (handle) => {
3
+ const url = new URL('/.well-known/atproto-did', `https://${handle}`);
4
+ const response = await fetch(url, { redirect: 'error' });
5
+ if (!response.ok) {
6
+ throw new Error(`domain is unreachable`);
7
+ }
8
+ const text = await response.text();
9
+ const did = text.split('\n')[0].trim();
10
+ if (isDid(did)) {
11
+ return did;
12
+ }
13
+ throw new Error(`failed to resolve ${handle}`);
14
+ };
15
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/handles/http.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,MAAc,EAAmB,EAAE;IAC7E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,0BAA0B,EAAE,WAAW,MAAM,EAAE,CAAC,CAAC;IAErE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;AAChD,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { At } from "@atcute/client/lexicons";
2
+ export declare const isDid: (did: string) => did is At.DID;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handles/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAElD,eAAO,MAAM,KAAK,QAAS,MAAM,KAAG,GAAG,IAAI,EAAE,CAAC,GAE7C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const isDid = (did) => {
2
+ return /^did:([a-z]+):([a-zA-Z0-9._:%-]*[a-zA-Z0-9._-])$/.test(did);
3
+ };
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handles/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAW,EAAiB,EAAE;IACnD,OAAO,kDAAkD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrE,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function resolveHandleAnonymously(handle: string): Promise<`did:${string}`>;
2
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/handles/resolve.ts"],"names":[],"mappings":"AAMA,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,4BAsB5D"}
@@ -0,0 +1,24 @@
1
+ import { isDid } from "./index.js";
2
+ import { resolveHandleViaDoH } from "./doh.js";
3
+ import { resolveHandleViaHttp } from "./http.js";
4
+ const didCache = new Map();
5
+ export async function resolveHandleAnonymously(handle) {
6
+ if (isDid(handle))
7
+ return handle;
8
+ if (didCache.has(handle)) {
9
+ return didCache.get(handle);
10
+ }
11
+ const results = await Promise.allSettled([
12
+ resolveHandleViaHttp(handle),
13
+ resolveHandleViaDoH(handle),
14
+ ]);
15
+ const did = results
16
+ .find(p => p.status === 'fulfilled')
17
+ ?.value;
18
+ if (did === undefined) {
19
+ throw results;
20
+ }
21
+ didCache.set(handle, did);
22
+ return did;
23
+ }
24
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/handles/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC3C,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAAc;IACzD,IAAI,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACjC,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;IACjC,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACrC,oBAAoB,CAAC,MAAM,CAAC;QAC5B,mBAAmB,CAAC,MAAM,CAAC;KAC9B,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,OAAO;SACd,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC;QACpC,EAAE,KAAK,CAAC;IAEZ,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACpB,MAAM,OAAO,CAAC;IAClB,CAAC;IAED,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE1B,OAAO,GAAG,CAAC;AACf,CAAC"}
package/out/index.d.ts CHANGED
@@ -49,6 +49,7 @@ type DataThenParams<T> = T extends {
49
49
  export declare class KittyAgent<X extends XRPC = XRPC> {
50
50
  readonly xrpc: X;
51
51
  constructor(opts: XRPCOptions | X);
52
+ static createUnauthed(service?: string): KittyAgent;
52
53
  /** Makes a request to the XRPC service */
53
54
  request(options: XRPCRequestOptions): Promise<XRPCResponse>;
54
55
  query<K extends keyof Queries>(nsid: K, ...args: ParamsThenData<Queries[K]>): Promise<OutputOf<Queries[K]>>;
@@ -57,7 +58,23 @@ export declare class KittyAgent<X extends XRPC = XRPC> {
57
58
  getBlob(params: ComAtprotoSyncGetBlob.Params | {
58
59
  did: At.DID;
59
60
  cid: At.Blob;
60
- }): Promise<Uint8Array>;
61
+ }): Promise<Uint8Array | string>;
62
+ /**
63
+ * Atcute likes to return blobs as text sometimes. I don't know why yet. This returns them as binary if that
64
+ * happens.
65
+ */
66
+ getBlobAsBinary(params: ComAtprotoSyncGetBlob.Params | {
67
+ did: At.DID;
68
+ cid: At.Blob;
69
+ }): Promise<Uint8Array<ArrayBufferLike>>;
70
+ /**
71
+ * Atcute likes to return blobs as text sometimes. I don't know why yet. This returns them as text no matter what,
72
+ * and also allows you to specify an encoding.
73
+ */
74
+ getBlobAsText(params: ComAtprotoSyncGetBlob.Params | {
75
+ did: At.DID;
76
+ cid: At.Blob;
77
+ }, encoding?: string): Promise<string>;
61
78
  tryGet<K extends keyof Records>(params: GetRecordParams<K>): Promise<GetRecordOutput<K> | {
62
79
  uri: undefined;
63
80
  value: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/out/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable @typescript-eslint/no-empty-object-type */
2
- import { XRPC, XRPCError } from "@atcute/client";
2
+ import { simpleFetchHandler, XRPC, XRPCError } from "@atcute/client";
3
3
  export function isInvalidSwapError(err) {
4
4
  return err instanceof XRPCError && err.kind === 'InvalidSwap';
5
5
  }
@@ -11,6 +11,9 @@ export class KittyAgent {
11
11
  constructor(opts) {
12
12
  this.xrpc = opts instanceof XRPC ? opts : new XRPC(opts);
13
13
  }
14
+ static createUnauthed(service = 'https://bsky.social') {
15
+ return new KittyAgent({ handler: simpleFetchHandler({ service }) });
16
+ }
14
17
  /** Makes a request to the XRPC service */
15
18
  async request(options) {
16
19
  return await this.xrpc.request(options);
@@ -39,6 +42,26 @@ export class KittyAgent {
39
42
  const data = await this.query('com.atproto.sync.getBlob', params);
40
43
  return data;
41
44
  }
45
+ /**
46
+ * Atcute likes to return blobs as text sometimes. I don't know why yet. This returns them as binary if that
47
+ * happens.
48
+ */
49
+ async getBlobAsBinary(params) {
50
+ let blob = await this.getBlob(params);
51
+ if (typeof blob === 'string')
52
+ blob = new TextEncoder().encode(blob);
53
+ return blob;
54
+ }
55
+ /**
56
+ * Atcute likes to return blobs as text sometimes. I don't know why yet. This returns them as text no matter what,
57
+ * and also allows you to specify an encoding.
58
+ */
59
+ async getBlobAsText(params, encoding) {
60
+ let blob = await this.getBlob(params);
61
+ if (typeof blob !== 'string')
62
+ blob = new TextDecoder(encoding).decode(blob);
63
+ return blob;
64
+ }
42
65
  async tryGet(params) {
43
66
  try {
44
67
  return await this.get(params);
package/out/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/out/oauth.d.ts ADDED
@@ -0,0 +1,98 @@
1
+ import type { At } from '@atcute/client/lexicons';
2
+ import { OAuthUserAgent } from '@atcute/oauth-browser-client';
3
+ import { KittyAgent } from './index.js';
4
+ declare class OAuthClient {
5
+ private readonly scope;
6
+ constructor({ clientId, redirectUri, scope }: {
7
+ clientId: string;
8
+ redirectUri: string;
9
+ scope: string;
10
+ });
11
+ oauthAuthenticate(handle: string): Promise<void>;
12
+ oauthAuthenticateOrRefresh(handle: string, refreshOnly: boolean): Promise<OAuthUserAgent | undefined>;
13
+ revokeSessions(): void;
14
+ }
15
+ export interface LoginState<T> {
16
+ readonly handle: string;
17
+ readonly did: At.DID;
18
+ readonly pds: string;
19
+ readonly agent: KittyAgent;
20
+ readonly client: T;
21
+ }
22
+ export interface Account {
23
+ handle: string;
24
+ did: At.DID;
25
+ pds: string;
26
+ }
27
+ export declare namespace Store {
28
+ /** Callback to inform of a value updates. */
29
+ type Subscriber<T> = (value: T) => void;
30
+ /** Unsubscribes from value updates. */
31
+ type Unsubscriber = () => void;
32
+ /** Callback to update a value. */
33
+ type Updater<T> = (value: T) => T;
34
+ /** Readable interface for subscribing. */
35
+ interface Readable<T> {
36
+ /**
37
+ * Subscribe on value changes.
38
+ * @param run subscription callback
39
+ * @param invalidate cleanup callback
40
+ */
41
+ subscribe(this: void, run: Subscriber<T>, invalidate?: () => void): Unsubscriber;
42
+ }
43
+ /** Writable interface for both updating and subscribing. */
44
+ interface Writable<T> extends Readable<T> {
45
+ /**
46
+ * Update value using callback and inform subscribers.
47
+ * @param updater callback
48
+ */
49
+ update(this: void, updater: Updater<T>): void;
50
+ }
51
+ /** One or more values from `Readable` stores. */
52
+ type StoresValues<T> = T extends Readable<infer U> ? U : {
53
+ [K in keyof T]: T[K] extends Readable<infer U> ? U : never;
54
+ };
55
+ }
56
+ /** Convenience class for readable stores that adds a .get() method. */
57
+ declare class ReadableEx<T, TStore extends Store.Readable<T> = Store.Readable<T>> implements Store.Readable<T> {
58
+ protected readonly store: TStore;
59
+ constructor(store: TStore);
60
+ subscribe: (this: void, run: Store.Subscriber<T>, invalidate?: () => void) => Store.Unsubscriber;
61
+ /**
62
+ * Get the current value from a store by subscribing and immediately unsubscribing.
63
+ * Reimplementation of `svelte/store` `get()`.
64
+ */
65
+ get: (this: void) => T;
66
+ }
67
+ export declare class StatefulOAuthClient<TClient> extends OAuthClient {
68
+ private readonly createWritableStore;
69
+ private readonly createDerivedStore;
70
+ private readonly createClient;
71
+ private _account;
72
+ private _agent;
73
+ private _client;
74
+ get account(): ReadableEx<Account | undefined>;
75
+ readonly user: ReadableEx<LoginState<TClient> | undefined>;
76
+ readonly handle: ReadableEx<string | undefined>;
77
+ readonly did: ReadableEx<At.DID | undefined>;
78
+ readonly pds: ReadableEx<string | undefined>;
79
+ constructor(options: {
80
+ clientId: string;
81
+ redirectUri: string;
82
+ scope: string;
83
+ }, createWritableStore: <T>(value: T) => Store.Writable<T>, createDerivedStore: <T, S extends Store.Readable<any>[]>(stores: S, callback: (values: Store.StoresValues<S>) => T) => Store.Readable<T>, createClient: (loginState: {
84
+ readonly handle: string;
85
+ readonly did: At.DID;
86
+ readonly pds: string;
87
+ readonly agent: KittyAgent;
88
+ }) => TClient);
89
+ private useLocalStorage;
90
+ private writable;
91
+ private derived;
92
+ authenticateIfNecessary(handle: string, refreshOnly: boolean): Promise<boolean>;
93
+ initialSessionPromise: Promise<void> | undefined;
94
+ waitForInitialSession(): Promise<void>;
95
+ revokeSessions(): void;
96
+ }
97
+ export {};
98
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
package/out/oauth.js ADDED
@@ -0,0 +1,196 @@
1
+ import { configureOAuth, createAuthorizationUrl, deleteStoredSession, getSession, listStoredSessions, OAuthUserAgent, resolveFromIdentity } from '@atcute/oauth-browser-client';
2
+ import { KittyAgent } from './index.js';
3
+ import { resolveHandleAnonymously } from './handles/resolve.js';
4
+ import { getDidAndPds } from './pds-helpers.js';
5
+ class OAuthClient {
6
+ scope;
7
+ constructor({ clientId, redirectUri, scope }) {
8
+ configureOAuth({
9
+ metadata: {
10
+ client_id: clientId,
11
+ redirect_uri: redirectUri,
12
+ },
13
+ });
14
+ this.scope = scope;
15
+ }
16
+ async oauthAuthenticate(handle) {
17
+ const { identity, metadata } = await resolveFromIdentity(handle);
18
+ // passing `identity` is optional,
19
+ // it allows for the login form to be autofilled with the user's handle or DID
20
+ const authUrl = await createAuthorizationUrl({
21
+ metadata,
22
+ identity,
23
+ scope: this.scope,
24
+ });
25
+ console.log(authUrl);
26
+ // recommended to wait for the browser to persist local storage before proceeding
27
+ await new Promise(resolve => setTimeout(resolve, 200));
28
+ // redirect the user to sign in and authorize the app
29
+ document.location.href = authUrl.toString();
30
+ // Time out after 100 seconds if the redirect doesn't go through for some reason
31
+ await new Promise(reject => setTimeout(reject, 100000));
32
+ throw new Error('Unreachable code');
33
+ }
34
+ async oauthAuthenticateOrRefresh(handle, refreshOnly) {
35
+ let session;
36
+ try {
37
+ session = await getSession(await resolveHandleAnonymously(handle), { allowStale: false });
38
+ }
39
+ catch (err) {
40
+ console.warn('Could not refresh session:', err);
41
+ }
42
+ console.log('seession', session);
43
+ if (refreshOnly && !session)
44
+ return undefined;
45
+ if (!session) {
46
+ await this.oauthAuthenticate(handle); // will not return
47
+ throw new Error('Should never happen');
48
+ }
49
+ const oauthAgent = new OAuthUserAgent(session);
50
+ return oauthAgent;
51
+ }
52
+ revokeSessions() {
53
+ for (const session of listStoredSessions()) {
54
+ deleteStoredSession(session);
55
+ }
56
+ }
57
+ }
58
+ /** Convenience class for readable stores that adds a .get() method. */
59
+ class ReadableEx {
60
+ store;
61
+ constructor(store) {
62
+ this.store = store;
63
+ this.subscribe = (run, invalidate) => {
64
+ return store.subscribe(run, invalidate);
65
+ };
66
+ this.get = () => {
67
+ let value;
68
+ const unsub = store.subscribe(avalue => value = avalue);
69
+ unsub();
70
+ return value;
71
+ };
72
+ }
73
+ subscribe;
74
+ /**
75
+ * Get the current value from a store by subscribing and immediately unsubscribing.
76
+ * Reimplementation of `svelte/store` `get()`.
77
+ */
78
+ get;
79
+ }
80
+ /** Convenience class for writable stores that adds a .get() method. */
81
+ class WritableEx extends ReadableEx {
82
+ constructor(store) {
83
+ super(store);
84
+ this.update = (updater) => {
85
+ return this.store.update(updater);
86
+ };
87
+ this.set = (value) => {
88
+ return this.store.update(() => value);
89
+ };
90
+ }
91
+ update;
92
+ /**
93
+ * Set value and inform subscribers.
94
+ * @param value to set
95
+ */
96
+ set;
97
+ }
98
+ class LoginStateImpl {
99
+ account;
100
+ agent;
101
+ client;
102
+ constructor(account, agent, client) {
103
+ this.account = account;
104
+ this.agent = agent;
105
+ this.client = client;
106
+ }
107
+ get handle() { return this.account.handle; }
108
+ get did() { return this.account.did; }
109
+ get pds() { return this.account.pds; }
110
+ }
111
+ export class StatefulOAuthClient extends OAuthClient {
112
+ createWritableStore;
113
+ createDerivedStore;
114
+ createClient;
115
+ _account;
116
+ _agent;
117
+ _client;
118
+ get account() { return this._account; }
119
+ user;
120
+ handle;
121
+ did;
122
+ pds;
123
+ constructor(options, createWritableStore, createDerivedStore, createClient) {
124
+ super(options);
125
+ this.createWritableStore = createWritableStore;
126
+ this.createDerivedStore = createDerivedStore;
127
+ this.createClient = createClient;
128
+ // TODO computations created outside a `createRoot` or `render` will never be disposed
129
+ // use createContext/useContext?
130
+ this._account = this.useLocalStorage('user', undefined, {
131
+ deserializer(raw) { return raw === 'null' ? undefined : JSON.parse(raw); },
132
+ serializer(value) { return value === undefined ? 'null' : JSON.stringify(value); },
133
+ });
134
+ this._agent = this.writable(undefined);
135
+ this._client = this.writable(undefined);
136
+ this.user = this.derived([this._account, this._agent, this._client], ([account, agent, client]) => {
137
+ return account && agent && client ? new LoginStateImpl(account, agent, client) : undefined;
138
+ });
139
+ this.handle = this.derived([this._account], ([account]) => account?.handle);
140
+ this.did = this.derived([this._account], ([account]) => account?.did);
141
+ this.pds = this.derived([this._account], ([account]) => account?.pds);
142
+ }
143
+ useLocalStorage(key, initialValue, options) {
144
+ let value = this.writable(initialValue);
145
+ if (key in localStorage) {
146
+ value.set(options.deserializer(localStorage[key]));
147
+ }
148
+ value.subscribe(newValue => {
149
+ localStorage[key] = options.serializer(newValue);
150
+ });
151
+ return value;
152
+ }
153
+ writable(initialValue) {
154
+ return new WritableEx(this.createWritableStore(initialValue));
155
+ }
156
+ derived(stores, callback) {
157
+ return new ReadableEx(this.createDerivedStore(stores, callback));
158
+ }
159
+ async authenticateIfNecessary(handle, refreshOnly) {
160
+ const account = this._account.get();
161
+ if (this.user.get() && account && account.handle === handle) {
162
+ return true;
163
+ }
164
+ const oauthAgent = await this.oauthAuthenticateOrRefresh(handle, refreshOnly);
165
+ if (oauthAgent === undefined)
166
+ return false;
167
+ const { did, pds } = await getDidAndPds(handle);
168
+ this._account.set({ did, pds, handle });
169
+ const agent = new KittyAgent({ handler: oauthAgent });
170
+ this._agent.set(agent);
171
+ this._client.set(this.createClient({ did, pds, handle, agent }));
172
+ return true;
173
+ }
174
+ initialSessionPromise;
175
+ async waitForInitialSession() {
176
+ if (!this.initialSessionPromise) {
177
+ this.initialSessionPromise = (async () => {
178
+ const account = this._account.get();
179
+ if (account) { // automatically sign in if possible
180
+ const result = await this.authenticateIfNecessary(account.handle, true);
181
+ console.log(`early authentication complete: ${result}`);
182
+ }
183
+ })();
184
+ }
185
+ await this.initialSessionPromise;
186
+ }
187
+ revokeSessions() {
188
+ super.revokeSessions();
189
+ this._account.set(undefined);
190
+ }
191
+ }
192
+ function isTokenUsable({ token }) {
193
+ const expires = token.expires_at;
194
+ return expires == null || Date.now() + 60_000 <= expires;
195
+ }
196
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { At } from "@atcute/client/lexicons";
2
+ import type { DidDocument } from '@atcute/client/utils/did';
3
+ export declare function getDidAndPds(handleOrDid: string): Promise<{
4
+ did: At.DID;
5
+ pds: string;
6
+ didDocument: DidDocument;
7
+ }>;
8
+ //# sourceMappingURL=pds-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pds-helpers.d.ts","sourceRoot":"","sources":["../src/pds-helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,CAAC,CAavH"}
@@ -0,0 +1,16 @@
1
+ import { getDidDocument, getPdsEndpoint } from './handles/did-document.js';
2
+ import { resolveHandleAnonymously } from "./handles/resolve.js";
3
+ const didPdsCache = new Map();
4
+ export async function getDidAndPds(handleOrDid) {
5
+ if (didPdsCache.has(handleOrDid)) {
6
+ return didPdsCache.get(handleOrDid);
7
+ }
8
+ const did = await resolveHandleAnonymously(handleOrDid);
9
+ const didDocument = await getDidDocument(did);
10
+ const pds = getPdsEndpoint(didDocument);
11
+ if (!pds)
12
+ throw new Error(`No PDS for ${handleOrDid} (${did})!`);
13
+ didPdsCache.set(handleOrDid, { did, pds, didDocument });
14
+ return { did, pds, didDocument };
15
+ }
16
+ //# sourceMappingURL=pds-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pds-helpers.js","sourceRoot":"","sources":["../src/pds-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAGhE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkE,CAAC;AAE9F,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IAClD,IAAI,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,wBAAwB,CAAC,WAAW,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,WAAW,KAAK,GAAG,IAAI,CAAC,CAAC;IAEjE,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;IAExD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;AACrC,CAAC"}
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "kitty-agent",
3
3
  "type": "module",
4
- "version": "1.1.2",
4
+ "version": "2.0.0",
5
5
  "description": "Helpers for @atcute/client",
6
- "main": "src/index.js",
6
+ "main": "out/index.js",
7
+ "types": "out/index.d.ts",
7
8
  "scripts": {
8
9
  "build": "tsc"
9
10
  },
@@ -14,9 +15,11 @@
14
15
  "author": "",
15
16
  "license": "ISC",
16
17
  "devDependencies": {
17
- "@atcute/client": "^2.0.6"
18
+ "@atcute/client": "^2.0.6",
19
+ "@atcute/oauth-browser-client": "^1.0.9"
18
20
  },
19
21
  "peerDependencies": {
20
- "@atcute/client": "^2.0.6"
22
+ "@atcute/client": "^2.0.6",
23
+ "@atcute/oauth-browser-client": "^1.0.9"
21
24
  }
22
25
  }