@atcute/xrpc-server 0.1.10 → 0.1.11
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/README.md +9 -6
- package/dist/main/router.js +3 -3
- package/dist/main/router.js.map +1 -1
- package/dist/main/utils/request-input.d.ts +12 -0
- package/dist/main/utils/request-input.d.ts.map +1 -1
- package/dist/main/utils/request-input.js +22 -0
- package/dist/main/utils/request-input.js.map +1 -1
- package/lib/main/router.ts +3 -3
- package/lib/main/utils/request-input.ts +25 -0
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -79,21 +79,24 @@ export default router;
|
|
|
79
79
|
on Deno, Bun or Cloudflare Workers, you can export the router directly and expect it to work out of
|
|
80
80
|
the box.
|
|
81
81
|
|
|
82
|
-
for Node.js, you'll need
|
|
83
|
-
with standard Web
|
|
82
|
+
for Node.js, you'll need a fetch-to-Node adapter like
|
|
83
|
+
[`@remix-run/node-fetch-server`][node-fetch-server] since the router works with standard Web
|
|
84
|
+
Request/Response:
|
|
84
85
|
|
|
85
|
-
[
|
|
86
|
+
[node-fetch-server]: https://github.com/remix-run/remix/tree/main/packages/node-fetch-server
|
|
86
87
|
|
|
87
88
|
```ts
|
|
89
|
+
import * as http from 'node:http';
|
|
90
|
+
import { createRequestListener } from '@remix-run/node-fetch-server';
|
|
88
91
|
import { XRPCRouter } from '@atcute/xrpc-server';
|
|
89
|
-
import { serve } from '@hono/node-server';
|
|
90
92
|
|
|
91
93
|
const router = new XRPCRouter();
|
|
92
94
|
|
|
93
95
|
// ... add handlers ...
|
|
94
96
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
+
const server = http.createServer(createRequestListener(router.fetch));
|
|
98
|
+
server.listen(3000, () => {
|
|
99
|
+
console.log('listening on port 3000');
|
|
97
100
|
});
|
|
98
101
|
```
|
|
99
102
|
|
package/dist/main/router.js
CHANGED
|
@@ -2,7 +2,7 @@ import { safeParse, } from '@atcute/lexicons/validations';
|
|
|
2
2
|
import { encodeErrorFrame, encodeMessageFrame, extractMessageType, omitMessageType } from './utils/frames.js';
|
|
3
3
|
import { createAsyncMiddlewareRunner } from './utils/middlewares.js';
|
|
4
4
|
import { unwrapLxm } from './utils/namespaced.js';
|
|
5
|
-
import { constructMimeValidator } from './utils/request-input.js';
|
|
5
|
+
import { constructMimeValidator, hasRequestBody } from './utils/request-input.js';
|
|
6
6
|
import { constructParamsHandler } from './utils/request-params.js';
|
|
7
7
|
import { invalidRequest, validationError } from './utils/response.js';
|
|
8
8
|
import { XRPCError, XRPCSubscriptionError } from './xrpc-error.js';
|
|
@@ -129,7 +129,7 @@ export class XRPCRouter {
|
|
|
129
129
|
params = {};
|
|
130
130
|
}
|
|
131
131
|
if (requiresInput) {
|
|
132
|
-
if (request
|
|
132
|
+
if (!hasRequestBody(request)) {
|
|
133
133
|
return invalidRequest(`request body is expected but none was provided`);
|
|
134
134
|
}
|
|
135
135
|
if (validateInputType !== null) {
|
|
@@ -154,7 +154,7 @@ export class XRPCRouter {
|
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
else {
|
|
157
|
-
if (request
|
|
157
|
+
if (hasRequestBody(request)) {
|
|
158
158
|
return invalidRequest(`request body is provided when none was expected`);
|
|
159
159
|
}
|
|
160
160
|
}
|
package/dist/main/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../lib/main/router.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,SAAS,GAIT,MAAM,8BAA8B,CAAC;AAYtC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC9G,OAAO,EAAE,2BAA2B,EAAmB,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,SAAS,EAAmB,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../lib/main/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
import type { XRPCBlobBodyParam, XRPCLexBodyParam } from '@atcute/lexicons/validations';
|
|
2
2
|
import type { Result } from '../../types/misc.ts';
|
|
3
|
+
/**
|
|
4
|
+
* checks whether a request has a meaningful body.
|
|
5
|
+
*
|
|
6
|
+
* Node.js HTTP-to-fetch adapters always provide a `ReadableStream` for
|
|
7
|
+
* `request.body`, even when no body content was sent. this function
|
|
8
|
+
* uses `content-length` to handle that case while still respecting the
|
|
9
|
+
* web `Request` API where `body === null` signals no body.
|
|
10
|
+
*
|
|
11
|
+
* @param request incoming request to check
|
|
12
|
+
* @returns whether the request has body content
|
|
13
|
+
*/
|
|
14
|
+
export declare const hasRequestBody: (request: Request) => boolean;
|
|
3
15
|
export declare const constructMimeValidator: (param: XRPCBlobBodyParam | XRPCLexBodyParam<import("@atcute/lexicons/validations").ObjectSchema<import("@atcute/lexicons/validations").LooseObjectShape> | import("@atcute/lexicons/validations").VariantSchema<readonly import("@atcute/lexicons/validations").ObjectSchema<any>[], boolean>>) => ((request: Request) => Result<void, string>) | null;
|
|
4
16
|
//# sourceMappingURL=request-input.d.ts.map
|
|
@@ -1 +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;
|
|
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;AAElD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,+BAY1B,CAAC;AAmBF,eAAO,MAAM,sBAAsB,yVAwBlC,CAAC"}
|
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* checks whether a request has a meaningful body.
|
|
3
|
+
*
|
|
4
|
+
* Node.js HTTP-to-fetch adapters always provide a `ReadableStream` for
|
|
5
|
+
* `request.body`, even when no body content was sent. this function
|
|
6
|
+
* uses `content-length` to handle that case while still respecting the
|
|
7
|
+
* web `Request` API where `body === null` signals no body.
|
|
8
|
+
*
|
|
9
|
+
* @param request incoming request to check
|
|
10
|
+
* @returns whether the request has body content
|
|
11
|
+
*/
|
|
12
|
+
export const hasRequestBody = (request) => {
|
|
13
|
+
if (request.body === null) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
// Node.js adapters set content-length: 0 for bodiless requests while
|
|
17
|
+
// still providing a ReadableStream body; treat this as no body.
|
|
18
|
+
if (request.headers.get('content-length') === '0') {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return true;
|
|
22
|
+
};
|
|
1
23
|
const jsonMimeValidator = (() => {
|
|
2
24
|
const JSON_RE = /^\s*application\/json\s*(?:$|;)/;
|
|
3
25
|
return (request) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-input.js","sourceRoot":"","sources":["../../../lib/main/utils/request-input.ts"],"names":[],"mappings":"AAIA,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,iCAAiC,CAAC;IAElD,OAAO,CAAC,OAAgB,EAAwB,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACjD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wDAAwD,EAAE,CAAC;QACvF,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wDAAwD,EAAE,CAAC;QACvF,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAAA,CACtC,CAAC;AAAA,CACF,CAAC,EAAE,CAAC;AAEL,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAA2C,EAAE,EAAE,CAAC;IACtF,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,iBAAiB,CAAC;IAC1B,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,WAAW,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEvF,OAAO,CAAC,OAAgB,EAAwB,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACjD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wCAAwC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QACpG,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wCAAwC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QACpG,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAAA,CACtC,CAAC;AAAA,CACF,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAc,EAAE,GAAiB,EAAU,EAAE,CAAC;IACpE,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,CAAC,EAAE,CAAC;YACR,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,EAAE,CAAC;YACR,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;QACD,SAAS,CAAC;YACT,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAC1E,CAAC;IACF,CAAC;AAAA,CACD,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC;IAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;AAAA,CACzD,CAAC"}
|
|
1
|
+
{"version":3,"file":"request-input.js","sourceRoot":"","sources":["../../../lib/main/utils/request-input.ts"],"names":[],"mappings":"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"}
|
package/lib/main/router.ts
CHANGED
|
@@ -18,7 +18,7 @@ import type { WebSocketAdapter } from './types/websocket.ts';
|
|
|
18
18
|
import { encodeErrorFrame, encodeMessageFrame, extractMessageType, omitMessageType } from './utils/frames.ts';
|
|
19
19
|
import { createAsyncMiddlewareRunner, type Middleware } from './utils/middlewares.ts';
|
|
20
20
|
import { unwrapLxm, type Namespaced } from './utils/namespaced.ts';
|
|
21
|
-
import { constructMimeValidator } from './utils/request-input.ts';
|
|
21
|
+
import { constructMimeValidator, hasRequestBody } from './utils/request-input.ts';
|
|
22
22
|
import { constructParamsHandler } from './utils/request-params.ts';
|
|
23
23
|
import { invalidRequest, validationError } from './utils/response.ts';
|
|
24
24
|
import { XRPCError, XRPCSubscriptionError } from './xrpc-error.ts';
|
|
@@ -236,7 +236,7 @@ export class XRPCRouter {
|
|
|
236
236
|
}
|
|
237
237
|
|
|
238
238
|
if (requiresInput) {
|
|
239
|
-
if (request
|
|
239
|
+
if (!hasRequestBody(request)) {
|
|
240
240
|
return invalidRequest(`request body is expected but none was provided`);
|
|
241
241
|
}
|
|
242
242
|
|
|
@@ -263,7 +263,7 @@ export class XRPCRouter {
|
|
|
263
263
|
input = result.value;
|
|
264
264
|
}
|
|
265
265
|
} else {
|
|
266
|
-
if (request
|
|
266
|
+
if (hasRequestBody(request)) {
|
|
267
267
|
return invalidRequest(`request body is provided when none was expected`);
|
|
268
268
|
}
|
|
269
269
|
}
|
|
@@ -2,6 +2,31 @@ import type { XRPCBlobBodyParam, XRPCLexBodyParam } from '@atcute/lexicons/valid
|
|
|
2
2
|
|
|
3
3
|
import type { Result } from '../../types/misc.ts';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* checks whether a request has a meaningful body.
|
|
7
|
+
*
|
|
8
|
+
* Node.js HTTP-to-fetch adapters always provide a `ReadableStream` for
|
|
9
|
+
* `request.body`, even when no body content was sent. this function
|
|
10
|
+
* uses `content-length` to handle that case while still respecting the
|
|
11
|
+
* web `Request` API where `body === null` signals no body.
|
|
12
|
+
*
|
|
13
|
+
* @param request incoming request to check
|
|
14
|
+
* @returns whether the request has body content
|
|
15
|
+
*/
|
|
16
|
+
export const hasRequestBody = (request: Request): boolean => {
|
|
17
|
+
if (request.body === null) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Node.js adapters set content-length: 0 for bodiless requests while
|
|
22
|
+
// still providing a ReadableStream body; treat this as no body.
|
|
23
|
+
if (request.headers.get('content-length') === '0') {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return true;
|
|
28
|
+
};
|
|
29
|
+
|
|
5
30
|
const jsonMimeValidator = (() => {
|
|
6
31
|
const JSON_RE = /^\s*application\/json\s*(?:$|;)/;
|
|
7
32
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atcute/xrpc-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
4
4
|
"description": "a small web framework for handling XRPC operations",
|
|
5
5
|
"license": "0BSD",
|
|
6
6
|
"repository": {
|
|
@@ -27,19 +27,19 @@
|
|
|
27
27
|
"nanoid": "^5.1.6",
|
|
28
28
|
"@atcute/cbor": "^2.3.2",
|
|
29
29
|
"@atcute/crypto": "^2.3.0",
|
|
30
|
-
"@atcute/identity": "^1.
|
|
30
|
+
"@atcute/identity-resolver": "^1.2.2",
|
|
31
31
|
"@atcute/lexicons": "^1.2.9",
|
|
32
|
+
"@atcute/identity": "^1.1.3",
|
|
32
33
|
"@atcute/multibase": "^1.1.8",
|
|
33
|
-
"@atcute/uint8array": "^1.1.1"
|
|
34
|
-
"@atcute/identity-resolver": "^1.2.2"
|
|
34
|
+
"@atcute/uint8array": "^1.1.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@atcute/xrpc-server": "file:",
|
|
38
|
-
"@types/node": "^25.
|
|
38
|
+
"@types/node": "^25.3.0",
|
|
39
39
|
"@vitest/coverage-v8": "^4.0.18",
|
|
40
40
|
"vitest": "^4.0.18",
|
|
41
41
|
"@atcute/atproto": "^3.1.10",
|
|
42
|
-
"@atcute/bluesky": "^3.2.
|
|
42
|
+
"@atcute/bluesky": "^3.2.19"
|
|
43
43
|
},
|
|
44
44
|
"scripts": {
|
|
45
45
|
"build": "tsgo --project tsconfig.build.json",
|