@atproto/xrpc 0.7.7 → 0.8.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @atproto/xrpc
2
2
 
3
+ ## 0.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24.
8
+
9
+ - [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution.
10
+
11
+ Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code.
12
+
13
+ - [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0.
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]:
18
+ - @atproto/lexicon@0.7.0
19
+
3
20
  ## 0.7.7
4
21
 
5
22
  ### Patch Changes
package/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  Dual MIT/Apache-2.0 License
2
2
 
3
- Copyright (c) 2022-2025 Bluesky Social PBC, and Contributors
3
+ Copyright (c) 2022-2026 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/client.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { LexiconDoc, Lexicons } from '@atproto/lexicon';
2
- import { CallOptions, QueryParams } from './types';
3
- import { XrpcClient } from './xrpc-client';
2
+ import { CallOptions, QueryParams } from './types.js';
3
+ import { XrpcClient } from './xrpc-client.js';
4
4
  /** @deprecated Use {@link XrpcClient} instead */
5
5
  export declare class Client {
6
6
  /** @deprecated */
@@ -8,7 +8,7 @@ export declare class Client {
8
8
  /** @deprecated */
9
9
  set fetch(_: never);
10
10
  lex: Lexicons;
11
- call(serviceUri: string | URL, methodNsid: string, params?: QueryParams, data?: BodyInit | null, opts?: CallOptions): Promise<import("./types").XRPCResponse>;
11
+ call(serviceUri: string | URL, methodNsid: string, params?: QueryParams, data?: BodyInit | null, opts?: CallOptions): Promise<import("./types.js").XRPCResponse>;
12
12
  service(serviceUri: string | URL): ServiceClient;
13
13
  addLexicon(doc: LexiconDoc): void;
14
14
  addLexicons(docs: LexiconDoc[]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,iDAAiD;AACjD,qBAAa,MAAM;IACjB,kBAAkB;IAClB,IAAI,KAAK,IAAI,KAAK,CAIjB;IAED,kBAAkB;IAClB,IAAI,KAAK,CAAC,CAAC,EAAE,KAAK,EAIjB;IAED,GAAG,WAAiB;IAKd,IAAI,CACR,UAAU,EAAE,MAAM,GAAG,GAAG,EACxB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,EACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,EACtB,IAAI,CAAC,EAAE,WAAW;IAKpB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG;IAOhC,UAAU,CAAC,GAAG,EAAE,UAAU;IAI1B,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE;IAM9B,aAAa,CAAC,GAAG,EAAE,MAAM;CAG1B;AAED,iDAAiD;AACjD,qBAAa,aAAc,SAAQ,UAAU;IAIlC,UAAU,EAAE,MAAM;IAH3B,GAAG,EAAE,GAAG,CAAA;gBAGC,UAAU,EAAE,MAAM,EACzB,UAAU,EAAE,MAAM,GAAG,GAAG;CAQ3B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,iDAAiD;AACjD,qBAAa,MAAM;IACjB,kBAAkB;IAClB,IAAI,KAAK,IAAI,KAAK,CAIjB;IAED,kBAAkB;IAClB,IAAI,KAAK,CAAC,CAAC,EAAE,KAAK,EAIjB;IAED,GAAG,WAAiB;IAKd,IAAI,CACR,UAAU,EAAE,MAAM,GAAG,GAAG,EACxB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,EACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,EACtB,IAAI,CAAC,EAAE,WAAW;IAKpB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG;IAOhC,UAAU,CAAC,GAAG,EAAE,UAAU;IAI1B,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE;IAM9B,aAAa,CAAC,GAAG,EAAE,MAAM;CAG1B;AAED,iDAAiD;AACjD,qBAAa,aAAc,SAAQ,UAAU;IAIlC,UAAU,EAAE,MAAM;IAH3B,GAAG,EAAE,GAAG,CAAA;gBAGC,UAAU,EAAE,MAAM,EACzB,UAAU,EAAE,MAAM,GAAG,GAAG;CAQ3B"}
package/dist/client.js CHANGED
@@ -1,18 +1,10 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ServiceClient = exports.Client = void 0;
4
- const lexicon_1 = require("@atproto/lexicon");
5
- const util_1 = require("./util");
6
- const xrpc_client_1 = require("./xrpc-client");
1
+ import { Lexicons } from '@atproto/lexicon';
2
+ import { combineHeaders } from './util.js';
3
+ import { XrpcClient } from './xrpc-client.js';
7
4
  /** @deprecated Use {@link XrpcClient} instead */
8
- class Client {
5
+ export class Client {
9
6
  constructor() {
10
- Object.defineProperty(this, "lex", {
11
- enumerable: true,
12
- configurable: true,
13
- writable: true,
14
- value: new lexicon_1.Lexicons()
15
- });
7
+ this.lex = new Lexicons();
16
8
  }
17
9
  /** @deprecated */
18
10
  get fetch() {
@@ -44,28 +36,15 @@ class Client {
44
36
  this.lex.remove(uri);
45
37
  }
46
38
  }
47
- exports.Client = Client;
48
39
  /** @deprecated Use {@link XrpcClient} instead */
49
- class ServiceClient extends xrpc_client_1.XrpcClient {
40
+ export class ServiceClient extends XrpcClient {
50
41
  constructor(baseClient, serviceUri) {
51
42
  super(async (input, init) => {
52
- const headers = (0, util_1.combineHeaders)(init.headers, Object.entries(this.headers));
43
+ const headers = combineHeaders(init.headers, Object.entries(this.headers));
53
44
  return fetch(new URL(input, this.uri), { ...init, headers });
54
45
  }, baseClient.lex);
55
- Object.defineProperty(this, "baseClient", {
56
- enumerable: true,
57
- configurable: true,
58
- writable: true,
59
- value: baseClient
60
- });
61
- Object.defineProperty(this, "uri", {
62
- enumerable: true,
63
- configurable: true,
64
- writable: true,
65
- value: void 0
66
- });
46
+ this.baseClient = baseClient;
67
47
  this.uri = typeof serviceUri === 'string' ? new URL(serviceUri) : serviceUri;
68
48
  }
69
49
  }
70
- exports.ServiceClient = ServiceClient;
71
50
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAAA,8CAAuD;AAEvD,iCAAuC;AACvC,+CAA0C;AAE1C,iDAAiD;AACjD,MAAa,MAAM;IAAnB;QAeE;;;;mBAAM,IAAI,kBAAQ,EAAE;WAAA;IAmCtB,CAAC;IAjDC,kBAAkB;IAClB,IAAI,KAAK;QACP,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAA;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,KAAK,CAAC,CAAQ;QAChB,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAA;IACH,CAAC;IAID,eAAe;IACf,EAAE;IAEF,KAAK,CAAC,IAAI,CACR,UAAwB,EACxB,UAAkB,EAClB,MAAoB,EACpB,IAAsB,EACtB,IAAkB;QAElB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IACtE,CAAC;IAED,OAAO,CAAC,UAAwB;QAC9B,OAAO,IAAI,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC5C,CAAC;IAED,UAAU;IACV,IAAI;IAEJ,UAAU,CAAC,GAAe;QACxB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,WAAW,CAAC,IAAkB;QAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;CACF;AAlDD,wBAkDC;AAED,iDAAiD;AACjD,MAAa,aAAc,SAAQ,wBAAU;IAG3C,YACS,UAAkB,EACzB,UAAwB;QAExB,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1B,MAAM,OAAO,GAAG,IAAA,qBAAc,EAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;YAC1E,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QAC9D,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAA;QANlB;;;;mBAAO,UAAU;WAAQ;QAH3B;;;;;WAAQ;QAUN,IAAI,CAAC,GAAG,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;IAC9E,CAAC;CACF;AAbD,sCAaC","sourcesContent":["import { LexiconDoc, Lexicons } from '@atproto/lexicon'\nimport { CallOptions, QueryParams } from './types'\nimport { combineHeaders } from './util'\nimport { XrpcClient } from './xrpc-client'\n\n/** @deprecated Use {@link XrpcClient} instead */\nexport class Client {\n /** @deprecated */\n get fetch(): never {\n throw new Error(\n 'Client.fetch is no longer supported. Use an XrpcClient instead.',\n )\n }\n\n /** @deprecated */\n set fetch(_: never) {\n throw new Error(\n 'Client.fetch is no longer supported. Use an XrpcClient instead.',\n )\n }\n\n lex = new Lexicons()\n\n // method calls\n //\n\n async call(\n serviceUri: string | URL,\n methodNsid: string,\n params?: QueryParams,\n data?: BodyInit | null,\n opts?: CallOptions,\n ) {\n return this.service(serviceUri).call(methodNsid, params, data, opts)\n }\n\n service(serviceUri: string | URL) {\n return new ServiceClient(this, serviceUri)\n }\n\n // schemas\n // =\n\n addLexicon(doc: LexiconDoc) {\n this.lex.add(doc)\n }\n\n addLexicons(docs: LexiconDoc[]) {\n for (const doc of docs) {\n this.addLexicon(doc)\n }\n }\n\n removeLexicon(uri: string) {\n this.lex.remove(uri)\n }\n}\n\n/** @deprecated Use {@link XrpcClient} instead */\nexport class ServiceClient extends XrpcClient {\n uri: URL\n\n constructor(\n public baseClient: Client,\n serviceUri: string | URL,\n ) {\n super(async (input, init) => {\n const headers = combineHeaders(init.headers, Object.entries(this.headers))\n return fetch(new URL(input, this.uri), { ...init, headers })\n }, baseClient.lex)\n this.uri = typeof serviceUri === 'string' ? new URL(serviceUri) : serviceUri\n }\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,iDAAiD;AACjD,MAAM,OAAO,MAAM;IAAnB;QAeE,QAAG,GAAG,IAAI,QAAQ,EAAE,CAAA;IAmCtB,CAAC;IAjDC,kBAAkB;IAClB,IAAI,KAAK;QACP,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAA;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,KAAK,CAAC,CAAQ;QAChB,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAA;IACH,CAAC;IAID,eAAe;IACf,EAAE;IAEF,KAAK,CAAC,IAAI,CACR,UAAwB,EACxB,UAAkB,EAClB,MAAoB,EACpB,IAAsB,EACtB,IAAkB;QAElB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IACtE,CAAC;IAED,OAAO,CAAC,UAAwB;QAC9B,OAAO,IAAI,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC5C,CAAC;IAED,UAAU;IACV,IAAI;IAEJ,UAAU,CAAC,GAAe;QACxB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,WAAW,CAAC,IAAkB;QAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;CACF;AAED,iDAAiD;AACjD,MAAM,OAAO,aAAc,SAAQ,UAAU;IAG3C,YACS,UAAkB,EACzB,UAAwB;QAExB,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1B,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;YAC1E,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QAC9D,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAA;QANX,eAAU,GAAV,UAAU,CAAQ;QAOzB,IAAI,CAAC,GAAG,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;IAC9E,CAAC;CACF","sourcesContent":["import { LexiconDoc, Lexicons } from '@atproto/lexicon'\nimport { CallOptions, QueryParams } from './types.js'\nimport { combineHeaders } from './util.js'\nimport { XrpcClient } from './xrpc-client.js'\n\n/** @deprecated Use {@link XrpcClient} instead */\nexport class Client {\n /** @deprecated */\n get fetch(): never {\n throw new Error(\n 'Client.fetch is no longer supported. Use an XrpcClient instead.',\n )\n }\n\n /** @deprecated */\n set fetch(_: never) {\n throw new Error(\n 'Client.fetch is no longer supported. Use an XrpcClient instead.',\n )\n }\n\n lex = new Lexicons()\n\n // method calls\n //\n\n async call(\n serviceUri: string | URL,\n methodNsid: string,\n params?: QueryParams,\n data?: BodyInit | null,\n opts?: CallOptions,\n ) {\n return this.service(serviceUri).call(methodNsid, params, data, opts)\n }\n\n service(serviceUri: string | URL) {\n return new ServiceClient(this, serviceUri)\n }\n\n // schemas\n // =\n\n addLexicon(doc: LexiconDoc) {\n this.lex.add(doc)\n }\n\n addLexicons(docs: LexiconDoc[]) {\n for (const doc of docs) {\n this.addLexicon(doc)\n }\n }\n\n removeLexicon(uri: string) {\n this.lex.remove(uri)\n }\n}\n\n/** @deprecated Use {@link XrpcClient} instead */\nexport class ServiceClient extends XrpcClient {\n uri: URL\n\n constructor(\n public baseClient: Client,\n serviceUri: string | URL,\n ) {\n super(async (input, init) => {\n const headers = combineHeaders(init.headers, Object.entries(this.headers))\n return fetch(new URL(input, this.uri), { ...init, headers })\n }, baseClient.lex)\n this.uri = typeof serviceUri === 'string' ? new URL(serviceUri) : serviceUri\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Gettable } from './types';
1
+ import { Gettable } from './types.js';
2
2
  export type FetchHandler = (this: void,
3
3
  /**
4
4
  * The URL (pathname + query parameters) to make the request to, without the
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-handler.d.ts","sourceRoot":"","sources":["../src/fetch-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGlC,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,IAAI;AACV;;;;GAIG;AACH,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,KACd,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEtB,MAAM,MAAM,mBAAmB,GAAG,wBAAwB,GAAG,MAAM,GAAG,GAAG,CAAA;AAEzE,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;;OAIG;IACH,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAA;IAE/B;;;;OAIG;IACH,OAAO,CAAC,EAAE;SACP,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC;KACxC,CAAA;IAED;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;CAChC,CAAA;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,CACZ,IAAI,EAAE,kBAAkB;IACxB;;;;OAIG;IACH,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,KACd,OAAO,CAAC,QAAQ,CAAC,CAAA;CACvB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,YAAY,GAAG,kBAAkB,GAAG,mBAAmB,GAC/D,YAAY,CAgCd"}
1
+ {"version":3,"file":"fetch-handler.d.ts","sourceRoot":"","sources":["../src/fetch-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAGrC,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,IAAI;AACV;;;;GAIG;AACH,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,KACd,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEtB,MAAM,MAAM,mBAAmB,GAAG,wBAAwB,GAAG,MAAM,GAAG,GAAG,CAAA;AAEzE,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;;OAIG;IACH,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAA;IAE/B;;;;OAIG;IACH,OAAO,CAAC,EAAE;SACP,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC;KACxC,CAAA;IAED;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;CAChC,CAAA;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,CACZ,IAAI,EAAE,kBAAkB;IACxB;;;;OAIG;IACH,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,KACd,OAAO,CAAC,QAAQ,CAAC,CAAA;CACvB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,YAAY,GAAG,kBAAkB,GAAG,mBAAmB,GAC/D,YAAY,CAgCd"}
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildFetchHandler = buildFetchHandler;
4
- const util_1 = require("./util");
5
- function buildFetchHandler(options) {
1
+ import { combineHeaders } from './util.js';
2
+ export function buildFetchHandler(options) {
6
3
  // Already a fetch handler (allowed for convenience)
7
4
  if (typeof options === 'function')
8
5
  return options;
@@ -19,7 +16,7 @@ function buildFetchHandler(options) {
19
16
  return async function (url, init) {
20
17
  const base = typeof service === 'function' ? service() : service;
21
18
  const fullUrl = new URL(url, base);
22
- const headers = (0, util_1.combineHeaders)(init.headers, defaultHeadersEntries);
19
+ const headers = combineHeaders(init.headers, defaultHeadersEntries);
23
20
  return fetch(fullUrl, { ...init, headers });
24
21
  };
25
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-handler.js","sourceRoot":"","sources":["../src/fetch-handler.ts"],"names":[],"mappings":";;AAuDA,8CAkCC;AAxFD,iCAAuC;AAsDvC,SAAgB,iBAAiB,CAC/B,OAAgE;IAEhE,oDAAoD;IACpD,IAAI,OAAO,OAAO,KAAK,UAAU;QAAE,OAAO,OAAO,CAAA;IACjD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,cAAc,IAAI,OAAO,EAAE,CAAC;QAC7D,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,EACJ,OAAO,EACP,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,KAAK,GAAG,UAAU,CAAC,KAAK,GACzB,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,YAAY,GAAG;QACvD,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE;QACtB,CAAC,CAAC,OAAO,CAAA;IAEX,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CACjB,sEAAsE,CACvE,CAAA;IACH,CAAC;IAED,MAAM,qBAAqB,GACzB,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAErE,OAAO,KAAK,WAAW,GAAG,EAAE,IAAI;QAC9B,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;QAChE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAElC,MAAM,OAAO,GAAG,IAAA,qBAAc,EAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAA;QAEnE,OAAO,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;IAC7C,CAAC,CAAA;AACH,CAAC","sourcesContent":["import { Gettable } from './types'\nimport { combineHeaders } from './util'\n\nexport type FetchHandler = (\n this: void,\n /**\n * The URL (pathname + query parameters) to make the request to, without the\n * origin. The origin (protocol, hostname, and port) must be added by this\n * {@link FetchHandler}, typically based on authentication or other factors.\n */\n url: string,\n init: RequestInit,\n) => Promise<Response>\n\nexport type FetchHandlerOptions = BuildFetchHandlerOptions | string | URL\n\nexport type BuildFetchHandlerOptions = {\n /**\n * The service URL to make requests to. This can be a string, URL, or a\n * function that returns a string or URL. This is useful for dynamic URLs,\n * such as a service URL that changes based on authentication.\n */\n service: Gettable<string | URL>\n\n /**\n * Headers to be added to every request. If a function is provided, it will be\n * called on each request to get the headers. This is useful for dynamic\n * headers, such as authentication tokens that may expire.\n */\n headers?: {\n [_ in string]?: Gettable<null | string>\n }\n\n /**\n * Bring your own fetch implementation. Typically useful for testing, logging,\n * mocking, or adding retries, session management, signatures, proof of\n * possession (DPoP), SSRF protection, etc. Defaults to the global `fetch`\n * function.\n */\n fetch?: typeof globalThis.fetch\n}\n\nexport interface FetchHandlerObject {\n fetchHandler: (\n this: FetchHandlerObject,\n /**\n * The URL (pathname + query parameters) to make the request to, without the\n * origin. The origin (protocol, hostname, and port) must be added by this\n * {@link FetchHandler}, typically based on authentication or other factors.\n */\n url: string,\n init: RequestInit,\n ) => Promise<Response>\n}\n\nexport function buildFetchHandler(\n options: FetchHandler | FetchHandlerObject | FetchHandlerOptions,\n): FetchHandler {\n // Already a fetch handler (allowed for convenience)\n if (typeof options === 'function') return options\n if (typeof options === 'object' && 'fetchHandler' in options) {\n return options.fetchHandler.bind(options)\n }\n\n const {\n service,\n headers: defaultHeaders = undefined,\n fetch = globalThis.fetch,\n } = typeof options === 'string' || options instanceof URL\n ? { service: options }\n : options\n\n if (typeof fetch !== 'function') {\n throw new TypeError(\n 'XrpcDispatcher requires fetch() to be available in your environment.',\n )\n }\n\n const defaultHeadersEntries =\n defaultHeaders != null ? Object.entries(defaultHeaders) : undefined\n\n return async function (url, init) {\n const base = typeof service === 'function' ? service() : service\n const fullUrl = new URL(url, base)\n\n const headers = combineHeaders(init.headers, defaultHeadersEntries)\n\n return fetch(fullUrl, { ...init, headers })\n }\n}\n"]}
1
+ {"version":3,"file":"fetch-handler.js","sourceRoot":"","sources":["../src/fetch-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAsD1C,MAAM,UAAU,iBAAiB,CAC/B,OAAgE;IAEhE,oDAAoD;IACpD,IAAI,OAAO,OAAO,KAAK,UAAU;QAAE,OAAO,OAAO,CAAA;IACjD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,cAAc,IAAI,OAAO,EAAE,CAAC;QAC7D,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,EACJ,OAAO,EACP,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,KAAK,GAAG,UAAU,CAAC,KAAK,GACzB,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,YAAY,GAAG;QACvD,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE;QACtB,CAAC,CAAC,OAAO,CAAA;IAEX,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CACjB,sEAAsE,CACvE,CAAA;IACH,CAAC;IAED,MAAM,qBAAqB,GACzB,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAErE,OAAO,KAAK,WAAW,GAAG,EAAE,IAAI;QAC9B,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;QAChE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAElC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAA;QAEnE,OAAO,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;IAC7C,CAAC,CAAA;AACH,CAAC","sourcesContent":["import { Gettable } from './types.js'\nimport { combineHeaders } from './util.js'\n\nexport type FetchHandler = (\n this: void,\n /**\n * The URL (pathname + query parameters) to make the request to, without the\n * origin. The origin (protocol, hostname, and port) must be added by this\n * {@link FetchHandler}, typically based on authentication or other factors.\n */\n url: string,\n init: RequestInit,\n) => Promise<Response>\n\nexport type FetchHandlerOptions = BuildFetchHandlerOptions | string | URL\n\nexport type BuildFetchHandlerOptions = {\n /**\n * The service URL to make requests to. This can be a string, URL, or a\n * function that returns a string or URL. This is useful for dynamic URLs,\n * such as a service URL that changes based on authentication.\n */\n service: Gettable<string | URL>\n\n /**\n * Headers to be added to every request. If a function is provided, it will be\n * called on each request to get the headers. This is useful for dynamic\n * headers, such as authentication tokens that may expire.\n */\n headers?: {\n [_ in string]?: Gettable<null | string>\n }\n\n /**\n * Bring your own fetch implementation. Typically useful for testing, logging,\n * mocking, or adding retries, session management, signatures, proof of\n * possession (DPoP), SSRF protection, etc. Defaults to the global `fetch`\n * function.\n */\n fetch?: typeof globalThis.fetch\n}\n\nexport interface FetchHandlerObject {\n fetchHandler: (\n this: FetchHandlerObject,\n /**\n * The URL (pathname + query parameters) to make the request to, without the\n * origin. The origin (protocol, hostname, and port) must be added by this\n * {@link FetchHandler}, typically based on authentication or other factors.\n */\n url: string,\n init: RequestInit,\n ) => Promise<Response>\n}\n\nexport function buildFetchHandler(\n options: FetchHandler | FetchHandlerObject | FetchHandlerOptions,\n): FetchHandler {\n // Already a fetch handler (allowed for convenience)\n if (typeof options === 'function') return options\n if (typeof options === 'object' && 'fetchHandler' in options) {\n return options.fetchHandler.bind(options)\n }\n\n const {\n service,\n headers: defaultHeaders = undefined,\n fetch = globalThis.fetch,\n } = typeof options === 'string' || options instanceof URL\n ? { service: options }\n : options\n\n if (typeof fetch !== 'function') {\n throw new TypeError(\n 'XrpcDispatcher requires fetch() to be available in your environment.',\n )\n }\n\n const defaultHeadersEntries =\n defaultHeaders != null ? Object.entries(defaultHeaders) : undefined\n\n return async function (url, init) {\n const base = typeof service === 'function' ? service() : service\n const fullUrl = new URL(url, base)\n\n const headers = combineHeaders(init.headers, defaultHeadersEntries)\n\n return fetch(fullUrl, { ...init, headers })\n }\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- export * from './client';
2
- export * from './fetch-handler';
3
- export * from './types';
4
- export * from './util';
5
- export * from './xrpc-client';
6
- import { Client } from './client';
1
+ export * from './client.js';
2
+ export * from './fetch-handler.js';
3
+ export * from './types.js';
4
+ export * from './util.js';
5
+ export * from './xrpc-client.js';
6
+ import { Client } from './client.js';
7
7
  /** @deprecated create a local {@link XrpcClient} instance instead */
8
8
  declare const defaultInst: Client;
9
9
  export default defaultInst;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAG7B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,qEAAqE;AACrE,QAAA,MAAM,WAAW,QAAe,CAAA;AAChC,eAAe,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,kBAAkB,CAAA;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,qEAAqE;AACrE,QAAA,MAAM,WAAW,QAAe,CAAA;AAChC,eAAe,WAAW,CAAA"}
package/dist/index.js CHANGED
@@ -1,28 +1,10 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./client"), exports);
18
- __exportStar(require("./fetch-handler"), exports);
19
- __exportStar(require("./types"), exports);
20
- __exportStar(require("./util"), exports);
21
- __exportStar(require("./xrpc-client"), exports);
22
- /* eslint-disable import/no-deprecated */
23
- const client_1 = require("./client");
1
+ export * from './client.js';
2
+ export * from './fetch-handler.js';
3
+ export * from './types.js';
4
+ export * from './util.js';
5
+ export * from './xrpc-client.js';
6
+ import { Client } from './client.js';
24
7
  /** @deprecated create a local {@link XrpcClient} instance instead */
25
- const defaultInst = new client_1.Client();
26
- exports.default = defaultInst;
27
- /* eslint-enable import/no-deprecated */
8
+ const defaultInst = new Client();
9
+ export default defaultInst;
28
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAwB;AACxB,kDAA+B;AAC/B,0CAAuB;AACvB,yCAAsB;AACtB,gDAA6B;AAE7B,yCAAyC;AACzC,qCAAiC;AACjC,qEAAqE;AACrE,MAAM,WAAW,GAAG,IAAI,eAAM,EAAE,CAAA;AAChC,kBAAe,WAAW,CAAA;AAC1B,wCAAwC","sourcesContent":["export * from './client'\nexport * from './fetch-handler'\nexport * from './types'\nexport * from './util'\nexport * from './xrpc-client'\n\n/* eslint-disable import/no-deprecated */\nimport { Client } from './client'\n/** @deprecated create a local {@link XrpcClient} instance instead */\nconst defaultInst = new Client()\nexport default defaultInst\n/* eslint-enable import/no-deprecated */\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,kBAAkB,CAAA;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,qEAAqE;AACrE,MAAM,WAAW,GAAG,IAAI,MAAM,EAAE,CAAA;AAChC,eAAe,WAAW,CAAA","sourcesContent":["export * from './client.js'\nexport * from './fetch-handler.js'\nexport * from './types.js'\nexport * from './util.js'\nexport * from './xrpc-client.js'\n\nimport { Client } from './client.js'\n/** @deprecated create a local {@link XrpcClient} instance instead */\nconst defaultInst = new Client()\nexport default defaultInst\n"]}
package/dist/types.js CHANGED
@@ -1,15 +1,9 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.XRPCInvalidResponseError = exports.XRPCError = exports.XRPCResponse = exports.ResponseTypeStrings = exports.ResponseType = exports.errorResponseBody = void 0;
4
- exports.httpResponseCodeToEnum = httpResponseCodeToEnum;
5
- exports.httpResponseCodeToName = httpResponseCodeToName;
6
- exports.httpResponseCodeToString = httpResponseCodeToString;
7
- const zod_1 = require("zod");
8
- exports.errorResponseBody = zod_1.z.object({
9
- error: zod_1.z.string().optional(),
10
- message: zod_1.z.string().optional(),
1
+ import { z } from 'zod';
2
+ export const errorResponseBody = z.object({
3
+ error: z.string().optional(),
4
+ message: z.string().optional(),
11
5
  });
12
- var ResponseType;
6
+ export var ResponseType;
13
7
  (function (ResponseType) {
14
8
  /**
15
9
  * Network issue, unable to get response from the server.
@@ -33,8 +27,8 @@ var ResponseType;
33
27
  ResponseType[ResponseType["UpstreamFailure"] = 502] = "UpstreamFailure";
34
28
  ResponseType[ResponseType["NotEnoughResources"] = 503] = "NotEnoughResources";
35
29
  ResponseType[ResponseType["UpstreamTimeout"] = 504] = "UpstreamTimeout";
36
- })(ResponseType || (exports.ResponseType = ResponseType = {}));
37
- function httpResponseCodeToEnum(status) {
30
+ })(ResponseType || (ResponseType = {}));
31
+ export function httpResponseCodeToEnum(status) {
38
32
  if (status in ResponseType) {
39
33
  return status;
40
34
  }
@@ -54,10 +48,10 @@ function httpResponseCodeToEnum(status) {
54
48
  return ResponseType.InternalServerError;
55
49
  }
56
50
  }
57
- function httpResponseCodeToName(status) {
51
+ export function httpResponseCodeToName(status) {
58
52
  return ResponseType[httpResponseCodeToEnum(status)];
59
53
  }
60
- exports.ResponseTypeStrings = {
54
+ export const ResponseTypeStrings = {
61
55
  [ResponseType.Unknown]: 'Unknown',
62
56
  [ResponseType.InvalidResponse]: 'Invalid Response',
63
57
  [ResponseType.Success]: 'Success',
@@ -75,59 +69,22 @@ exports.ResponseTypeStrings = {
75
69
  [ResponseType.NotEnoughResources]: 'Not Enough Resources',
76
70
  [ResponseType.UpstreamTimeout]: 'Upstream Timeout',
77
71
  };
78
- function httpResponseCodeToString(status) {
79
- return exports.ResponseTypeStrings[httpResponseCodeToEnum(status)];
72
+ export function httpResponseCodeToString(status) {
73
+ return ResponseTypeStrings[httpResponseCodeToEnum(status)];
80
74
  }
81
- class XRPCResponse {
75
+ export class XRPCResponse {
82
76
  constructor(data, headers) {
83
- Object.defineProperty(this, "data", {
84
- enumerable: true,
85
- configurable: true,
86
- writable: true,
87
- value: data
88
- });
89
- Object.defineProperty(this, "headers", {
90
- enumerable: true,
91
- configurable: true,
92
- writable: true,
93
- value: headers
94
- });
95
- Object.defineProperty(this, "success", {
96
- enumerable: true,
97
- configurable: true,
98
- writable: true,
99
- value: true
100
- });
77
+ this.data = data;
78
+ this.headers = headers;
79
+ this.success = true;
101
80
  }
102
81
  }
103
- exports.XRPCResponse = XRPCResponse;
104
- class XRPCError extends Error {
82
+ export class XRPCError extends Error {
105
83
  constructor(statusCode, error = httpResponseCodeToName(statusCode), message, headers, options) {
106
84
  super(message || error || httpResponseCodeToString(statusCode), options);
107
- Object.defineProperty(this, "error", {
108
- enumerable: true,
109
- configurable: true,
110
- writable: true,
111
- value: error
112
- });
113
- Object.defineProperty(this, "headers", {
114
- enumerable: true,
115
- configurable: true,
116
- writable: true,
117
- value: headers
118
- });
119
- Object.defineProperty(this, "success", {
120
- enumerable: true,
121
- configurable: true,
122
- writable: true,
123
- value: false
124
- });
125
- Object.defineProperty(this, "status", {
126
- enumerable: true,
127
- configurable: true,
128
- writable: true,
129
- value: void 0
130
- });
85
+ this.error = error;
86
+ this.headers = headers;
87
+ this.success = false;
131
88
  this.status = httpResponseCodeToEnum(statusCode);
132
89
  // Pre 2022 runtimes won't handle the "options" constructor argument
133
90
  const cause = options?.cause;
@@ -164,32 +121,15 @@ class XRPCError extends Error {
164
121
  return new XRPCError(status, undefined, message, headers, { cause });
165
122
  }
166
123
  }
167
- exports.XRPCError = XRPCError;
168
- class XRPCInvalidResponseError extends XRPCError {
124
+ export class XRPCInvalidResponseError extends XRPCError {
169
125
  constructor(lexiconNsid, validationError, responseBody) {
170
126
  super(ResponseType.InvalidResponse,
171
127
  // @NOTE: This is probably wrong and should use ResponseTypeNames instead.
172
128
  // But it would mean a breaking change.
173
- exports.ResponseTypeStrings[ResponseType.InvalidResponse], `The server gave an invalid response and may be out of date.`, undefined, { cause: validationError });
174
- Object.defineProperty(this, "lexiconNsid", {
175
- enumerable: true,
176
- configurable: true,
177
- writable: true,
178
- value: lexiconNsid
179
- });
180
- Object.defineProperty(this, "validationError", {
181
- enumerable: true,
182
- configurable: true,
183
- writable: true,
184
- value: validationError
185
- });
186
- Object.defineProperty(this, "responseBody", {
187
- enumerable: true,
188
- configurable: true,
189
- writable: true,
190
- value: responseBody
191
- });
129
+ ResponseTypeStrings[ResponseType.InvalidResponse], `The server gave an invalid response and may be out of date.`, undefined, { cause: validationError });
130
+ this.lexiconNsid = lexiconNsid;
131
+ this.validationError = validationError;
132
+ this.responseBody = responseBody;
192
133
  }
193
134
  }
194
- exports.XRPCInvalidResponseError = XRPCInvalidResponseError;
195
135
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { ValidationError } from '@atproto/lexicon'\n\nexport type QueryParams = Record<string, any>\nexport type HeadersMap = Record<string, string | undefined>\n\nexport type {\n /** @deprecated not to be confused with the WHATWG Headers constructor */\n HeadersMap as Headers,\n}\n\nexport type Gettable<T> = T | (() => T)\n\nexport interface CallOptions {\n encoding?: string\n signal?: AbortSignal\n headers?: HeadersMap\n}\n\nexport const errorResponseBody = z.object({\n error: z.string().optional(),\n message: z.string().optional(),\n})\nexport type ErrorResponseBody = z.infer<typeof errorResponseBody>\n\nexport enum ResponseType {\n /**\n * Network issue, unable to get response from the server.\n */\n Unknown = 1,\n /**\n * Response failed lexicon validation.\n */\n InvalidResponse = 2,\n Success = 200,\n InvalidRequest = 400,\n AuthenticationRequired = 401,\n Forbidden = 403,\n XRPCNotSupported = 404,\n NotAcceptable = 406,\n PayloadTooLarge = 413,\n UnsupportedMediaType = 415,\n RateLimitExceeded = 429,\n InternalServerError = 500,\n MethodNotImplemented = 501,\n UpstreamFailure = 502,\n NotEnoughResources = 503,\n UpstreamTimeout = 504,\n}\n\nexport function httpResponseCodeToEnum(status: number): ResponseType {\n if (status in ResponseType) {\n return status\n } else if (status >= 100 && status < 200) {\n return ResponseType.XRPCNotSupported\n } else if (status >= 200 && status < 300) {\n return ResponseType.Success\n } else if (status >= 300 && status < 400) {\n return ResponseType.XRPCNotSupported\n } else if (status >= 400 && status < 500) {\n return ResponseType.InvalidRequest\n } else {\n return ResponseType.InternalServerError\n }\n}\n\nexport function httpResponseCodeToName(status: number): string {\n return ResponseType[httpResponseCodeToEnum(status)]\n}\n\nexport const ResponseTypeStrings = {\n [ResponseType.Unknown]: 'Unknown',\n [ResponseType.InvalidResponse]: 'Invalid Response',\n [ResponseType.Success]: 'Success',\n [ResponseType.InvalidRequest]: 'Invalid Request',\n [ResponseType.AuthenticationRequired]: 'Authentication Required',\n [ResponseType.Forbidden]: 'Forbidden',\n [ResponseType.XRPCNotSupported]: 'XRPC Not Supported',\n [ResponseType.NotAcceptable]: 'Not Acceptable',\n [ResponseType.PayloadTooLarge]: 'Payload Too Large',\n [ResponseType.UnsupportedMediaType]: 'Unsupported Media Type',\n [ResponseType.RateLimitExceeded]: 'Rate Limit Exceeded',\n [ResponseType.InternalServerError]: 'Internal Server Error',\n [ResponseType.MethodNotImplemented]: 'Method Not Implemented',\n [ResponseType.UpstreamFailure]: 'Upstream Failure',\n [ResponseType.NotEnoughResources]: 'Not Enough Resources',\n [ResponseType.UpstreamTimeout]: 'Upstream Timeout',\n} as const satisfies Record<ResponseType, string>\n\nexport function httpResponseCodeToString(status: number): string {\n return ResponseTypeStrings[httpResponseCodeToEnum(status)]\n}\n\nexport class XRPCResponse {\n success = true\n\n constructor(\n public data: any,\n public headers: HeadersMap,\n ) {}\n}\n\nexport class XRPCError extends Error {\n success = false\n\n public status: ResponseType\n\n constructor(\n statusCode: number,\n public error: string = httpResponseCodeToName(statusCode),\n message?: string,\n public headers?: HeadersMap,\n options?: ErrorOptions,\n ) {\n super(message || error || httpResponseCodeToString(statusCode), options)\n\n this.status = httpResponseCodeToEnum(statusCode)\n\n // Pre 2022 runtimes won't handle the \"options\" constructor argument\n const cause = options?.cause\n if (this.cause === undefined && cause !== undefined) {\n this.cause = cause\n }\n }\n\n static from(cause: unknown, fallbackStatus?: ResponseType): XRPCError {\n if (cause instanceof XRPCError) {\n return cause\n }\n\n // Type cast the cause to an Error if it is one\n const causeErr = cause instanceof Error ? cause : undefined\n\n // Try and find a Response object in the cause\n const causeResponse: Response | undefined =\n cause instanceof Response\n ? cause\n : cause?.['response'] instanceof Response\n ? cause['response']\n : undefined\n\n const statusCode: unknown =\n // Extract status code from \"http-errors\" like errors\n causeErr?.['statusCode'] ??\n causeErr?.['status'] ??\n // Use the status code from the response object as fallback\n causeResponse?.status\n\n // Convert the status code to a ResponseType\n const status: ResponseType =\n typeof statusCode === 'number'\n ? httpResponseCodeToEnum(statusCode)\n : fallbackStatus ?? ResponseType.Unknown\n\n const message = causeErr?.message ?? String(cause)\n\n const headers = causeResponse\n ? Object.fromEntries(causeResponse.headers.entries())\n : undefined\n\n return new XRPCError(status, undefined, message, headers, { cause })\n }\n}\n\nexport class XRPCInvalidResponseError extends XRPCError {\n constructor(\n public lexiconNsid: string,\n public validationError: ValidationError,\n public responseBody: unknown,\n ) {\n super(\n ResponseType.InvalidResponse,\n // @NOTE: This is probably wrong and should use ResponseTypeNames instead.\n // But it would mean a breaking change.\n ResponseTypeStrings[ResponseType.InvalidResponse],\n `The server gave an invalid response and may be out of date.`,\n undefined,\n { cause: validationError },\n )\n }\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { ValidationError } from '@atproto/lexicon'\n\nexport type QueryParams = Record<string, any>\nexport type HeadersMap = Record<string, string | undefined>\n\nexport type {\n /** @deprecated not to be confused with the WHATWG Headers constructor */\n HeadersMap as Headers,\n}\n\nexport type Gettable<T> = T | (() => T)\n\nexport interface CallOptions {\n encoding?: string\n signal?: AbortSignal\n headers?: HeadersMap\n}\n\nexport const errorResponseBody = z.object({\n error: z.string().optional(),\n message: z.string().optional(),\n})\nexport type ErrorResponseBody = z.infer<typeof errorResponseBody>\n\nexport enum ResponseType {\n /**\n * Network issue, unable to get response from the server.\n */\n Unknown = 1,\n /**\n * Response failed lexicon validation.\n */\n InvalidResponse = 2,\n Success = 200,\n InvalidRequest = 400,\n AuthenticationRequired = 401,\n Forbidden = 403,\n XRPCNotSupported = 404,\n NotAcceptable = 406,\n PayloadTooLarge = 413,\n UnsupportedMediaType = 415,\n RateLimitExceeded = 429,\n InternalServerError = 500,\n MethodNotImplemented = 501,\n UpstreamFailure = 502,\n NotEnoughResources = 503,\n UpstreamTimeout = 504,\n}\n\nexport function httpResponseCodeToEnum(status: number): ResponseType {\n if (status in ResponseType) {\n return status\n } else if (status >= 100 && status < 200) {\n return ResponseType.XRPCNotSupported\n } else if (status >= 200 && status < 300) {\n return ResponseType.Success\n } else if (status >= 300 && status < 400) {\n return ResponseType.XRPCNotSupported\n } else if (status >= 400 && status < 500) {\n return ResponseType.InvalidRequest\n } else {\n return ResponseType.InternalServerError\n }\n}\n\nexport function httpResponseCodeToName(status: number): string {\n return ResponseType[httpResponseCodeToEnum(status)]\n}\n\nexport const ResponseTypeStrings = {\n [ResponseType.Unknown]: 'Unknown',\n [ResponseType.InvalidResponse]: 'Invalid Response',\n [ResponseType.Success]: 'Success',\n [ResponseType.InvalidRequest]: 'Invalid Request',\n [ResponseType.AuthenticationRequired]: 'Authentication Required',\n [ResponseType.Forbidden]: 'Forbidden',\n [ResponseType.XRPCNotSupported]: 'XRPC Not Supported',\n [ResponseType.NotAcceptable]: 'Not Acceptable',\n [ResponseType.PayloadTooLarge]: 'Payload Too Large',\n [ResponseType.UnsupportedMediaType]: 'Unsupported Media Type',\n [ResponseType.RateLimitExceeded]: 'Rate Limit Exceeded',\n [ResponseType.InternalServerError]: 'Internal Server Error',\n [ResponseType.MethodNotImplemented]: 'Method Not Implemented',\n [ResponseType.UpstreamFailure]: 'Upstream Failure',\n [ResponseType.NotEnoughResources]: 'Not Enough Resources',\n [ResponseType.UpstreamTimeout]: 'Upstream Timeout',\n} as const satisfies Record<ResponseType, string>\n\nexport function httpResponseCodeToString(status: number): string {\n return ResponseTypeStrings[httpResponseCodeToEnum(status)]\n}\n\nexport class XRPCResponse {\n success = true\n\n constructor(\n public data: any,\n public headers: HeadersMap,\n ) {}\n}\n\nexport class XRPCError extends Error {\n success = false\n\n public status: ResponseType\n\n constructor(\n statusCode: number,\n public error: string = httpResponseCodeToName(statusCode),\n message?: string,\n public headers?: HeadersMap,\n options?: ErrorOptions,\n ) {\n super(message || error || httpResponseCodeToString(statusCode), options)\n\n this.status = httpResponseCodeToEnum(statusCode)\n\n // Pre 2022 runtimes won't handle the \"options\" constructor argument\n const cause = options?.cause\n if (this.cause === undefined && cause !== undefined) {\n this.cause = cause\n }\n }\n\n static from(cause: unknown, fallbackStatus?: ResponseType): XRPCError {\n if (cause instanceof XRPCError) {\n return cause\n }\n\n // Type cast the cause to an Error if it is one\n const causeErr = cause instanceof Error ? cause : undefined\n\n // Try and find a Response object in the cause\n const causeResponse: Response | undefined =\n cause instanceof Response\n ? cause\n : cause?.['response'] instanceof Response\n ? cause['response']\n : undefined\n\n const statusCode: unknown =\n // Extract status code from \"http-errors\" like errors\n causeErr?.['statusCode'] ??\n causeErr?.['status'] ??\n // Use the status code from the response object as fallback\n causeResponse?.status\n\n // Convert the status code to a ResponseType\n const status: ResponseType =\n typeof statusCode === 'number'\n ? httpResponseCodeToEnum(statusCode)\n : fallbackStatus ?? ResponseType.Unknown\n\n const message = causeErr?.message ?? String(cause)\n\n const headers = causeResponse\n ? Object.fromEntries(causeResponse.headers.entries())\n : undefined\n\n return new XRPCError(status, undefined, message, headers, { cause })\n }\n}\n\nexport class XRPCInvalidResponseError extends XRPCError {\n constructor(\n public lexiconNsid: string,\n public validationError: ValidationError,\n public responseBody: unknown,\n ) {\n super(\n ResponseType.InvalidResponse,\n // @NOTE: This is probably wrong and should use ResponseTypeNames instead.\n // But it would mean a breaking change.\n ResponseTypeStrings[ResponseType.InvalidResponse],\n `The server gave an invalid response and may be out of date.`,\n undefined,\n { cause: validationError },\n )\n }\n}\n"]}
package/dist/util.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { LexXrpcProcedure, LexXrpcQuery } from '@atproto/lexicon';
2
- import { CallOptions, ErrorResponseBody, Gettable, QueryParams } from './types';
2
+ import { CallOptions, ErrorResponseBody, Gettable, QueryParams } from './types.js';
3
3
  export declare function isErrorResponseBody(v: unknown): v is ErrorResponseBody;
4
4
  export declare function getMethodSchemaHTTPMethod(schema: LexXrpcProcedure | LexXrpcQuery): "post" | "get";
5
5
  export declare function constructMethodCallUri(nsid: string, schema: LexXrpcProcedure | LexXrpcQuery, serviceUri: URL, params?: QueryParams): string;
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,YAAY,EAGb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,WAAW,EAIZ,MAAM,SAAS,CAAA;AAYhB,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,iBAAiB,CAEtE;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,gBAAgB,GAAG,YAAY,kBAMxC;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,GAAG,YAAY,EACvC,UAAU,EAAE,GAAG,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CAGR;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,GAAG,YAAY,EACvC,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CA6BR;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EACA,QAAQ,GACR,OAAO,GACP,SAAS,GACT,SAAS,GACT,UAAU,GACV,OAAO,GACP,SAAS,EACb,KAAK,EAAE,GAAG,GACT,MAAM,CAiBR;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,gBAAgB,GAAG,YAAY,EACvC,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAoET;AAED,wBAAgB,cAAc,CAC5B,WAAW,EAAE,SAAS,GAAG,WAAW,EACpC,cAAc,CAAC,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GACvE,SAAS,GAAG,WAAW,CAuBzB;AAmBD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAgB5D;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAMrD;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,OAAO,GACb,QAAQ,GAAG,SAAS,CAqEtB;AAwBD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,IAAI,EAAE,WAAW,GAAG,SAAS,GAC5B,GAAG,CAwBL"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,YAAY,EAGb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,WAAW,EAIZ,MAAM,YAAY,CAAA;AAYnB,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,iBAAiB,CAEtE;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,gBAAgB,GAAG,YAAY,kBAMxC;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,GAAG,YAAY,EACvC,UAAU,EAAE,GAAG,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CAGR;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,GAAG,YAAY,EACvC,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CA6BR;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EACA,QAAQ,GACR,OAAO,GACP,SAAS,GACT,SAAS,GACT,UAAU,GACV,OAAO,GACP,SAAS,EACb,KAAK,EAAE,GAAG,GACT,MAAM,CAiBR;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,gBAAgB,GAAG,YAAY,EACvC,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAoET;AAED,wBAAgB,cAAc,CAC5B,WAAW,EAAE,SAAS,GAAG,WAAW,EACpC,cAAc,CAAC,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GACvE,SAAS,GAAG,WAAW,CAuBzB;AAmBD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAgB5D;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAMrD;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,OAAO,GACb,QAAQ,GAAG,SAAS,CAqEtB;AAwBD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,IAAI,EAAE,WAAW,GAAG,SAAS,GAC5B,GAAG,CAwBL"}
package/dist/util.js CHANGED
@@ -1,18 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isErrorResponseBody = isErrorResponseBody;
4
- exports.getMethodSchemaHTTPMethod = getMethodSchemaHTTPMethod;
5
- exports.constructMethodCallUri = constructMethodCallUri;
6
- exports.constructMethodCallUrl = constructMethodCallUrl;
7
- exports.encodeQueryParam = encodeQueryParam;
8
- exports.constructMethodCallHeaders = constructMethodCallHeaders;
9
- exports.combineHeaders = combineHeaders;
10
- exports.isBodyInit = isBodyInit;
11
- exports.isIterable = isIterable;
12
- exports.encodeMethodCallBody = encodeMethodCallBody;
13
- exports.httpResponseBodyParse = httpResponseBodyParse;
14
- const lexicon_1 = require("@atproto/lexicon");
15
- const types_1 = require("./types");
1
+ import { jsonStringToLex, stringifyLex, } from '@atproto/lexicon';
2
+ import { ResponseType, XRPCError, errorResponseBody, } from './types.js';
16
3
  const ReadableStream = globalThis.ReadableStream ||
17
4
  class {
18
5
  constructor() {
@@ -21,20 +8,20 @@ const ReadableStream = globalThis.ReadableStream ||
21
8
  throw new Error('ReadableStream is not supported in this environment');
22
9
  }
23
10
  };
24
- function isErrorResponseBody(v) {
25
- return types_1.errorResponseBody.safeParse(v).success;
11
+ export function isErrorResponseBody(v) {
12
+ return errorResponseBody.safeParse(v).success;
26
13
  }
27
- function getMethodSchemaHTTPMethod(schema) {
14
+ export function getMethodSchemaHTTPMethod(schema) {
28
15
  if (schema.type === 'procedure') {
29
16
  return 'post';
30
17
  }
31
18
  return 'get';
32
19
  }
33
- function constructMethodCallUri(nsid, schema, serviceUri, params) {
20
+ export function constructMethodCallUri(nsid, schema, serviceUri, params) {
34
21
  const uri = new URL(constructMethodCallUrl(nsid, schema, params), serviceUri);
35
22
  return uri.toString();
36
23
  }
37
- function constructMethodCallUrl(nsid, schema, params) {
24
+ export function constructMethodCallUrl(nsid, schema, params) {
38
25
  const pathname = `/xrpc/${encodeURIComponent(nsid)}`;
39
26
  if (!params)
40
27
  return pathname;
@@ -63,7 +50,7 @@ function constructMethodCallUrl(nsid, schema, params) {
63
50
  return pathname;
64
51
  return `${pathname}?${new URLSearchParams(searchParams).toString()}`;
65
52
  }
66
- function encodeQueryParam(type, value) {
53
+ export function encodeQueryParam(type, value) {
67
54
  if (type === 'string' || type === 'unknown') {
68
55
  return String(value);
69
56
  }
@@ -84,7 +71,7 @@ function encodeQueryParam(type, value) {
84
71
  }
85
72
  throw new Error(`Unsupported query param type: ${type}`);
86
73
  }
87
- function constructMethodCallHeaders(schema, data, opts) {
74
+ export function constructMethodCallHeaders(schema, data, opts) {
88
75
  // Not using `new Headers(opts?.headers)` to avoid duplicating headers values
89
76
  // due to inconsistent casing in headers name. In case of multiple headers
90
77
  // with the same name (but using a different case), the last one will be used.
@@ -141,13 +128,13 @@ function constructMethodCallHeaders(schema, data, opts) {
141
128
  }
142
129
  else {
143
130
  // symbol, function, bigint
144
- throw new types_1.XRPCError(types_1.ResponseType.InvalidRequest, `Unsupported data type: ${typeof data}`);
131
+ throw new XRPCError(ResponseType.InvalidRequest, `Unsupported data type: ${typeof data}`);
145
132
  }
146
133
  }
147
134
  }
148
135
  return headers;
149
136
  }
150
- function combineHeaders(headersInit, defaultHeaders) {
137
+ export function combineHeaders(headersInit, defaultHeaders) {
151
138
  if (!defaultHeaders)
152
139
  return headersInit;
153
140
  let headers = undefined;
@@ -157,7 +144,7 @@ function combineHeaders(headersInit, defaultHeaders) {
157
144
  if (definition === undefined)
158
145
  continue;
159
146
  // Lazy initialization of the headers object
160
- headers ?? (headers = new Headers(headersInit));
147
+ headers ??= new Headers(headersInit);
161
148
  if (headers.has(name))
162
149
  continue;
163
150
  const value = typeof definition === 'function' ? definition() : definition;
@@ -186,7 +173,7 @@ function isBlobLike(value) {
186
173
  }
187
174
  return false;
188
175
  }
189
- function isBodyInit(value) {
176
+ export function isBodyInit(value) {
190
177
  switch (typeof value) {
191
178
  case 'string':
192
179
  return true;
@@ -201,12 +188,12 @@ function isBodyInit(value) {
201
188
  return false;
202
189
  }
203
190
  }
204
- function isIterable(value) {
191
+ export function isIterable(value) {
205
192
  return (value != null &&
206
193
  typeof value === 'object' &&
207
194
  (Symbol.iterator in value || Symbol.asyncIterator in value));
208
195
  }
209
- function encodeMethodCallBody(headers, data) {
196
+ export function encodeMethodCallBody(headers, data) {
210
197
  // Silently ignore the body if there is no content-type header.
211
198
  const contentType = headers.get('content-type');
212
199
  if (!contentType) {
@@ -216,7 +203,7 @@ function encodeMethodCallBody(headers, data) {
216
203
  // This error would be returned by the server, but we can catch it earlier
217
204
  // to avoid un-necessary requests. Note that a content-length of 0 does not
218
205
  // necessary mean that the body is "empty" (e.g. an empty txt file).
219
- throw new types_1.XRPCError(types_1.ResponseType.InvalidRequest, `A request body is expected but none was provided`);
206
+ throw new XRPCError(ResponseType.InvalidRequest, `A request body is expected but none was provided`);
220
207
  }
221
208
  if (isBodyInit(data)) {
222
209
  if (data instanceof FormData && contentType === 'multipart/form-data') {
@@ -238,11 +225,11 @@ function encodeMethodCallBody(headers, data) {
238
225
  return new TextEncoder().encode(String(data));
239
226
  }
240
227
  if (contentType.startsWith('application/json')) {
241
- const json = (0, lexicon_1.stringifyLex)(data);
228
+ const json = stringifyLex(data);
242
229
  // Server would return a 400 error if the JSON is invalid (e.g. trying to
243
230
  // JSONify a function, or an object that implements toJSON() poorly).
244
231
  if (json === undefined) {
245
- throw new types_1.XRPCError(types_1.ResponseType.InvalidRequest, `Failed to encode request body as JSON`);
232
+ throw new XRPCError(ResponseType.InvalidRequest, `Failed to encode request body as JSON`);
246
233
  }
247
234
  return new TextEncoder().encode(json);
248
235
  }
@@ -256,7 +243,7 @@ function encodeMethodCallBody(headers, data) {
256
243
  typeof data.constructor?.name === 'string'
257
244
  ? data.constructor.name
258
245
  : 'object';
259
- throw new types_1.XRPCError(types_1.ResponseType.InvalidRequest, `Unable to encode ${type} as ${contentType} data`);
246
+ throw new XRPCError(ResponseType.InvalidRequest, `Unable to encode ${type} as ${contentType} data`);
260
247
  }
261
248
  /**
262
249
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/from_static}
@@ -273,12 +260,12 @@ function iterableToReadableStream(iterable) {
273
260
  'It is required to support using iterables as the request body. ' +
274
261
  'Consider using a polyfill or re-write your code to use a different body type.');
275
262
  }
276
- function httpResponseBodyParse(mimeType, data) {
263
+ export function httpResponseBodyParse(mimeType, data) {
277
264
  try {
278
265
  if (mimeType) {
279
266
  if (mimeType.includes('application/json')) {
280
267
  const str = new TextDecoder().decode(data);
281
- return (0, lexicon_1.jsonStringToLex)(str);
268
+ return jsonStringToLex(str);
282
269
  }
283
270
  if (mimeType.startsWith('text/')) {
284
271
  return new TextDecoder().decode(data);
@@ -290,7 +277,7 @@ function httpResponseBodyParse(mimeType, data) {
290
277
  return data;
291
278
  }
292
279
  catch (cause) {
293
- throw new types_1.XRPCError(types_1.ResponseType.InvalidResponse, undefined, `Failed to parse response body: ${String(cause)}`, undefined, { cause });
280
+ throw new XRPCError(ResponseType.InvalidResponse, undefined, `Failed to parse response body: ${String(cause)}`, undefined, { cause });
294
281
  }
295
282
  }
296
283
  //# sourceMappingURL=util.js.map
package/dist/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n LexXrpcProcedure,\n LexXrpcQuery,\n jsonStringToLex,\n stringifyLex,\n} from '@atproto/lexicon'\nimport {\n CallOptions,\n ErrorResponseBody,\n Gettable,\n QueryParams,\n ResponseType,\n XRPCError,\n errorResponseBody,\n} from './types'\n\nconst ReadableStream =\n globalThis.ReadableStream ||\n (class {\n constructor() {\n // This anonymous class will never pass any \"instanceof\" check and cannot\n // be instantiated.\n throw new Error('ReadableStream is not supported in this environment')\n }\n } as typeof globalThis.ReadableStream)\n\nexport function isErrorResponseBody(v: unknown): v is ErrorResponseBody {\n return errorResponseBody.safeParse(v).success\n}\n\nexport function getMethodSchemaHTTPMethod(\n schema: LexXrpcProcedure | LexXrpcQuery,\n) {\n if (schema.type === 'procedure') {\n return 'post'\n }\n return 'get'\n}\n\nexport function constructMethodCallUri(\n nsid: string,\n schema: LexXrpcProcedure | LexXrpcQuery,\n serviceUri: URL,\n params?: QueryParams,\n): string {\n const uri = new URL(constructMethodCallUrl(nsid, schema, params), serviceUri)\n return uri.toString()\n}\n\nexport function constructMethodCallUrl(\n nsid: string,\n schema: LexXrpcProcedure | LexXrpcQuery,\n params?: QueryParams,\n): string {\n const pathname = `/xrpc/${encodeURIComponent(nsid)}`\n if (!params) return pathname\n\n const searchParams: [string, string][] = []\n\n for (const [key, value] of Object.entries(params)) {\n const paramSchema = schema.parameters?.properties?.[key]\n if (!paramSchema) {\n throw new Error(`Invalid query parameter: ${key}`)\n }\n if (value !== undefined) {\n if (paramSchema.type === 'array') {\n const values = Array.isArray(value) ? value : [value]\n for (const val of values) {\n searchParams.push([\n key,\n encodeQueryParam(paramSchema.items.type, val),\n ])\n }\n } else {\n searchParams.push([key, encodeQueryParam(paramSchema.type, value)])\n }\n }\n }\n\n if (!searchParams.length) return pathname\n\n return `${pathname}?${new URLSearchParams(searchParams).toString()}`\n}\n\nexport function encodeQueryParam(\n type:\n | 'string'\n | 'float'\n | 'integer'\n | 'boolean'\n | 'datetime'\n | 'array'\n | 'unknown',\n value: any,\n): string {\n if (type === 'string' || type === 'unknown') {\n return String(value)\n }\n if (type === 'float') {\n return String(Number(value))\n } else if (type === 'integer') {\n return String(Number(value) | 0)\n } else if (type === 'boolean') {\n return value ? 'true' : 'false'\n } else if (type === 'datetime') {\n if (value instanceof Date) {\n return value.toISOString()\n }\n return String(value)\n }\n throw new Error(`Unsupported query param type: ${type}`)\n}\n\nexport function constructMethodCallHeaders(\n schema: LexXrpcProcedure | LexXrpcQuery,\n data?: unknown,\n opts?: CallOptions,\n): Headers {\n // Not using `new Headers(opts?.headers)` to avoid duplicating headers values\n // due to inconsistent casing in headers name. In case of multiple headers\n // with the same name (but using a different case), the last one will be used.\n\n // new Headers({ 'content-type': 'foo', 'Content-Type': 'bar' }).get('content-type')\n // => 'foo, bar'\n const headers = new Headers()\n\n if (opts?.headers) {\n for (const name in opts.headers) {\n if (headers.has(name)) {\n throw new TypeError(`Duplicate header: ${name}`)\n }\n\n const value = opts.headers[name]\n if (value != null) {\n headers.set(name, value)\n }\n }\n }\n\n if (schema.type === 'procedure') {\n if (opts?.encoding) {\n headers.set('content-type', opts.encoding)\n } else if (!headers.has('content-type') && typeof data !== 'undefined') {\n // Special handling of BodyInit types before falling back to JSON encoding\n if (\n data instanceof ArrayBuffer ||\n data instanceof ReadableStream ||\n ArrayBuffer.isView(data)\n ) {\n headers.set('content-type', 'application/octet-stream')\n } else if (data instanceof FormData) {\n // Note: The multipart form data boundary is missing from the header\n // we set here, making that header invalid. This special case will be\n // handled in encodeMethodCallBody()\n headers.set('content-type', 'multipart/form-data')\n } else if (data instanceof URLSearchParams) {\n headers.set(\n 'content-type',\n 'application/x-www-form-urlencoded;charset=UTF-8',\n )\n } else if (isBlobLike(data)) {\n headers.set('content-type', data.type || 'application/octet-stream')\n } else if (typeof data === 'string') {\n headers.set('content-type', 'text/plain;charset=UTF-8')\n }\n // At this point, data is not a valid BodyInit type.\n else if (isIterable(data)) {\n headers.set('content-type', 'application/octet-stream')\n } else if (\n typeof data === 'boolean' ||\n typeof data === 'number' ||\n typeof data === 'string' ||\n typeof data === 'object' // covers \"null\"\n ) {\n headers.set('content-type', 'application/json')\n } else {\n // symbol, function, bigint\n throw new XRPCError(\n ResponseType.InvalidRequest,\n `Unsupported data type: ${typeof data}`,\n )\n }\n }\n }\n return headers\n}\n\nexport function combineHeaders(\n headersInit: undefined | HeadersInit,\n defaultHeaders?: Iterable<[string, undefined | Gettable<null | string>]>,\n): undefined | HeadersInit {\n if (!defaultHeaders) return headersInit\n\n let headers: Headers | undefined = undefined\n\n for (const [name, definition] of defaultHeaders) {\n // Ignore undefined values (allowed for convenience when using\n // Object.entries).\n if (definition === undefined) continue\n\n // Lazy initialization of the headers object\n headers ??= new Headers(headersInit)\n\n if (headers.has(name)) continue\n\n const value = typeof definition === 'function' ? definition() : definition\n\n if (typeof value === 'string') headers.set(name, value)\n else if (value === null) headers.delete(name)\n else throw new TypeError(`Invalid \"${name}\" header value: ${typeof value}`)\n }\n\n return headers ?? headersInit\n}\n\nfunction isBlobLike(value: unknown): value is Blob {\n if (value == null) return false\n if (typeof value !== 'object') return false\n if (typeof Blob === 'function' && value instanceof Blob) return true\n\n // Support for Blobs provided by libraries that don't use the native Blob\n // (e.g. fetch-blob from node-fetch).\n // https://github.com/node-fetch/fetch-blob/blob/a1a182e5978811407bef4ea1632b517567dda01f/index.js#L233-L244\n\n const tag = value[Symbol.toStringTag]\n if (tag === 'Blob' || tag === 'File') {\n return 'stream' in value && typeof value.stream === 'function'\n }\n\n return false\n}\n\nexport function isBodyInit(value: unknown): value is BodyInit {\n switch (typeof value) {\n case 'string':\n return true\n case 'object':\n return (\n value instanceof ArrayBuffer ||\n value instanceof FormData ||\n value instanceof URLSearchParams ||\n value instanceof ReadableStream ||\n ArrayBuffer.isView(value) ||\n isBlobLike(value)\n )\n default:\n return false\n }\n}\n\nexport function isIterable(\n value: unknown,\n): value is Iterable<unknown> | AsyncIterable<unknown> {\n return (\n value != null &&\n typeof value === 'object' &&\n (Symbol.iterator in value || Symbol.asyncIterator in value)\n )\n}\n\nexport function encodeMethodCallBody(\n headers: Headers,\n data?: unknown,\n): BodyInit | undefined {\n // Silently ignore the body if there is no content-type header.\n const contentType = headers.get('content-type')\n if (!contentType) {\n return undefined\n }\n\n if (typeof data === 'undefined') {\n // This error would be returned by the server, but we can catch it earlier\n // to avoid un-necessary requests. Note that a content-length of 0 does not\n // necessary mean that the body is \"empty\" (e.g. an empty txt file).\n throw new XRPCError(\n ResponseType.InvalidRequest,\n `A request body is expected but none was provided`,\n )\n }\n\n if (isBodyInit(data)) {\n if (data instanceof FormData && contentType === 'multipart/form-data') {\n // fetch() will encode FormData payload itself, but it won't override the\n // content-type header if already present. This would cause the boundary\n // to be missing from the content-type header, resulting in a 400 error.\n // Deleting the content-type header here to let fetch() re-create it.\n headers.delete('content-type')\n }\n\n // Will be encoded by the fetch API.\n return data\n }\n\n if (isIterable(data)) {\n // Note that some environments support using Iterable & AsyncIterable as the\n // body (e.g. Node's fetch), but not all of them do (browsers).\n return iterableToReadableStream(data)\n }\n\n if (contentType.startsWith('text/')) {\n return new TextEncoder().encode(String(data))\n }\n if (contentType.startsWith('application/json')) {\n const json = stringifyLex(data)\n // Server would return a 400 error if the JSON is invalid (e.g. trying to\n // JSONify a function, or an object that implements toJSON() poorly).\n if (json === undefined) {\n throw new XRPCError(\n ResponseType.InvalidRequest,\n `Failed to encode request body as JSON`,\n )\n }\n return new TextEncoder().encode(json)\n }\n\n // At this point, \"data\" is not a valid BodyInit value, and we don't know how\n // to encode it into one. Passing it to fetch would result in an error. Let's\n // throw our own error instead.\n\n const type =\n !data || typeof data !== 'object'\n ? typeof data\n : data.constructor !== Object &&\n typeof data.constructor === 'function' &&\n typeof data.constructor?.name === 'string'\n ? data.constructor.name\n : 'object'\n\n throw new XRPCError(\n ResponseType.InvalidRequest,\n `Unable to encode ${type} as ${contentType} data`,\n )\n}\n\n/**\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/from_static}\n */\nfunction iterableToReadableStream(\n iterable: Iterable<unknown> | AsyncIterable<unknown>,\n): ReadableStream<Uint8Array> {\n // Use the native ReadableStream.from() if available.\n if ('from' in ReadableStream && typeof ReadableStream.from === 'function') {\n return ReadableStream.from(iterable)\n }\n\n // If you see this error, consider using a polyfill for ReadableStream. For\n // example, the \"web-streams-polyfill\" package:\n // https://github.com/MattiasBuelens/web-streams-polyfill\n\n throw new TypeError(\n 'ReadableStream.from() is not supported in this environment. ' +\n 'It is required to support using iterables as the request body. ' +\n 'Consider using a polyfill or re-write your code to use a different body type.',\n )\n}\n\nexport function httpResponseBodyParse(\n mimeType: string | null,\n data: ArrayBuffer | undefined,\n): any {\n try {\n if (mimeType) {\n if (mimeType.includes('application/json')) {\n const str = new TextDecoder().decode(data)\n return jsonStringToLex(str)\n }\n if (mimeType.startsWith('text/')) {\n return new TextDecoder().decode(data)\n }\n }\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data)\n }\n return data\n } catch (cause) {\n throw new XRPCError(\n ResponseType.InvalidResponse,\n undefined,\n `Failed to parse response body: ${String(cause)}`,\n undefined,\n { cause },\n )\n }\n}\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n LexXrpcProcedure,\n LexXrpcQuery,\n jsonStringToLex,\n stringifyLex,\n} from '@atproto/lexicon'\nimport {\n CallOptions,\n ErrorResponseBody,\n Gettable,\n QueryParams,\n ResponseType,\n XRPCError,\n errorResponseBody,\n} from './types.js'\n\nconst ReadableStream =\n globalThis.ReadableStream ||\n (class {\n constructor() {\n // This anonymous class will never pass any \"instanceof\" check and cannot\n // be instantiated.\n throw new Error('ReadableStream is not supported in this environment')\n }\n } as typeof globalThis.ReadableStream)\n\nexport function isErrorResponseBody(v: unknown): v is ErrorResponseBody {\n return errorResponseBody.safeParse(v).success\n}\n\nexport function getMethodSchemaHTTPMethod(\n schema: LexXrpcProcedure | LexXrpcQuery,\n) {\n if (schema.type === 'procedure') {\n return 'post'\n }\n return 'get'\n}\n\nexport function constructMethodCallUri(\n nsid: string,\n schema: LexXrpcProcedure | LexXrpcQuery,\n serviceUri: URL,\n params?: QueryParams,\n): string {\n const uri = new URL(constructMethodCallUrl(nsid, schema, params), serviceUri)\n return uri.toString()\n}\n\nexport function constructMethodCallUrl(\n nsid: string,\n schema: LexXrpcProcedure | LexXrpcQuery,\n params?: QueryParams,\n): string {\n const pathname = `/xrpc/${encodeURIComponent(nsid)}`\n if (!params) return pathname\n\n const searchParams: [string, string][] = []\n\n for (const [key, value] of Object.entries(params)) {\n const paramSchema = schema.parameters?.properties?.[key]\n if (!paramSchema) {\n throw new Error(`Invalid query parameter: ${key}`)\n }\n if (value !== undefined) {\n if (paramSchema.type === 'array') {\n const values = Array.isArray(value) ? value : [value]\n for (const val of values) {\n searchParams.push([\n key,\n encodeQueryParam(paramSchema.items.type, val),\n ])\n }\n } else {\n searchParams.push([key, encodeQueryParam(paramSchema.type, value)])\n }\n }\n }\n\n if (!searchParams.length) return pathname\n\n return `${pathname}?${new URLSearchParams(searchParams).toString()}`\n}\n\nexport function encodeQueryParam(\n type:\n | 'string'\n | 'float'\n | 'integer'\n | 'boolean'\n | 'datetime'\n | 'array'\n | 'unknown',\n value: any,\n): string {\n if (type === 'string' || type === 'unknown') {\n return String(value)\n }\n if (type === 'float') {\n return String(Number(value))\n } else if (type === 'integer') {\n return String(Number(value) | 0)\n } else if (type === 'boolean') {\n return value ? 'true' : 'false'\n } else if (type === 'datetime') {\n if (value instanceof Date) {\n return value.toISOString()\n }\n return String(value)\n }\n throw new Error(`Unsupported query param type: ${type}`)\n}\n\nexport function constructMethodCallHeaders(\n schema: LexXrpcProcedure | LexXrpcQuery,\n data?: unknown,\n opts?: CallOptions,\n): Headers {\n // Not using `new Headers(opts?.headers)` to avoid duplicating headers values\n // due to inconsistent casing in headers name. In case of multiple headers\n // with the same name (but using a different case), the last one will be used.\n\n // new Headers({ 'content-type': 'foo', 'Content-Type': 'bar' }).get('content-type')\n // => 'foo, bar'\n const headers = new Headers()\n\n if (opts?.headers) {\n for (const name in opts.headers) {\n if (headers.has(name)) {\n throw new TypeError(`Duplicate header: ${name}`)\n }\n\n const value = opts.headers[name]\n if (value != null) {\n headers.set(name, value)\n }\n }\n }\n\n if (schema.type === 'procedure') {\n if (opts?.encoding) {\n headers.set('content-type', opts.encoding)\n } else if (!headers.has('content-type') && typeof data !== 'undefined') {\n // Special handling of BodyInit types before falling back to JSON encoding\n if (\n data instanceof ArrayBuffer ||\n data instanceof ReadableStream ||\n ArrayBuffer.isView(data)\n ) {\n headers.set('content-type', 'application/octet-stream')\n } else if (data instanceof FormData) {\n // Note: The multipart form data boundary is missing from the header\n // we set here, making that header invalid. This special case will be\n // handled in encodeMethodCallBody()\n headers.set('content-type', 'multipart/form-data')\n } else if (data instanceof URLSearchParams) {\n headers.set(\n 'content-type',\n 'application/x-www-form-urlencoded;charset=UTF-8',\n )\n } else if (isBlobLike(data)) {\n headers.set('content-type', data.type || 'application/octet-stream')\n } else if (typeof data === 'string') {\n headers.set('content-type', 'text/plain;charset=UTF-8')\n }\n // At this point, data is not a valid BodyInit type.\n else if (isIterable(data)) {\n headers.set('content-type', 'application/octet-stream')\n } else if (\n typeof data === 'boolean' ||\n typeof data === 'number' ||\n typeof data === 'string' ||\n typeof data === 'object' // covers \"null\"\n ) {\n headers.set('content-type', 'application/json')\n } else {\n // symbol, function, bigint\n throw new XRPCError(\n ResponseType.InvalidRequest,\n `Unsupported data type: ${typeof data}`,\n )\n }\n }\n }\n return headers\n}\n\nexport function combineHeaders(\n headersInit: undefined | HeadersInit,\n defaultHeaders?: Iterable<[string, undefined | Gettable<null | string>]>,\n): undefined | HeadersInit {\n if (!defaultHeaders) return headersInit\n\n let headers: Headers | undefined = undefined\n\n for (const [name, definition] of defaultHeaders) {\n // Ignore undefined values (allowed for convenience when using\n // Object.entries).\n if (definition === undefined) continue\n\n // Lazy initialization of the headers object\n headers ??= new Headers(headersInit)\n\n if (headers.has(name)) continue\n\n const value = typeof definition === 'function' ? definition() : definition\n\n if (typeof value === 'string') headers.set(name, value)\n else if (value === null) headers.delete(name)\n else throw new TypeError(`Invalid \"${name}\" header value: ${typeof value}`)\n }\n\n return headers ?? headersInit\n}\n\nfunction isBlobLike(value: unknown): value is Blob {\n if (value == null) return false\n if (typeof value !== 'object') return false\n if (typeof Blob === 'function' && value instanceof Blob) return true\n\n // Support for Blobs provided by libraries that don't use the native Blob\n // (e.g. fetch-blob from node-fetch).\n // https://github.com/node-fetch/fetch-blob/blob/a1a182e5978811407bef4ea1632b517567dda01f/index.js#L233-L244\n\n const tag = value[Symbol.toStringTag]\n if (tag === 'Blob' || tag === 'File') {\n return 'stream' in value && typeof value.stream === 'function'\n }\n\n return false\n}\n\nexport function isBodyInit(value: unknown): value is BodyInit {\n switch (typeof value) {\n case 'string':\n return true\n case 'object':\n return (\n value instanceof ArrayBuffer ||\n value instanceof FormData ||\n value instanceof URLSearchParams ||\n value instanceof ReadableStream ||\n ArrayBuffer.isView(value) ||\n isBlobLike(value)\n )\n default:\n return false\n }\n}\n\nexport function isIterable(\n value: unknown,\n): value is Iterable<unknown> | AsyncIterable<unknown> {\n return (\n value != null &&\n typeof value === 'object' &&\n (Symbol.iterator in value || Symbol.asyncIterator in value)\n )\n}\n\nexport function encodeMethodCallBody(\n headers: Headers,\n data?: unknown,\n): BodyInit | undefined {\n // Silently ignore the body if there is no content-type header.\n const contentType = headers.get('content-type')\n if (!contentType) {\n return undefined\n }\n\n if (typeof data === 'undefined') {\n // This error would be returned by the server, but we can catch it earlier\n // to avoid un-necessary requests. Note that a content-length of 0 does not\n // necessary mean that the body is \"empty\" (e.g. an empty txt file).\n throw new XRPCError(\n ResponseType.InvalidRequest,\n `A request body is expected but none was provided`,\n )\n }\n\n if (isBodyInit(data)) {\n if (data instanceof FormData && contentType === 'multipart/form-data') {\n // fetch() will encode FormData payload itself, but it won't override the\n // content-type header if already present. This would cause the boundary\n // to be missing from the content-type header, resulting in a 400 error.\n // Deleting the content-type header here to let fetch() re-create it.\n headers.delete('content-type')\n }\n\n // Will be encoded by the fetch API.\n return data\n }\n\n if (isIterable(data)) {\n // Note that some environments support using Iterable & AsyncIterable as the\n // body (e.g. Node's fetch), but not all of them do (browsers).\n return iterableToReadableStream(data)\n }\n\n if (contentType.startsWith('text/')) {\n return new TextEncoder().encode(String(data))\n }\n if (contentType.startsWith('application/json')) {\n const json = stringifyLex(data)\n // Server would return a 400 error if the JSON is invalid (e.g. trying to\n // JSONify a function, or an object that implements toJSON() poorly).\n if (json === undefined) {\n throw new XRPCError(\n ResponseType.InvalidRequest,\n `Failed to encode request body as JSON`,\n )\n }\n return new TextEncoder().encode(json)\n }\n\n // At this point, \"data\" is not a valid BodyInit value, and we don't know how\n // to encode it into one. Passing it to fetch would result in an error. Let's\n // throw our own error instead.\n\n const type =\n !data || typeof data !== 'object'\n ? typeof data\n : data.constructor !== Object &&\n typeof data.constructor === 'function' &&\n typeof data.constructor?.name === 'string'\n ? data.constructor.name\n : 'object'\n\n throw new XRPCError(\n ResponseType.InvalidRequest,\n `Unable to encode ${type} as ${contentType} data`,\n )\n}\n\n/**\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/from_static}\n */\nfunction iterableToReadableStream(\n iterable: Iterable<unknown> | AsyncIterable<unknown>,\n): ReadableStream<Uint8Array> {\n // Use the native ReadableStream.from() if available.\n if ('from' in ReadableStream && typeof ReadableStream.from === 'function') {\n return ReadableStream.from(iterable)\n }\n\n // If you see this error, consider using a polyfill for ReadableStream. For\n // example, the \"web-streams-polyfill\" package:\n // https://github.com/MattiasBuelens/web-streams-polyfill\n\n throw new TypeError(\n 'ReadableStream.from() is not supported in this environment. ' +\n 'It is required to support using iterables as the request body. ' +\n 'Consider using a polyfill or re-write your code to use a different body type.',\n )\n}\n\nexport function httpResponseBodyParse(\n mimeType: string | null,\n data: ArrayBuffer | undefined,\n): any {\n try {\n if (mimeType) {\n if (mimeType.includes('application/json')) {\n const str = new TextDecoder().decode(data)\n return jsonStringToLex(str)\n }\n if (mimeType.startsWith('text/')) {\n return new TextDecoder().decode(data)\n }\n }\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data)\n }\n return data\n } catch (cause) {\n throw new XRPCError(\n ResponseType.InvalidResponse,\n undefined,\n `Failed to parse response body: ${String(cause)}`,\n undefined,\n { cause },\n )\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { LexiconDoc, Lexicons } from '@atproto/lexicon';
2
- import { FetchHandler, FetchHandlerObject, FetchHandlerOptions } from './fetch-handler';
3
- import { CallOptions, Gettable, QueryParams, XRPCResponse } from './types';
2
+ import { FetchHandler, FetchHandlerObject, FetchHandlerOptions } from './fetch-handler.js';
3
+ import { CallOptions, Gettable, QueryParams, XRPCResponse } from './types.js';
4
4
  export declare class XrpcClient {
5
5
  readonly fetchHandler: FetchHandler;
6
6
  readonly headers: Map<string, Gettable<string | null>>;
@@ -1 +1 @@
1
- {"version":3,"file":"xrpc-client.d.ts","sourceRoot":"","sources":["../src/xrpc-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAmB,MAAM,kBAAkB,CAAA;AACxE,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EAEpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,WAAW,EACX,QAAQ,EACR,WAAW,EAIX,YAAY,EAEb,MAAM,SAAS,CAAA;AAWhB,qBAAa,UAAU;IACrB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,QAAQ,CAAC,OAAO,uCAA6C;IAC7D,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAA;gBAGpB,gBAAgB,EAAE,YAAY,GAAG,kBAAkB,GAAG,mBAAmB,EAGzE,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC;IAOtC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI;IAI5D,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI9B,YAAY,IAAI,IAAI;IAId,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,EACpB,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,YAAY,CAAC;CA+DzB"}
1
+ {"version":3,"file":"xrpc-client.d.ts","sourceRoot":"","sources":["../src/xrpc-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAmB,MAAM,kBAAkB,CAAA;AACxE,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EAEpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,WAAW,EACX,QAAQ,EACR,WAAW,EAIX,YAAY,EAEb,MAAM,YAAY,CAAA;AAWnB,qBAAa,UAAU;IACrB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,QAAQ,CAAC,OAAO,uCAA6C;IAC7D,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAA;gBAGpB,gBAAgB,EAAE,YAAY,GAAG,kBAAkB,GAAG,mBAAmB,EAGzE,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC;IAOtC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI;IAI5D,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI9B,YAAY,IAAI,IAAI;IAId,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,EACpB,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,YAAY,CAAC;CA+DzB"}
@@ -1,35 +1,15 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.XrpcClient = void 0;
4
- const lexicon_1 = require("@atproto/lexicon");
5
- const fetch_handler_1 = require("./fetch-handler");
6
- const types_1 = require("./types");
7
- const util_1 = require("./util");
8
- class XrpcClient {
1
+ import { Lexicons, ValidationError } from '@atproto/lexicon';
2
+ import { buildFetchHandler, } from './fetch-handler.js';
3
+ import { ResponseType, XRPCError, XRPCInvalidResponseError, XRPCResponse, httpResponseCodeToEnum, } from './types.js';
4
+ import { combineHeaders, constructMethodCallHeaders, constructMethodCallUrl, encodeMethodCallBody, getMethodSchemaHTTPMethod, httpResponseBodyParse, isErrorResponseBody, } from './util.js';
5
+ export class XrpcClient {
9
6
  constructor(fetchHandlerOpts,
10
7
  // "Lexicons" is redundant here (because that class implements
11
8
  // "Iterable<LexiconDoc>") but we keep it for explicitness:
12
9
  lex) {
13
- Object.defineProperty(this, "fetchHandler", {
14
- enumerable: true,
15
- configurable: true,
16
- writable: true,
17
- value: void 0
18
- });
19
- Object.defineProperty(this, "headers", {
20
- enumerable: true,
21
- configurable: true,
22
- writable: true,
23
- value: new Map()
24
- });
25
- Object.defineProperty(this, "lex", {
26
- enumerable: true,
27
- configurable: true,
28
- writable: true,
29
- value: void 0
30
- });
31
- this.fetchHandler = (0, fetch_handler_1.buildFetchHandler)(fetchHandlerOpts);
32
- this.lex = lex instanceof lexicon_1.Lexicons ? lex : new lexicon_1.Lexicons(lex);
10
+ this.headers = new Map();
11
+ this.fetchHandler = buildFetchHandler(fetchHandlerOpts);
12
+ this.lex = lex instanceof Lexicons ? lex : new Lexicons(lex);
33
13
  }
34
14
  setHeader(key, value) {
35
15
  this.headers.set(key.toLowerCase(), value);
@@ -50,15 +30,15 @@ class XrpcClient {
50
30
  // if (data !== undefined) {
51
31
  // this.lex.assertValidXrpcInput(methodNsid, data)
52
32
  // }
53
- const reqUrl = (0, util_1.constructMethodCallUrl)(methodNsid, def, params);
54
- const reqMethod = (0, util_1.getMethodSchemaHTTPMethod)(def);
55
- const reqHeaders = (0, util_1.constructMethodCallHeaders)(def, data, opts);
56
- const reqBody = (0, util_1.encodeMethodCallBody)(reqHeaders, data);
33
+ const reqUrl = constructMethodCallUrl(methodNsid, def, params);
34
+ const reqMethod = getMethodSchemaHTTPMethod(def);
35
+ const reqHeaders = constructMethodCallHeaders(def, data, opts);
36
+ const reqBody = encodeMethodCallBody(reqHeaders, data);
57
37
  // The duplex field is required for streaming bodies, but not yet reflected
58
38
  // anywhere in docs or types. See whatwg/fetch#1438, nodejs/node#46221.
59
39
  const init = {
60
40
  method: reqMethod,
61
- headers: (0, util_1.combineHeaders)(reqHeaders, this.headers),
41
+ headers: combineHeaders(reqHeaders, this.headers),
62
42
  body: reqBody,
63
43
  duplex: 'half',
64
44
  redirect: 'follow',
@@ -69,27 +49,26 @@ class XrpcClient {
69
49
  const resStatus = response.status;
70
50
  const resHeaders = Object.fromEntries(response.headers.entries());
71
51
  const resBodyBytes = await response.arrayBuffer();
72
- const resBody = (0, util_1.httpResponseBodyParse)(response.headers.get('content-type'), resBodyBytes);
73
- const resCode = (0, types_1.httpResponseCodeToEnum)(resStatus);
74
- if (resCode !== types_1.ResponseType.Success) {
75
- const { error = undefined, message = undefined } = resBody && (0, util_1.isErrorResponseBody)(resBody) ? resBody : {};
76
- throw new types_1.XRPCError(resCode, error, message, resHeaders);
52
+ const resBody = httpResponseBodyParse(response.headers.get('content-type'), resBodyBytes);
53
+ const resCode = httpResponseCodeToEnum(resStatus);
54
+ if (resCode !== ResponseType.Success) {
55
+ const { error = undefined, message = undefined } = resBody && isErrorResponseBody(resBody) ? resBody : {};
56
+ throw new XRPCError(resCode, error, message, resHeaders);
77
57
  }
78
58
  try {
79
59
  this.lex.assertValidXrpcOutput(methodNsid, resBody);
80
60
  }
81
61
  catch (e) {
82
- if (e instanceof lexicon_1.ValidationError) {
83
- throw new types_1.XRPCInvalidResponseError(methodNsid, e, resBody);
62
+ if (e instanceof ValidationError) {
63
+ throw new XRPCInvalidResponseError(methodNsid, e, resBody);
84
64
  }
85
65
  throw e;
86
66
  }
87
- return new types_1.XRPCResponse(resBody, resHeaders);
67
+ return new XRPCResponse(resBody, resHeaders);
88
68
  }
89
69
  catch (err) {
90
- throw types_1.XRPCError.from(err);
70
+ throw XRPCError.from(err);
91
71
  }
92
72
  }
93
73
  }
94
- exports.XrpcClient = XrpcClient;
95
74
  //# sourceMappingURL=xrpc-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"xrpc-client.js","sourceRoot":"","sources":["../src/xrpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { LexiconDoc, Lexicons, ValidationError } from '@atproto/lexicon'\nimport {\n FetchHandler,\n FetchHandlerObject,\n FetchHandlerOptions,\n buildFetchHandler,\n} from './fetch-handler'\nimport {\n CallOptions,\n Gettable,\n QueryParams,\n ResponseType,\n XRPCError,\n XRPCInvalidResponseError,\n XRPCResponse,\n httpResponseCodeToEnum,\n} from './types'\nimport {\n combineHeaders,\n constructMethodCallHeaders,\n constructMethodCallUrl,\n encodeMethodCallBody,\n getMethodSchemaHTTPMethod,\n httpResponseBodyParse,\n isErrorResponseBody,\n} from './util'\n\nexport class XrpcClient {\n readonly fetchHandler: FetchHandler\n readonly headers = new Map<string, Gettable<null | string>>()\n readonly lex: Lexicons\n\n constructor(\n fetchHandlerOpts: FetchHandler | FetchHandlerObject | FetchHandlerOptions,\n // \"Lexicons\" is redundant here (because that class implements\n // \"Iterable<LexiconDoc>\") but we keep it for explicitness:\n lex: Lexicons | Iterable<LexiconDoc>,\n ) {\n this.fetchHandler = buildFetchHandler(fetchHandlerOpts)\n\n this.lex = lex instanceof Lexicons ? lex : new Lexicons(lex)\n }\n\n setHeader(key: string, value: Gettable<null | string>): void {\n this.headers.set(key.toLowerCase(), value)\n }\n\n unsetHeader(key: string): void {\n this.headers.delete(key.toLowerCase())\n }\n\n clearHeaders(): void {\n this.headers.clear()\n }\n\n async call(\n methodNsid: string,\n params?: QueryParams,\n data?: unknown,\n opts?: CallOptions,\n ): Promise<XRPCResponse> {\n const def = this.lex.getDefOrThrow(methodNsid)\n if (!def || (def.type !== 'query' && def.type !== 'procedure')) {\n throw new TypeError(\n `Invalid lexicon: ${methodNsid}. Must be a query or procedure.`,\n )\n }\n\n // @TODO: should we validate the params and data here?\n // this.lex.assertValidXrpcParams(methodNsid, params)\n // if (data !== undefined) {\n // this.lex.assertValidXrpcInput(methodNsid, data)\n // }\n\n const reqUrl = constructMethodCallUrl(methodNsid, def, params)\n const reqMethod = getMethodSchemaHTTPMethod(def)\n const reqHeaders = constructMethodCallHeaders(def, data, opts)\n const reqBody = encodeMethodCallBody(reqHeaders, data)\n\n // The duplex field is required for streaming bodies, but not yet reflected\n // anywhere in docs or types. See whatwg/fetch#1438, nodejs/node#46221.\n const init: RequestInit & { duplex: 'half' } = {\n method: reqMethod,\n headers: combineHeaders(reqHeaders, this.headers),\n body: reqBody,\n duplex: 'half',\n redirect: 'follow',\n signal: opts?.signal,\n }\n\n try {\n const response = await this.fetchHandler.call(undefined, reqUrl, init)\n\n const resStatus = response.status\n const resHeaders = Object.fromEntries(response.headers.entries())\n const resBodyBytes = await response.arrayBuffer()\n const resBody = httpResponseBodyParse(\n response.headers.get('content-type'),\n resBodyBytes,\n )\n\n const resCode = httpResponseCodeToEnum(resStatus)\n if (resCode !== ResponseType.Success) {\n const { error = undefined, message = undefined } =\n resBody && isErrorResponseBody(resBody) ? resBody : {}\n throw new XRPCError(resCode, error, message, resHeaders)\n }\n\n try {\n this.lex.assertValidXrpcOutput(methodNsid, resBody)\n } catch (e: unknown) {\n if (e instanceof ValidationError) {\n throw new XRPCInvalidResponseError(methodNsid, e, resBody)\n }\n\n throw e\n }\n\n return new XRPCResponse(resBody, resHeaders)\n } catch (err) {\n throw XRPCError.from(err)\n }\n }\n}\n"]}
1
+ {"version":3,"file":"xrpc-client.js","sourceRoot":"","sources":["../src/xrpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { LexiconDoc, Lexicons, ValidationError } from '@atproto/lexicon'\nimport {\n FetchHandler,\n FetchHandlerObject,\n FetchHandlerOptions,\n buildFetchHandler,\n} from './fetch-handler.js'\nimport {\n CallOptions,\n Gettable,\n QueryParams,\n ResponseType,\n XRPCError,\n XRPCInvalidResponseError,\n XRPCResponse,\n httpResponseCodeToEnum,\n} from './types.js'\nimport {\n combineHeaders,\n constructMethodCallHeaders,\n constructMethodCallUrl,\n encodeMethodCallBody,\n getMethodSchemaHTTPMethod,\n httpResponseBodyParse,\n isErrorResponseBody,\n} from './util.js'\n\nexport class XrpcClient {\n readonly fetchHandler: FetchHandler\n readonly headers = new Map<string, Gettable<null | string>>()\n readonly lex: Lexicons\n\n constructor(\n fetchHandlerOpts: FetchHandler | FetchHandlerObject | FetchHandlerOptions,\n // \"Lexicons\" is redundant here (because that class implements\n // \"Iterable<LexiconDoc>\") but we keep it for explicitness:\n lex: Lexicons | Iterable<LexiconDoc>,\n ) {\n this.fetchHandler = buildFetchHandler(fetchHandlerOpts)\n\n this.lex = lex instanceof Lexicons ? lex : new Lexicons(lex)\n }\n\n setHeader(key: string, value: Gettable<null | string>): void {\n this.headers.set(key.toLowerCase(), value)\n }\n\n unsetHeader(key: string): void {\n this.headers.delete(key.toLowerCase())\n }\n\n clearHeaders(): void {\n this.headers.clear()\n }\n\n async call(\n methodNsid: string,\n params?: QueryParams,\n data?: unknown,\n opts?: CallOptions,\n ): Promise<XRPCResponse> {\n const def = this.lex.getDefOrThrow(methodNsid)\n if (!def || (def.type !== 'query' && def.type !== 'procedure')) {\n throw new TypeError(\n `Invalid lexicon: ${methodNsid}. Must be a query or procedure.`,\n )\n }\n\n // @TODO: should we validate the params and data here?\n // this.lex.assertValidXrpcParams(methodNsid, params)\n // if (data !== undefined) {\n // this.lex.assertValidXrpcInput(methodNsid, data)\n // }\n\n const reqUrl = constructMethodCallUrl(methodNsid, def, params)\n const reqMethod = getMethodSchemaHTTPMethod(def)\n const reqHeaders = constructMethodCallHeaders(def, data, opts)\n const reqBody = encodeMethodCallBody(reqHeaders, data)\n\n // The duplex field is required for streaming bodies, but not yet reflected\n // anywhere in docs or types. See whatwg/fetch#1438, nodejs/node#46221.\n const init: RequestInit & { duplex: 'half' } = {\n method: reqMethod,\n headers: combineHeaders(reqHeaders, this.headers),\n body: reqBody,\n duplex: 'half',\n redirect: 'follow',\n signal: opts?.signal,\n }\n\n try {\n const response = await this.fetchHandler.call(undefined, reqUrl, init)\n\n const resStatus = response.status\n const resHeaders = Object.fromEntries(response.headers.entries())\n const resBodyBytes = await response.arrayBuffer()\n const resBody = httpResponseBodyParse(\n response.headers.get('content-type'),\n resBodyBytes,\n )\n\n const resCode = httpResponseCodeToEnum(resStatus)\n if (resCode !== ResponseType.Success) {\n const { error = undefined, message = undefined } =\n resBody && isErrorResponseBody(resBody) ? resBody : {}\n throw new XRPCError(resCode, error, message, resHeaders)\n }\n\n try {\n this.lex.assertValidXrpcOutput(methodNsid, resBody)\n } catch (e: unknown) {\n if (e instanceof ValidationError) {\n throw new XRPCInvalidResponseError(methodNsid, e, resBody)\n }\n\n throw e\n }\n\n return new XRPCResponse(resBody, resHeaders)\n } catch (err) {\n throw XRPCError.from(err)\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "name": "@atproto/xrpc",
3
- "version": "0.7.7",
3
+ "version": "0.8.0",
4
+ "engines": {
5
+ "node": ">=22"
6
+ },
4
7
  "license": "MIT",
5
8
  "description": "atproto HTTP API (XRPC) client library",
6
9
  "keywords": [
@@ -13,14 +16,19 @@
13
16
  "url": "https://github.com/bluesky-social/atproto",
14
17
  "directory": "packages/xrpc"
15
18
  },
16
- "main": "dist/index.js",
17
- "types": "dist/index.d.ts",
18
19
  "dependencies": {
19
20
  "zod": "^3.23.8",
20
- "@atproto/lexicon": "^0.6.0"
21
+ "@atproto/lexicon": "^0.7.0"
21
22
  },
22
23
  "devDependencies": {
23
- "typescript": "^5.6.3"
24
+ "typescript": "^6.0.3"
25
+ },
26
+ "type": "module",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "default": "./dist/index.js"
31
+ }
24
32
  },
25
33
  "scripts": {
26
34
  "build": "tsc --build tsconfig.build.json"
package/src/client.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { LexiconDoc, Lexicons } from '@atproto/lexicon'
2
- import { CallOptions, QueryParams } from './types'
3
- import { combineHeaders } from './util'
4
- import { XrpcClient } from './xrpc-client'
2
+ import { CallOptions, QueryParams } from './types.js'
3
+ import { combineHeaders } from './util.js'
4
+ import { XrpcClient } from './xrpc-client.js'
5
5
 
6
6
  /** @deprecated Use {@link XrpcClient} instead */
7
7
  export class Client {
@@ -1,5 +1,5 @@
1
- import { Gettable } from './types'
2
- import { combineHeaders } from './util'
1
+ import { Gettable } from './types.js'
2
+ import { combineHeaders } from './util.js'
3
3
 
4
4
  export type FetchHandler = (
5
5
  this: void,
package/src/index.ts CHANGED
@@ -1,12 +1,10 @@
1
- export * from './client'
2
- export * from './fetch-handler'
3
- export * from './types'
4
- export * from './util'
5
- export * from './xrpc-client'
1
+ export * from './client.js'
2
+ export * from './fetch-handler.js'
3
+ export * from './types.js'
4
+ export * from './util.js'
5
+ export * from './xrpc-client.js'
6
6
 
7
- /* eslint-disable import/no-deprecated */
8
- import { Client } from './client'
7
+ import { Client } from './client.js'
9
8
  /** @deprecated create a local {@link XrpcClient} instance instead */
10
9
  const defaultInst = new Client()
11
10
  export default defaultInst
12
- /* eslint-enable import/no-deprecated */
package/src/util.ts CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  ResponseType,
13
13
  XRPCError,
14
14
  errorResponseBody,
15
- } from './types'
15
+ } from './types.js'
16
16
 
17
17
  const ReadableStream =
18
18
  globalThis.ReadableStream ||
@@ -4,7 +4,7 @@ import {
4
4
  FetchHandlerObject,
5
5
  FetchHandlerOptions,
6
6
  buildFetchHandler,
7
- } from './fetch-handler'
7
+ } from './fetch-handler.js'
8
8
  import {
9
9
  CallOptions,
10
10
  Gettable,
@@ -14,7 +14,7 @@ import {
14
14
  XRPCInvalidResponseError,
15
15
  XRPCResponse,
16
16
  httpResponseCodeToEnum,
17
- } from './types'
17
+ } from './types.js'
18
18
  import {
19
19
  combineHeaders,
20
20
  constructMethodCallHeaders,
@@ -23,7 +23,7 @@ import {
23
23
  getMethodSchemaHTTPMethod,
24
24
  httpResponseBodyParse,
25
25
  isErrorResponseBody,
26
- } from './util'
26
+ } from './util.js'
27
27
 
28
28
  export class XrpcClient {
29
29
  readonly fetchHandler: FetchHandler
@@ -1 +1 @@
1
- {"root":["./src/client.ts","./src/fetch-handler.ts","./src/index.ts","./src/types.ts","./src/util.ts","./src/xrpc-client.ts"],"version":"5.8.2"}
1
+ {"root":["./src/client.ts","./src/fetch-handler.ts","./src/index.ts","./src/types.ts","./src/util.ts","./src/xrpc-client.ts"],"version":"6.0.3"}