@atcute/xrpc-server 0.1.1 → 0.1.3

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.
Files changed (67) hide show
  1. package/LICENSE +12 -15
  2. package/README.md +13 -75
  3. package/dist/auth/index.d.ts +1 -0
  4. package/dist/auth/index.d.ts.map +1 -0
  5. package/dist/auth/jwt-creator.d.ts +1 -0
  6. package/dist/auth/jwt-creator.d.ts.map +1 -0
  7. package/dist/auth/jwt-verifier.d.ts +1 -0
  8. package/dist/auth/jwt-verifier.d.ts.map +1 -0
  9. package/dist/auth/jwt.d.ts +13 -17
  10. package/dist/auth/jwt.d.ts.map +1 -0
  11. package/dist/auth/jwt.js.map +1 -1
  12. package/dist/auth/types.d.ts +1 -0
  13. package/dist/auth/types.d.ts.map +1 -0
  14. package/dist/main/index.d.ts +2 -0
  15. package/dist/main/index.d.ts.map +1 -0
  16. package/dist/main/index.js +1 -0
  17. package/dist/main/index.js.map +1 -1
  18. package/dist/main/response.d.ts +1 -0
  19. package/dist/main/response.d.ts.map +1 -0
  20. package/dist/main/router.d.ts +13 -3
  21. package/dist/main/router.d.ts.map +1 -0
  22. package/dist/main/router.js +87 -7
  23. package/dist/main/router.js.map +1 -1
  24. package/dist/main/types/operation.d.ts +17 -1
  25. package/dist/main/types/operation.d.ts.map +1 -0
  26. package/dist/main/types/websocket.d.ts +10 -0
  27. package/dist/main/types/websocket.d.ts.map +1 -0
  28. package/dist/main/types/websocket.js +2 -0
  29. package/dist/main/types/websocket.js.map +1 -0
  30. package/dist/main/utils/event-emitter.d.ts +37 -0
  31. package/dist/main/utils/event-emitter.d.ts.map +1 -0
  32. package/dist/main/utils/event-emitter.js +96 -0
  33. package/dist/main/utils/event-emitter.js.map +1 -0
  34. package/dist/main/utils/frames.d.ts +5 -0
  35. package/dist/main/utils/frames.d.ts.map +1 -0
  36. package/dist/main/utils/frames.js +45 -0
  37. package/dist/main/utils/frames.js.map +1 -0
  38. package/dist/main/utils/middlewares.d.ts +1 -0
  39. package/dist/main/utils/middlewares.d.ts.map +1 -0
  40. package/dist/main/utils/request-input.d.ts +1 -0
  41. package/dist/main/utils/request-input.d.ts.map +1 -0
  42. package/dist/main/utils/request-params.d.ts +1 -0
  43. package/dist/main/utils/request-params.d.ts.map +1 -0
  44. package/dist/main/utils/response.d.ts +1 -0
  45. package/dist/main/utils/response.d.ts.map +1 -0
  46. package/dist/main/utils/websocket-mock.d.ts +24 -0
  47. package/dist/main/utils/websocket-mock.d.ts.map +1 -0
  48. package/dist/main/utils/websocket-mock.js +71 -0
  49. package/dist/main/utils/websocket-mock.js.map +1 -0
  50. package/dist/main/xrpc-error.d.ts +12 -0
  51. package/dist/main/xrpc-error.d.ts.map +1 -0
  52. package/dist/main/xrpc-error.js +11 -0
  53. package/dist/main/xrpc-error.js.map +1 -1
  54. package/dist/middlewares/cors.d.ts +1 -0
  55. package/dist/middlewares/cors.d.ts.map +1 -0
  56. package/dist/types/misc.d.ts +1 -0
  57. package/dist/types/misc.d.ts.map +1 -0
  58. package/lib/auth/jwt.ts +19 -8
  59. package/lib/main/index.ts +2 -0
  60. package/lib/main/router.ts +131 -10
  61. package/lib/main/types/operation.ts +33 -0
  62. package/lib/main/types/websocket.ts +14 -0
  63. package/lib/main/utils/event-emitter.ts +116 -0
  64. package/lib/main/utils/frames.ts +71 -0
  65. package/lib/main/utils/websocket-mock.ts +111 -0
  66. package/lib/main/xrpc-error.ts +20 -0
  67. package/package.json +16 -14
@@ -0,0 +1,96 @@
1
+ /** Event emitter */
2
+ export class EventEmitter {
3
+ #events;
4
+ /**
5
+ * Appends a listener for the specified event name
6
+ * @param name Name of the event
7
+ * @param listener Callback that should be invoked when an event is dispatched
8
+ * @returns Cleanup function that can be called to remove it
9
+ */
10
+ on(name, listener) {
11
+ let events = this.#events;
12
+ let existing;
13
+ if (events === undefined) {
14
+ events = this.#events = Object.create(null);
15
+ }
16
+ else {
17
+ existing = events[name];
18
+ }
19
+ if (existing === undefined) {
20
+ events[name] = listener;
21
+ }
22
+ else if (typeof existing === 'function') {
23
+ events[name] = [existing, listener];
24
+ }
25
+ else {
26
+ events[name] = existing.concat(listener);
27
+ }
28
+ // @ts-expect-error: complains about `listener`
29
+ return this.off.bind(this, name, listener);
30
+ }
31
+ /**
32
+ * Remove listener from the specified event name
33
+ * @param name Name of the event
34
+ * @param listener Callback to remove
35
+ */
36
+ off(name, listener) {
37
+ const events = this.#events;
38
+ if (events === undefined) {
39
+ return;
40
+ }
41
+ const list = events[name];
42
+ if (list == undefined) {
43
+ return;
44
+ }
45
+ if (list === listener) {
46
+ delete events[name];
47
+ }
48
+ else if (typeof list !== 'function') {
49
+ const index = list.indexOf(listener);
50
+ if (index !== -1) {
51
+ if (list.length === 2) {
52
+ // ^ flips the bit, it's either 0 or 1 here.
53
+ events[name] = list[index ^ 1];
54
+ }
55
+ else {
56
+ events[name] = list.toSpliced(index, 1);
57
+ }
58
+ }
59
+ }
60
+ }
61
+ /**
62
+ * Emit an event with the specified name and its payload
63
+ * @param name Name of the event
64
+ * @param args Payload for the event
65
+ * @returns Whether a listener has been called
66
+ */
67
+ emit(name, ...args) {
68
+ const events = this.#events;
69
+ if (events === undefined) {
70
+ return false;
71
+ }
72
+ const handler = events[name];
73
+ if (handler === undefined) {
74
+ return false;
75
+ }
76
+ if (typeof handler === 'function') {
77
+ handler.apply(this, args);
78
+ }
79
+ else {
80
+ for (let idx = 0, len = handler.length; idx < len; idx++) {
81
+ handler[idx].apply(this, args);
82
+ }
83
+ }
84
+ return true;
85
+ }
86
+ /**
87
+ * Determines if there is a listener on a specified event name
88
+ * @param name Name of the event
89
+ * @returns Whether there is a listener registered
90
+ */
91
+ has(name) {
92
+ const events = this.#events;
93
+ return events !== undefined && name in events;
94
+ }
95
+ }
96
+ //# sourceMappingURL=event-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../../lib/main/utils/event-emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const encodeMessageFrame: (body: unknown, type?: string) => Uint8Array;
2
+ export declare const encodeErrorFrame: (error: string, message?: string) => Uint8Array;
3
+ export declare const extractMessageType: (message: unknown, nsid: string) => string | undefined;
4
+ export declare const omitMessageType: (message: unknown) => unknown;
5
+ //# sourceMappingURL=frames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../../lib/main/utils/frames.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,kBAAkB,GAAI,MAAM,OAAO,EAAE,OAAO,MAAM,KAAG,UAOjE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,UAWlE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,OAAO,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAoB5E,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,OAAO,KAAG,OASlD,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { encode } from '@atcute/cbor';
2
+ import { concat } from '@atcute/uint8array';
3
+ export const encodeMessageFrame = (body, type) => {
4
+ const header = {
5
+ op: 1,
6
+ t: type,
7
+ };
8
+ return concat([encode(header), encode(body)]);
9
+ };
10
+ export const encodeErrorFrame = (error, message) => {
11
+ const header = {
12
+ op: -1,
13
+ };
14
+ const body = {
15
+ error: error,
16
+ message: message,
17
+ };
18
+ return concat([encode(header), encode(body)]);
19
+ };
20
+ export const extractMessageType = (message, nsid) => {
21
+ if (typeof message !== 'object' || message === null) {
22
+ return undefined;
23
+ }
24
+ const obj = message;
25
+ const type = obj.$type;
26
+ if (typeof type !== 'string') {
27
+ return undefined;
28
+ }
29
+ // If type starts with the subscription NSID, make it relative
30
+ // e.g., "com.atproto.sync.subscribeRepos#commit" → "#commit"
31
+ if (type.startsWith(nsid + '#')) {
32
+ return type.slice(nsid.length);
33
+ }
34
+ // Otherwise return the full type
35
+ return type;
36
+ };
37
+ export const omitMessageType = (message) => {
38
+ if (typeof message !== 'object' || message === null) {
39
+ return message;
40
+ }
41
+ const obj = message;
42
+ const { $type, ...rest } = obj;
43
+ return rest;
44
+ };
45
+ //# sourceMappingURL=frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../../lib/main/utils/frames.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAgB5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAE,IAAa,EAAc,EAAE;IAC9E,MAAM,MAAM,GAAuB;QAClC,EAAE,EAAE,CAAC;QACL,CAAC,EAAE,IAAI;KACP,CAAC;IAEF,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,OAAgB,EAAc,EAAE;IAC/E,MAAM,MAAM,GAAqB;QAChC,EAAE,EAAE,CAAC,CAAC;KACN,CAAC;IAEF,MAAM,IAAI,GAAmB;QAC5B,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,OAAO;KAChB,CAAC;IAEF,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAE,IAAY,EAAsB,EAAE;IACxF,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,OAAkC,CAAC;IAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC;IAEvB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,8DAA8D;IAC9D,6DAA6D;IAC7D,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,iCAAiC;IACjC,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAgB,EAAW,EAAE;IAC5D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,OAAkC,CAAC;IAC/C,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IAE/B,OAAO,IAAI,CAAC;AACb,CAAC,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export type Middleware<TParams extends any[], TReturn> = (...params: [...TParams, next: (...params: TParams) => TReturn]) => TReturn;
2
2
  export declare const createAsyncMiddlewareRunner: <TParams extends any[], TReturn>(middlewares: [...Middleware<TParams, Promise<TReturn>>[], Middleware<TParams, Promise<TReturn>>]) => (...params: TParams) => Promise<TReturn>;
3
+ //# sourceMappingURL=middlewares.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middlewares.d.ts","sourceRoot":"","sources":["../../../lib/main/utils/middlewares.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,CAAC,OAAO,SAAS,GAAG,EAAE,EAAE,OAAO,IAAI,CACxD,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,KAC1D,OAAO,CAAC;AAEb,eAAO,MAAM,2BAA2B,GAAI,OAAO,SAAS,GAAG,EAAE,EAAE,OAAO,EACzE,aAAa,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,iBAGrD,OAAO,KAAK,OAAO,CAAC,OAAO,CAItE,CAAC"}
@@ -1,3 +1,4 @@
1
1
  import type { XRPCBlobBodyParam, XRPCLexBodyParam } from '@atcute/lexicons/validations';
2
2
  import type { Result } from '../../types/misc.js';
3
3
  export declare const constructMimeValidator: (param: XRPCLexBodyParam | XRPCBlobBodyParam) => ((request: Request) => Result<void, string>) | null;
4
+ //# sourceMappingURL=request-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-input.d.ts","sourceRoot":"","sources":["../../../lib/main/utils/request-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAExF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAmBlD,eAAO,MAAM,sBAAsB,GAAI,OAAO,gBAAgB,GAAG,iBAAiB,gBAdhE,OAAO,KAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAsC/C,CAAC"}
@@ -3,3 +3,4 @@ import type { Literal } from '../../types/misc.js';
3
3
  type MaybeArray<T> = T | T[];
4
4
  export declare const constructParamsHandler: <TSchema extends ObjectSchema>(schema: TSchema) => (searchParams: URLSearchParams) => ValidationResult<Record<string, MaybeArray<Literal>>>;
5
5
  export {};
6
+ //# sourceMappingURL=request-params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-params.d.ts","sourceRoot":"","sources":["../../../lib/main/utils/request-params.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,YAAY,EAEjB,KAAK,gBAAgB,EACrB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAiC7B,eAAO,MAAM,sBAAsB,GAAI,OAAO,SAAS,YAAY,EAAE,QAAQ,OAAO,MA2B3E,cAAc,eAAe,KAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CA4B5F,CAAC"}
@@ -1,3 +1,4 @@
1
1
  import type { Err } from '@atcute/lexicons/validations';
2
2
  export declare const invalidRequest: (message: string) => Response;
3
3
  export declare const validationError: (kind: "params" | "input", err: Err) => Response;
4
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../lib/main/utils/response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAC;AAExD,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,aAE7C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,MAAM,QAAQ,GAAG,OAAO,EAAE,KAAK,GAAG,KAAG,QAOpE,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Promisable } from '../../types/misc.js';
2
+ import type { XRPCRouter } from '../router.js';
3
+ import type { WebSocketAdapter, WebSocketConnection } from '../types/websocket.js';
4
+ import { EventEmitter } from './event-emitter.js';
5
+ export interface SubscriptionClient extends Disposable {
6
+ events: EventEmitter<{
7
+ message: [data: Uint8Array];
8
+ close: [event: {
9
+ code: number;
10
+ reason: string;
11
+ wasClean: boolean;
12
+ }];
13
+ }>;
14
+ dispose(): void;
15
+ }
16
+ export interface SubscriptionMock {
17
+ subscribe(url: string): Promise<SubscriptionClient>;
18
+ }
19
+ export declare class MockWebSocketAdapter implements WebSocketAdapter {
20
+ #private;
21
+ upgrade(_request: Request, handler: (ws: WebSocketConnection) => Promisable<void>): Promisable<Response | undefined>;
22
+ attach(router: XRPCRouter): SubscriptionMock;
23
+ }
24
+ //# sourceMappingURL=websocket-mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-mock.d.ts","sourceRoot":"","sources":["../../../lib/main/utils/websocket-mock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACrD,MAAM,EAAE,YAAY,CAAC;QACpB,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5B,KAAK,EAAE,CAAC,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACpE,CAAC,CAAC;IACH,OAAO,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACpD;AAED,qBAAa,oBAAqB,YAAW,gBAAgB;;IAG5D,OAAO,CACN,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,CAAC,EAAE,EAAE,mBAAmB,KAAK,UAAU,CAAC,IAAI,CAAC,GACpD,UAAU,CAAC,QAAQ,GAAG,SAAS,CAAC;IAWnC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,gBAAgB;CAsE5C"}
@@ -0,0 +1,71 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { EventEmitter } from './event-emitter.js';
3
+ export class MockWebSocketAdapter {
4
+ #context = new AsyncLocalStorage();
5
+ upgrade(_request, handler) {
6
+ const ctx = this.#context.getStore();
7
+ if (!ctx) {
8
+ return undefined;
9
+ }
10
+ ctx.handler = handler;
11
+ return new Response(null);
12
+ }
13
+ attach(router) {
14
+ return {
15
+ subscribe: async (url) => {
16
+ const ctx = {
17
+ handler: null,
18
+ };
19
+ await this.#context.run(ctx, async () => {
20
+ const urlp = new URL(url, 'http://localhost');
21
+ const request = new Request(urlp, {
22
+ headers: {
23
+ upgrade: 'websocket',
24
+ connection: 'upgrade',
25
+ },
26
+ });
27
+ const response = await router.fetch(request);
28
+ return response;
29
+ });
30
+ if (!ctx.handler) {
31
+ throw new Error(`WebSocket upgrade succeeded but no handler was set`);
32
+ }
33
+ const events = new EventEmitter();
34
+ const controller = new AbortController();
35
+ const signal = controller.signal;
36
+ const connection = {
37
+ signal: signal,
38
+ send(data) {
39
+ events.emit('message', data);
40
+ },
41
+ close(code = 1000, reason = '') {
42
+ if (!signal.aborted) {
43
+ events.emit('close', { code, reason, wasClean: true });
44
+ controller.abort();
45
+ }
46
+ },
47
+ };
48
+ {
49
+ const handler = ctx.handler;
50
+ setTimeout(() => {
51
+ handler(connection);
52
+ }, 1);
53
+ }
54
+ const client = {
55
+ events,
56
+ dispose() {
57
+ if (!signal.aborted) {
58
+ events.emit('close', { code: 1000, reason: '', wasClean: true });
59
+ controller.abort();
60
+ }
61
+ },
62
+ [Symbol.dispose]() {
63
+ this.dispose();
64
+ },
65
+ };
66
+ return client;
67
+ },
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=websocket-mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-mock.js","sourceRoot":"","sources":["../../../lib/main/utils/websocket-mock.ts"],"names":[],"mappings":"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"}
@@ -37,3 +37,15 @@ export declare class NotEnoughResourcesError extends XRPCError {
37
37
  export declare class UpstreamTimeoutError extends XRPCError {
38
38
  constructor({ status, error, description }?: Partial<XRPCErrorOptions>);
39
39
  }
40
+ export interface XRPCSubscriptionErrorOptions {
41
+ closeCode?: number;
42
+ error: string;
43
+ description?: string;
44
+ }
45
+ export declare class XRPCSubscriptionError extends Error {
46
+ readonly closeCode: number;
47
+ readonly error: string;
48
+ readonly description?: string;
49
+ constructor({ closeCode, error, description }: XRPCSubscriptionErrorOptions);
50
+ }
51
+ //# sourceMappingURL=xrpc-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xrpc-error.d.ts","sourceRoot":"","sources":["../../lib/main/xrpc-error.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,SAAU,SAAQ,KAAK;IACnC,sBAAsB;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,iBAAiB;IACjB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;gBAElB,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,gBAAgB;IAS5D,UAAU,IAAI,QAAQ;CAGtB;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBACrC,EAAE,MAAY,EAAE,KAAwB,EAAE,WAAW,EAAE,GAAE,OAAO,CAAC,gBAAgB,CAAM;CAGnG;AAED,qBAAa,iBAAkB,SAAQ,SAAS;gBACnC,EACX,MAAY,EACZ,KAAgC,EAChC,WAAW,GACX,GAAE,OAAO,CAAC,gBAAgB,CAAM;CAGjC;AAED,qBAAa,cAAe,SAAQ,SAAS;gBAChC,EAAE,MAAY,EAAE,KAAmB,EAAE,WAAW,EAAE,GAAE,OAAO,CAAC,gBAAgB,CAAM;CAG9F;AAED,qBAAa,sBAAuB,SAAQ,SAAS;gBACxC,EAAE,MAAY,EAAE,KAA2B,EAAE,WAAW,EAAE,GAAE,OAAO,CAAC,gBAAgB,CAAM;CAGtG;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBACrC,EAAE,MAAY,EAAE,KAA6B,EAAE,WAAW,EAAE,GAAE,OAAO,CAAC,gBAAgB,CAAM;CAGxG;AAED,qBAAa,oBAAqB,SAAQ,SAAS;gBACtC,EAAE,MAAY,EAAE,KAAyB,EAAE,WAAW,EAAE,GAAE,OAAO,CAAC,gBAAgB,CAAM;CAGpG;AAED,qBAAa,uBAAwB,SAAQ,SAAS;gBACzC,EAAE,MAAY,EAAE,KAA4B,EAAE,WAAW,EAAE,GAAE,OAAO,CAAC,gBAAgB,CAAM;CAGvG;AAED,qBAAa,oBAAqB,SAAQ,SAAS;gBACtC,EAAE,MAAY,EAAE,KAAyB,EAAE,WAAW,EAAE,GAAE,OAAO,CAAC,gBAAgB,CAAM;CAGpG;AAED,MAAM,WAAW,4BAA4B;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;gBAElB,EAAE,SAAgB,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,4BAA4B;CAOlF"}
@@ -55,4 +55,15 @@ export class UpstreamTimeoutError extends XRPCError {
55
55
  super({ status, error, description });
56
56
  }
57
57
  }
58
+ export class XRPCSubscriptionError extends Error {
59
+ closeCode;
60
+ error;
61
+ description;
62
+ constructor({ closeCode = 1008, error, description }) {
63
+ super(`Subscription error: ${error}${description ? ` - ${description}` : ''}`);
64
+ this.closeCode = closeCode;
65
+ this.error = error;
66
+ this.description = description;
67
+ }
68
+ }
58
69
  //# sourceMappingURL=xrpc-error.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"xrpc-error.js","sourceRoot":"","sources":["../../lib/main/xrpc-error.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,SAAU,SAAQ,KAAK;IACnC,sBAAsB;IACb,MAAM,CAAS;IAExB,iBAAiB;IACR,KAAK,CAAS;IACvB,oBAAoB;IACX,WAAW,CAAU;IAE9B,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAoB;QAC3D,KAAK,CAAC,GAAG,KAAK,MAAM,WAAW,IAAI,2BAA2B,EAAE,CAAC,CAAC;QAElE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,CAAC;IAED,UAAU;QACT,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjG,CAAC;CACD;AAED,MAAM,OAAO,mBAAoB,SAAQ,SAAS;IACjD,YAAY,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,GAAG,gBAAgB,EAAE,WAAW,KAAgC,EAAE;QAClG,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACvC,CAAC;CACD;AAED,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAC/C,YAAY,EACX,MAAM,GAAG,GAAG,EACZ,KAAK,GAAG,wBAAwB,EAChC,WAAW,MACmB,EAAE;QAChC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACvC,CAAC;CACD;AAED,MAAM,OAAO,cAAe,SAAQ,SAAS;IAC5C,YAAY,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,GAAG,WAAW,EAAE,WAAW,KAAgC,EAAE;QAC7F,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACvC,CAAC;CACD;AAED,MAAM,OAAO,sBAAuB,SAAQ,SAAS;IACpD,YAAY,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,GAAG,mBAAmB,EAAE,WAAW,KAAgC,EAAE;QACrG,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACvC,CAAC;CACD;AAED,MAAM,OAAO,mBAAoB,SAAQ,SAAS;IACjD,YAAY,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,GAAG,qBAAqB,EAAE,WAAW,KAAgC,EAAE;QACvG,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACvC,CAAC;CACD;AAED,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAClD,YAAY,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,GAAG,iBAAiB,EAAE,WAAW,KAAgC,EAAE;QACnG,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACvC,CAAC;CACD;AAED,MAAM,OAAO,uBAAwB,SAAQ,SAAS;IACrD,YAAY,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,GAAG,oBAAoB,EAAE,WAAW,KAAgC,EAAE;QACtG,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACvC,CAAC;CACD;AAED,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAClD,YAAY,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,GAAG,iBAAiB,EAAE,WAAW,KAAgC,EAAE;QACnG,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACvC,CAAC;CACD"}
1
+ {"version":3,"file":"xrpc-error.js","sourceRoot":"","sources":["../../lib/main/xrpc-error.ts"],"names":[],"mappings":"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"}
@@ -6,3 +6,4 @@ export interface CORSOptions {
6
6
  allowedHeaders?: string[];
7
7
  }
8
8
  export declare const cors: (options?: CORSOptions) => FetchMiddleware;
9
+ //# sourceMappingURL=cors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../lib/middlewares/cors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC3B,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAsBD,eAAO,MAAM,IAAI,GAAI,UAAS,WAAgB,KAAG,eAsChD,CAAC"}
@@ -7,3 +7,4 @@ export type Result<T, E> = {
7
7
  ok: false;
8
8
  error: E;
9
9
  };
10
+ //# sourceMappingURL=misc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../lib/types/misc.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3C,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhD,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC"}
package/lib/auth/jwt.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as v from '@badrap/valita';
2
2
 
3
+ import type { Did, Nsid } from '@atcute/lexicons';
3
4
  import { isDid, isNsid } from '@atcute/lexicons/syntax';
4
5
  import { fromBase64Url } from '@atcute/multibase';
5
6
  import { decodeUtf8From, encodeUtf8 } from '@atcute/uint8array';
@@ -13,14 +14,26 @@ const nsidString = v.string().assert(isNsid, `must be an nsid`);
13
14
 
14
15
  const integer = v.number().assert((input) => input >= 0 && Number.isSafeInteger(input), `must be an integer`);
15
16
 
16
- const jwtHeader = v.object({
17
+ export interface JwtHeader {
18
+ typ?: string;
19
+ alg: string;
20
+ }
21
+
22
+ const jwtHeader: v.Type<JwtHeader> = v.object({
17
23
  typ: v.string().optional(),
18
24
  alg: v.string(),
19
25
  });
20
26
 
21
- export interface JwtHeader extends v.Infer<typeof jwtHeader> {}
27
+ export interface JwtPayload {
28
+ iss: Did;
29
+ aud: Did;
30
+ exp: number;
31
+ iat?: number;
32
+ lxm?: Nsid;
33
+ jti?: string;
34
+ }
22
35
 
23
- const jwtPayload = v
36
+ const jwtPayload: v.Type<JwtPayload> = v
24
37
  .object({
25
38
  /** issuer */
26
39
  iss: didString,
@@ -40,13 +53,11 @@ const jwtPayload = v
40
53
  path: ['exp'],
41
54
  });
42
55
 
43
- export interface JwtPayload extends v.Infer<typeof jwtPayload> {}
44
-
45
56
  export interface ParsedJwt {
46
57
  header: JwtHeader;
47
58
  payload: JwtPayload;
48
- message: Uint8Array;
49
- signature: Uint8Array;
59
+ message: Uint8Array<ArrayBuffer>;
60
+ signature: Uint8Array<ArrayBuffer>;
50
61
  }
51
62
 
52
63
  const readJwtPortion = <T>(schema: v.Type<T>, input: string): Result<T, AuthError> => {
@@ -69,7 +80,7 @@ const readJwtPortion = <T>(schema: v.Type<T>, input: string): Result<T, AuthErro
69
80
  };
70
81
  };
71
82
 
72
- const readJwtSignature = (input: string): Result<Uint8Array, AuthError> => {
83
+ const readJwtSignature = (input: string): Result<Uint8Array<ArrayBuffer>, AuthError> => {
73
84
  try {
74
85
  return { ok: true, value: fromBase64Url(input) };
75
86
  } catch {}
package/lib/main/index.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export * from './response.js';
2
2
  export * from './router.js';
3
3
  export * from './xrpc-error.js';
4
+
5
+ export * from './types/websocket.js';