@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.
- package/LICENSE +12 -15
- package/README.md +13 -75
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/jwt-creator.d.ts +1 -0
- package/dist/auth/jwt-creator.d.ts.map +1 -0
- package/dist/auth/jwt-verifier.d.ts +1 -0
- package/dist/auth/jwt-verifier.d.ts.map +1 -0
- package/dist/auth/jwt.d.ts +13 -17
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js.map +1 -1
- package/dist/auth/types.d.ts +1 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/main/index.d.ts +2 -0
- package/dist/main/index.d.ts.map +1 -0
- package/dist/main/index.js +1 -0
- package/dist/main/index.js.map +1 -1
- package/dist/main/response.d.ts +1 -0
- package/dist/main/response.d.ts.map +1 -0
- package/dist/main/router.d.ts +13 -3
- package/dist/main/router.d.ts.map +1 -0
- package/dist/main/router.js +87 -7
- package/dist/main/router.js.map +1 -1
- package/dist/main/types/operation.d.ts +17 -1
- package/dist/main/types/operation.d.ts.map +1 -0
- package/dist/main/types/websocket.d.ts +10 -0
- package/dist/main/types/websocket.d.ts.map +1 -0
- package/dist/main/types/websocket.js +2 -0
- package/dist/main/types/websocket.js.map +1 -0
- package/dist/main/utils/event-emitter.d.ts +37 -0
- package/dist/main/utils/event-emitter.d.ts.map +1 -0
- package/dist/main/utils/event-emitter.js +96 -0
- package/dist/main/utils/event-emitter.js.map +1 -0
- package/dist/main/utils/frames.d.ts +5 -0
- package/dist/main/utils/frames.d.ts.map +1 -0
- package/dist/main/utils/frames.js +45 -0
- package/dist/main/utils/frames.js.map +1 -0
- package/dist/main/utils/middlewares.d.ts +1 -0
- package/dist/main/utils/middlewares.d.ts.map +1 -0
- package/dist/main/utils/request-input.d.ts +1 -0
- package/dist/main/utils/request-input.d.ts.map +1 -0
- package/dist/main/utils/request-params.d.ts +1 -0
- package/dist/main/utils/request-params.d.ts.map +1 -0
- package/dist/main/utils/response.d.ts +1 -0
- package/dist/main/utils/response.d.ts.map +1 -0
- package/dist/main/utils/websocket-mock.d.ts +24 -0
- package/dist/main/utils/websocket-mock.d.ts.map +1 -0
- package/dist/main/utils/websocket-mock.js +71 -0
- package/dist/main/utils/websocket-mock.js.map +1 -0
- package/dist/main/xrpc-error.d.ts +12 -0
- package/dist/main/xrpc-error.d.ts.map +1 -0
- package/dist/main/xrpc-error.js +11 -0
- package/dist/main/xrpc-error.js.map +1 -1
- package/dist/middlewares/cors.d.ts +1 -0
- package/dist/middlewares/cors.d.ts.map +1 -0
- package/dist/types/misc.d.ts +1 -0
- package/dist/types/misc.d.ts.map +1 -0
- package/lib/auth/jwt.ts +19 -8
- package/lib/main/index.ts +2 -0
- package/lib/main/router.ts +131 -10
- package/lib/main/types/operation.ts +33 -0
- package/lib/main/types/websocket.ts +14 -0
- package/lib/main/utils/event-emitter.ts +116 -0
- package/lib/main/utils/frames.ts +71 -0
- package/lib/main/utils/websocket-mock.ts +111 -0
- package/lib/main/xrpc-error.ts +20 -0
- 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"}
|
|
@@ -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"}
|
package/dist/main/xrpc-error.js
CHANGED
|
@@ -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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"}
|
|
@@ -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"}
|
package/dist/types/misc.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
83
|
+
const readJwtSignature = (input: string): Result<Uint8Array<ArrayBuffer>, AuthError> => {
|
|
73
84
|
try {
|
|
74
85
|
return { ok: true, value: fromBase64Url(input) };
|
|
75
86
|
} catch {}
|