@atproto/xrpc-server 0.6.4 → 0.7.1
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 +34 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +55 -74
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +73 -17
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +97 -40
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +5 -6
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +69 -74
- package/dist/util.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +1 -7
- package/src/server.ts +78 -99
- package/src/types.ts +209 -41
- package/src/util.ts +80 -62
- package/tests/parsing.test.ts +89 -0
package/dist/types.js
CHANGED
|
@@ -3,10 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.MethodNotImplementedError = exports.UpstreamTimeoutError = exports.NotEnoughResourcesError = exports.UpstreamFailureError = exports.InternalServerError = exports.RateLimitExceededError = exports.ForbiddenError = exports.AuthRequiredError = exports.InvalidRequestError = exports.isHandlerError = exports.XRPCError = exports.isShared = exports.handlerError = exports.handlerPipeThrough = exports.handlerSuccess = exports.handlerAuth = exports.handlerInput = void 0;
|
|
6
|
+
exports.MethodNotImplementedError = exports.UpstreamTimeoutError = exports.NotEnoughResourcesError = exports.UpstreamFailureError = exports.InternalServerError = exports.RateLimitExceededError = exports.ForbiddenError = exports.AuthRequiredError = exports.InvalidRequestError = exports.isHandlerPipeThroughStream = exports.isHandlerPipeThroughBuffer = exports.isHandlerError = exports.XRPCError = exports.isShared = exports.handlerError = exports.handlerPipeThrough = exports.handlerPipeThroughStream = exports.handlerPipeThroughBuffer = exports.handlerSuccess = exports.headersSchema = exports.handlerAuth = exports.handlerInput = void 0;
|
|
7
|
+
const xrpc_1 = require("@atproto/xrpc");
|
|
7
8
|
const http_errors_1 = require("http-errors");
|
|
9
|
+
const stream_1 = require("stream");
|
|
8
10
|
const zod_1 = __importDefault(require("zod"));
|
|
9
|
-
const xrpc_1 = require("@atproto/xrpc");
|
|
10
11
|
exports.handlerInput = zod_1.default.object({
|
|
11
12
|
encoding: zod_1.default.string(),
|
|
12
13
|
body: zod_1.default.any(),
|
|
@@ -15,16 +16,26 @@ exports.handlerAuth = zod_1.default.object({
|
|
|
15
16
|
credentials: zod_1.default.any(),
|
|
16
17
|
artifacts: zod_1.default.any(),
|
|
17
18
|
});
|
|
19
|
+
exports.headersSchema = zod_1.default.record(zod_1.default.string());
|
|
18
20
|
exports.handlerSuccess = zod_1.default.object({
|
|
19
21
|
encoding: zod_1.default.string(),
|
|
20
22
|
body: zod_1.default.any(),
|
|
21
|
-
headers:
|
|
23
|
+
headers: exports.headersSchema.optional(),
|
|
24
|
+
});
|
|
25
|
+
exports.handlerPipeThroughBuffer = zod_1.default.object({
|
|
26
|
+
encoding: zod_1.default.string(),
|
|
27
|
+
buffer: zod_1.default.instanceof(Buffer),
|
|
28
|
+
headers: exports.headersSchema.optional(),
|
|
22
29
|
});
|
|
23
|
-
exports.
|
|
30
|
+
exports.handlerPipeThroughStream = zod_1.default.object({
|
|
24
31
|
encoding: zod_1.default.string(),
|
|
25
|
-
|
|
26
|
-
headers:
|
|
32
|
+
stream: zod_1.default.instanceof(stream_1.Readable),
|
|
33
|
+
headers: exports.headersSchema.optional(),
|
|
27
34
|
});
|
|
35
|
+
exports.handlerPipeThrough = zod_1.default.union([
|
|
36
|
+
exports.handlerPipeThroughBuffer,
|
|
37
|
+
exports.handlerPipeThroughStream,
|
|
38
|
+
]);
|
|
28
39
|
exports.handlerError = zod_1.default.object({
|
|
29
40
|
status: zod_1.default.number(),
|
|
30
41
|
error: zod_1.default.string().optional(),
|
|
@@ -35,8 +46,8 @@ const isShared = (opts) => {
|
|
|
35
46
|
};
|
|
36
47
|
exports.isShared = isShared;
|
|
37
48
|
class XRPCError extends Error {
|
|
38
|
-
constructor(type, errorMessage, customErrorName) {
|
|
39
|
-
super(errorMessage);
|
|
49
|
+
constructor(type, errorMessage, customErrorName, options) {
|
|
50
|
+
super(errorMessage, options);
|
|
40
51
|
Object.defineProperty(this, "type", {
|
|
41
52
|
enumerable: true,
|
|
42
53
|
configurable: true,
|
|
@@ -70,25 +81,26 @@ class XRPCError extends Error {
|
|
|
70
81
|
get typeStr() {
|
|
71
82
|
return xrpc_1.ResponseTypeStrings[this.type];
|
|
72
83
|
}
|
|
73
|
-
static fromError(
|
|
74
|
-
if (
|
|
75
|
-
return
|
|
84
|
+
static fromError(cause) {
|
|
85
|
+
if (cause instanceof XRPCError) {
|
|
86
|
+
return cause;
|
|
76
87
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
resultErr = new XRPCError(error.status, error.message, error.name);
|
|
88
|
+
if (cause instanceof xrpc_1.XRPCError) {
|
|
89
|
+
return new XRPCError(cause.status, cause.message, cause.error, { cause });
|
|
80
90
|
}
|
|
81
|
-
|
|
82
|
-
|
|
91
|
+
if ((0, http_errors_1.isHttpError)(cause)) {
|
|
92
|
+
return new XRPCError(cause.status, cause.message, cause.name, { cause });
|
|
83
93
|
}
|
|
84
|
-
|
|
85
|
-
|
|
94
|
+
if (isHandlerError(cause)) {
|
|
95
|
+
return this.fromHandlerError(cause);
|
|
86
96
|
}
|
|
87
|
-
|
|
88
|
-
|
|
97
|
+
if (cause instanceof Error) {
|
|
98
|
+
return new InternalServerError(cause.message, undefined, { cause });
|
|
89
99
|
}
|
|
90
|
-
|
|
91
|
-
|
|
100
|
+
return new InternalServerError('Unexpected internal server error', undefined, { cause });
|
|
101
|
+
}
|
|
102
|
+
static fromHandlerError(err) {
|
|
103
|
+
return new XRPCError(err.status, err.message, err.error, { cause: err });
|
|
92
104
|
}
|
|
93
105
|
}
|
|
94
106
|
exports.XRPCError = XRPCError;
|
|
@@ -100,27 +112,48 @@ function isHandlerError(v) {
|
|
|
100
112
|
(v['message'] === undefined || typeof v['message'] === 'string'));
|
|
101
113
|
}
|
|
102
114
|
exports.isHandlerError = isHandlerError;
|
|
115
|
+
function isHandlerPipeThroughBuffer(v) {
|
|
116
|
+
// We only need to discriminate between possible HandlerOutput values
|
|
117
|
+
return v['buffer'] !== undefined;
|
|
118
|
+
}
|
|
119
|
+
exports.isHandlerPipeThroughBuffer = isHandlerPipeThroughBuffer;
|
|
120
|
+
function isHandlerPipeThroughStream(v) {
|
|
121
|
+
// We only need to discriminate between possible HandlerOutput values
|
|
122
|
+
return v['stream'] !== undefined;
|
|
123
|
+
}
|
|
124
|
+
exports.isHandlerPipeThroughStream = isHandlerPipeThroughStream;
|
|
103
125
|
class InvalidRequestError extends XRPCError {
|
|
104
|
-
constructor(errorMessage, customErrorName) {
|
|
105
|
-
super(xrpc_1.ResponseType.InvalidRequest, errorMessage, customErrorName);
|
|
126
|
+
constructor(errorMessage, customErrorName, options) {
|
|
127
|
+
super(xrpc_1.ResponseType.InvalidRequest, errorMessage, customErrorName, options);
|
|
128
|
+
}
|
|
129
|
+
[Symbol.hasInstance](instance) {
|
|
130
|
+
return (instance instanceof XRPCError &&
|
|
131
|
+
instance.type === xrpc_1.ResponseType.InvalidRequest);
|
|
106
132
|
}
|
|
107
133
|
}
|
|
108
134
|
exports.InvalidRequestError = InvalidRequestError;
|
|
109
135
|
class AuthRequiredError extends XRPCError {
|
|
110
|
-
constructor(errorMessage, customErrorName) {
|
|
111
|
-
super(xrpc_1.ResponseType.AuthRequired, errorMessage, customErrorName);
|
|
136
|
+
constructor(errorMessage, customErrorName, options) {
|
|
137
|
+
super(xrpc_1.ResponseType.AuthRequired, errorMessage, customErrorName, options);
|
|
138
|
+
}
|
|
139
|
+
[Symbol.hasInstance](instance) {
|
|
140
|
+
return (instance instanceof XRPCError &&
|
|
141
|
+
instance.type === xrpc_1.ResponseType.AuthRequired);
|
|
112
142
|
}
|
|
113
143
|
}
|
|
114
144
|
exports.AuthRequiredError = AuthRequiredError;
|
|
115
145
|
class ForbiddenError extends XRPCError {
|
|
116
|
-
constructor(errorMessage, customErrorName) {
|
|
117
|
-
super(xrpc_1.ResponseType.Forbidden, errorMessage, customErrorName);
|
|
146
|
+
constructor(errorMessage, customErrorName, options) {
|
|
147
|
+
super(xrpc_1.ResponseType.Forbidden, errorMessage, customErrorName, options);
|
|
148
|
+
}
|
|
149
|
+
[Symbol.hasInstance](instance) {
|
|
150
|
+
return (instance instanceof XRPCError && instance.type === xrpc_1.ResponseType.Forbidden);
|
|
118
151
|
}
|
|
119
152
|
}
|
|
120
153
|
exports.ForbiddenError = ForbiddenError;
|
|
121
154
|
class RateLimitExceededError extends XRPCError {
|
|
122
|
-
constructor(status, errorMessage, customErrorName) {
|
|
123
|
-
super(xrpc_1.ResponseType.RateLimitExceeded, errorMessage, customErrorName);
|
|
155
|
+
constructor(status, errorMessage, customErrorName, options) {
|
|
156
|
+
super(xrpc_1.ResponseType.RateLimitExceeded, errorMessage, customErrorName, options);
|
|
124
157
|
Object.defineProperty(this, "status", {
|
|
125
158
|
enumerable: true,
|
|
126
159
|
configurable: true,
|
|
@@ -128,35 +161,59 @@ class RateLimitExceededError extends XRPCError {
|
|
|
128
161
|
value: status
|
|
129
162
|
});
|
|
130
163
|
}
|
|
164
|
+
[Symbol.hasInstance](instance) {
|
|
165
|
+
return (instance instanceof XRPCError &&
|
|
166
|
+
instance.type === xrpc_1.ResponseType.RateLimitExceeded);
|
|
167
|
+
}
|
|
131
168
|
}
|
|
132
169
|
exports.RateLimitExceededError = RateLimitExceededError;
|
|
133
170
|
class InternalServerError extends XRPCError {
|
|
134
|
-
constructor(errorMessage, customErrorName) {
|
|
135
|
-
super(xrpc_1.ResponseType.InternalServerError, errorMessage, customErrorName);
|
|
171
|
+
constructor(errorMessage, customErrorName, options) {
|
|
172
|
+
super(xrpc_1.ResponseType.InternalServerError, errorMessage, customErrorName, options);
|
|
173
|
+
}
|
|
174
|
+
[Symbol.hasInstance](instance) {
|
|
175
|
+
return (instance instanceof XRPCError &&
|
|
176
|
+
instance.type === xrpc_1.ResponseType.InternalServerError);
|
|
136
177
|
}
|
|
137
178
|
}
|
|
138
179
|
exports.InternalServerError = InternalServerError;
|
|
139
180
|
class UpstreamFailureError extends XRPCError {
|
|
140
|
-
constructor(errorMessage, customErrorName) {
|
|
141
|
-
super(xrpc_1.ResponseType.UpstreamFailure, errorMessage, customErrorName);
|
|
181
|
+
constructor(errorMessage, customErrorName, options) {
|
|
182
|
+
super(xrpc_1.ResponseType.UpstreamFailure, errorMessage, customErrorName, options);
|
|
183
|
+
}
|
|
184
|
+
[Symbol.hasInstance](instance) {
|
|
185
|
+
return (instance instanceof XRPCError &&
|
|
186
|
+
instance.type === xrpc_1.ResponseType.UpstreamFailure);
|
|
142
187
|
}
|
|
143
188
|
}
|
|
144
189
|
exports.UpstreamFailureError = UpstreamFailureError;
|
|
145
190
|
class NotEnoughResourcesError extends XRPCError {
|
|
146
|
-
constructor(errorMessage, customErrorName) {
|
|
147
|
-
super(xrpc_1.ResponseType.NotEnoughResources, errorMessage, customErrorName);
|
|
191
|
+
constructor(errorMessage, customErrorName, options) {
|
|
192
|
+
super(xrpc_1.ResponseType.NotEnoughResources, errorMessage, customErrorName, options);
|
|
193
|
+
}
|
|
194
|
+
[Symbol.hasInstance](instance) {
|
|
195
|
+
return (instance instanceof XRPCError &&
|
|
196
|
+
instance.type === xrpc_1.ResponseType.NotEnoughResources);
|
|
148
197
|
}
|
|
149
198
|
}
|
|
150
199
|
exports.NotEnoughResourcesError = NotEnoughResourcesError;
|
|
151
200
|
class UpstreamTimeoutError extends XRPCError {
|
|
152
|
-
constructor(errorMessage, customErrorName) {
|
|
153
|
-
super(xrpc_1.ResponseType.UpstreamTimeout, errorMessage, customErrorName);
|
|
201
|
+
constructor(errorMessage, customErrorName, options) {
|
|
202
|
+
super(xrpc_1.ResponseType.UpstreamTimeout, errorMessage, customErrorName, options);
|
|
203
|
+
}
|
|
204
|
+
[Symbol.hasInstance](instance) {
|
|
205
|
+
return (instance instanceof XRPCError &&
|
|
206
|
+
instance.type === xrpc_1.ResponseType.UpstreamTimeout);
|
|
154
207
|
}
|
|
155
208
|
}
|
|
156
209
|
exports.UpstreamTimeoutError = UpstreamTimeoutError;
|
|
157
210
|
class MethodNotImplementedError extends XRPCError {
|
|
158
|
-
constructor(errorMessage, customErrorName) {
|
|
159
|
-
super(xrpc_1.ResponseType.MethodNotImplemented, errorMessage, customErrorName);
|
|
211
|
+
constructor(errorMessage, customErrorName, options) {
|
|
212
|
+
super(xrpc_1.ResponseType.MethodNotImplemented, errorMessage, customErrorName, options);
|
|
213
|
+
}
|
|
214
|
+
[Symbol.hasInstance](instance) {
|
|
215
|
+
return (instance instanceof XRPCError &&
|
|
216
|
+
instance.type === xrpc_1.ResponseType.MethodNotImplemented);
|
|
160
217
|
}
|
|
161
218
|
}
|
|
162
219
|
exports.MethodNotImplementedError = MethodNotImplementedError;
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
-
/// <reference types="node" />
|
|
4
|
-
import { Duplex } from 'node:stream';
|
|
5
3
|
import { IncomingMessage } from 'node:http';
|
|
6
4
|
import express from 'express';
|
|
7
5
|
import { Lexicons, LexXrpcProcedure, LexXrpcQuery, LexXrpcSubscription } from '@atproto/lexicon';
|
|
@@ -10,12 +8,9 @@ export declare function decodeQueryParams(def: LexXrpcProcedure | LexXrpcQuery |
|
|
|
10
8
|
export declare function decodeQueryParam(type: string, value: unknown): string | number | boolean | undefined;
|
|
11
9
|
export declare function getQueryParams(url?: string): Record<string, string | string[]>;
|
|
12
10
|
export declare function validateInput(nsid: string, def: LexXrpcProcedure | LexXrpcQuery, req: express.Request, opts: RouteOpts, lexicons: Lexicons): HandlerInput | undefined;
|
|
13
|
-
export declare function validateOutput(nsid: string, def: LexXrpcProcedure | LexXrpcQuery, output: HandlerSuccess | undefined, lexicons: Lexicons):
|
|
11
|
+
export declare function validateOutput(nsid: string, def: LexXrpcProcedure | LexXrpcQuery, output: HandlerSuccess | undefined, lexicons: Lexicons): void;
|
|
14
12
|
export declare function normalizeMime(v: string): any;
|
|
15
13
|
export declare function processBodyAsBytes(req: express.Request): Promise<Uint8Array>;
|
|
16
|
-
export declare function createDecoders(contentEncoding?: string | string[]): Duplex[];
|
|
17
|
-
export declare function parseContentEncoding(contentEncoding?: string | string[]): string[];
|
|
18
|
-
export declare function createDecoder(encoding: string): Duplex;
|
|
19
14
|
export declare function serverTimingHeader(timings: ServerTiming[]): string;
|
|
20
15
|
export declare class ServerTimer implements ServerTiming {
|
|
21
16
|
name: string;
|
|
@@ -32,4 +27,8 @@ export interface ServerTiming {
|
|
|
32
27
|
description?: string;
|
|
33
28
|
}
|
|
34
29
|
export declare const parseReqNsid: (req: express.Request | IncomingMessage) => string;
|
|
30
|
+
/**
|
|
31
|
+
* Validates and extracts the nsid from an xrpc path
|
|
32
|
+
*/
|
|
33
|
+
export declare const parseUrlNsid: (url: string) => string;
|
|
35
34
|
//# sourceMappingURL=util.d.ts.map
|
package/dist/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,OAAO,MAAM,SAAS,CAAA;AAE7B,OAAO,EAEL,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACpB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,EACL,eAAe,EACf,MAAM,EACN,YAAY,EACZ,cAAc,EAKd,SAAS,EACV,MAAM,SAAS,CAAA;AAEhB,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,gBAAgB,GAAG,YAAY,GAAG,mBAAmB,EAC1D,MAAM,EAAE,eAAe,GACtB,MAAM,CAmBR;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GACb,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAcvC;AAED,wBAAgB,cAAc,CAAC,GAAG,SAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAU1E;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,GAAG,YAAY,EACpC,GAAG,EAAE,OAAO,CAAC,OAAO,EACpB,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,QAAQ,GACjB,YAAY,GAAG,SAAS,CA+D1B;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,GAAG,YAAY,EACpC,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,QAAQ,EAAE,QAAQ,GACjB,IAAI,CAwCN;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,OAOtC;AAmBD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAM5E;AAsDD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,UASzD;AAED,qBAAa,WAAY,YAAW,YAAY;IAIrC,IAAI,EAAE,MAAM;IACZ,WAAW,CAAC;IAJd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,OAAO,CAAC,CAAQ;gBAEf,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,oBAAQ;IAE7B,KAAK;IAIL,IAAI;CAKL;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,eAAO,MAAM,YAAY,QAAS,eAAe,GAAG,eAAe,WACI,CAAA;AAEvE;;GAEG;AACH,eAAO,MAAM,YAAY,QAAS,MAAM,KAAG,MA4D1C,CAAA"}
|
package/dist/util.js
CHANGED
|
@@ -1,35 +1,11 @@
|
|
|
1
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
4
|
};
|
|
28
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.
|
|
6
|
+
exports.parseUrlNsid = exports.parseReqNsid = exports.ServerTimer = exports.serverTimingHeader = exports.processBodyAsBytes = exports.normalizeMime = exports.validateOutput = exports.validateInput = exports.getQueryParams = exports.decodeQueryParam = exports.decodeQueryParams = void 0;
|
|
30
7
|
const node_assert_1 = __importDefault(require("node:assert"));
|
|
31
8
|
const node_stream_1 = require("node:stream");
|
|
32
|
-
const zlib = __importStar(require("node:zlib"));
|
|
33
9
|
const mime_types_1 = __importDefault(require("mime-types"));
|
|
34
10
|
const lexicon_1 = require("@atproto/lexicon");
|
|
35
11
|
const common_1 = require("@atproto/common");
|
|
@@ -169,7 +145,6 @@ function validateOutput(nsid, def, output, lexicons) {
|
|
|
169
145
|
throw new types_1.InternalServerError(e instanceof Error ? e.message : String(e));
|
|
170
146
|
}
|
|
171
147
|
}
|
|
172
|
-
return output;
|
|
173
148
|
}
|
|
174
149
|
exports.validateOutput = validateOutput;
|
|
175
150
|
function normalizeMime(v) {
|
|
@@ -224,7 +199,13 @@ function decodeBodyStream(req, maxSize) {
|
|
|
224
199
|
contentLengthParsed > maxSize) {
|
|
225
200
|
throw new types_1.XRPCError(xrpc_1.ResponseType.PayloadTooLarge, 'request entity too large');
|
|
226
201
|
}
|
|
227
|
-
|
|
202
|
+
let transforms;
|
|
203
|
+
try {
|
|
204
|
+
transforms = (0, common_1.createDecoders)(contentEncoding);
|
|
205
|
+
}
|
|
206
|
+
catch (cause) {
|
|
207
|
+
throw new types_1.XRPCError(xrpc_1.ResponseType.UnsupportedMediaType, 'unsupported content-encoding', undefined, { cause });
|
|
208
|
+
}
|
|
228
209
|
if (maxSize !== undefined) {
|
|
229
210
|
const maxSizeChecker = new common_1.MaxSizeChecker(maxSize, () => new types_1.XRPCError(xrpc_1.ResponseType.PayloadTooLarge, 'request entity too large'));
|
|
230
211
|
transforms.push(maxSizeChecker);
|
|
@@ -233,48 +214,6 @@ function decodeBodyStream(req, maxSize) {
|
|
|
233
214
|
? (0, node_stream_1.pipeline)([req, ...transforms], () => { })
|
|
234
215
|
: req;
|
|
235
216
|
}
|
|
236
|
-
function createDecoders(contentEncoding) {
|
|
237
|
-
return parseContentEncoding(contentEncoding).reverse().map(createDecoder);
|
|
238
|
-
}
|
|
239
|
-
exports.createDecoders = createDecoders;
|
|
240
|
-
function parseContentEncoding(contentEncoding) {
|
|
241
|
-
// undefined, empty string, and empty array
|
|
242
|
-
if (!contentEncoding?.length)
|
|
243
|
-
return [];
|
|
244
|
-
// Non empty string
|
|
245
|
-
if (typeof contentEncoding === 'string') {
|
|
246
|
-
return contentEncoding
|
|
247
|
-
.split(',')
|
|
248
|
-
.map((x) => x.trim().toLowerCase())
|
|
249
|
-
.filter((x) => x && x !== 'identity');
|
|
250
|
-
}
|
|
251
|
-
// content-encoding should never be an array
|
|
252
|
-
return contentEncoding.flatMap(parseContentEncoding);
|
|
253
|
-
}
|
|
254
|
-
exports.parseContentEncoding = parseContentEncoding;
|
|
255
|
-
function createDecoder(encoding) {
|
|
256
|
-
// https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
|
|
257
|
-
// > All content-coding values are case-insensitive...
|
|
258
|
-
switch (encoding.trim().toLowerCase()) {
|
|
259
|
-
// https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2
|
|
260
|
-
case 'gzip':
|
|
261
|
-
case 'x-gzip':
|
|
262
|
-
return zlib.createGunzip({
|
|
263
|
-
// using Z_SYNC_FLUSH (cURL default) to be less strict when decoding
|
|
264
|
-
flush: zlib.constants.Z_SYNC_FLUSH,
|
|
265
|
-
finishFlush: zlib.constants.Z_SYNC_FLUSH,
|
|
266
|
-
});
|
|
267
|
-
case 'deflate':
|
|
268
|
-
return zlib.createInflate();
|
|
269
|
-
case 'br':
|
|
270
|
-
return zlib.createBrotliDecompress();
|
|
271
|
-
case 'identity':
|
|
272
|
-
return new node_stream_1.PassThrough();
|
|
273
|
-
default:
|
|
274
|
-
throw new types_1.XRPCError(xrpc_1.ResponseType.UnsupportedMediaType, 'unsupported content-encoding');
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
exports.createDecoder = createDecoder;
|
|
278
217
|
function serverTimingHeader(timings) {
|
|
279
218
|
return timings
|
|
280
219
|
.map((timing) => {
|
|
@@ -326,10 +265,66 @@ class ServerTimer {
|
|
|
326
265
|
}
|
|
327
266
|
}
|
|
328
267
|
exports.ServerTimer = ServerTimer;
|
|
329
|
-
const parseReqNsid = (req) =>
|
|
330
|
-
const originalUrl = ('originalUrl' in req && req.originalUrl) || req.url || '/';
|
|
331
|
-
const nsid = originalUrl.split('?')[0].replace('/xrpc/', '');
|
|
332
|
-
return nsid.endsWith('/') ? nsid.slice(0, -1) : nsid; // trim trailing slash
|
|
333
|
-
};
|
|
268
|
+
const parseReqNsid = (req) => (0, exports.parseUrlNsid)('originalUrl' in req ? req.originalUrl : req.url || '/');
|
|
334
269
|
exports.parseReqNsid = parseReqNsid;
|
|
270
|
+
/**
|
|
271
|
+
* Validates and extracts the nsid from an xrpc path
|
|
272
|
+
*/
|
|
273
|
+
const parseUrlNsid = (url) => {
|
|
274
|
+
// /!\ Hot path
|
|
275
|
+
if (
|
|
276
|
+
// Ordered by likelihood of failure
|
|
277
|
+
url.length <= 6 ||
|
|
278
|
+
url[5] !== '/' ||
|
|
279
|
+
url[4] !== 'c' ||
|
|
280
|
+
url[3] !== 'p' ||
|
|
281
|
+
url[2] !== 'r' ||
|
|
282
|
+
url[1] !== 'x' ||
|
|
283
|
+
url[0] !== '/') {
|
|
284
|
+
throw new types_1.InvalidRequestError('invalid xrpc path');
|
|
285
|
+
}
|
|
286
|
+
const startOfNsid = 6;
|
|
287
|
+
let curr = startOfNsid;
|
|
288
|
+
let char;
|
|
289
|
+
let alphaNumRequired = true;
|
|
290
|
+
for (; curr < url.length; curr++) {
|
|
291
|
+
char = url.charCodeAt(curr);
|
|
292
|
+
if ((char >= 48 && char <= 57) || // 0-9
|
|
293
|
+
(char >= 65 && char <= 90) || // A-Z
|
|
294
|
+
(char >= 97 && char <= 122) // a-z
|
|
295
|
+
) {
|
|
296
|
+
alphaNumRequired = false;
|
|
297
|
+
}
|
|
298
|
+
else if (char === 45 /* "-" */ || char === 46 /* "." */) {
|
|
299
|
+
if (alphaNumRequired) {
|
|
300
|
+
throw new types_1.InvalidRequestError('invalid xrpc path');
|
|
301
|
+
}
|
|
302
|
+
alphaNumRequired = true;
|
|
303
|
+
}
|
|
304
|
+
else if (char === 47 /* "/" */) {
|
|
305
|
+
// Allow trailing slash (next char is either EOS or "?")
|
|
306
|
+
if (curr === url.length - 1 || url.charCodeAt(curr + 1) === 63) {
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
throw new types_1.InvalidRequestError('invalid xrpc path');
|
|
310
|
+
}
|
|
311
|
+
else if (char === 63 /* "?"" */) {
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
throw new types_1.InvalidRequestError('invalid xrpc path');
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// last char was one of: '-', '.', '/'
|
|
319
|
+
if (alphaNumRequired) {
|
|
320
|
+
throw new types_1.InvalidRequestError('invalid xrpc path');
|
|
321
|
+
}
|
|
322
|
+
// A domain name consists of minimum two characters
|
|
323
|
+
if (curr - startOfNsid < 2) {
|
|
324
|
+
throw new types_1.InvalidRequestError('invalid xrpc path');
|
|
325
|
+
}
|
|
326
|
+
// @TODO is there a max ?
|
|
327
|
+
return url.slice(startOfNsid, curr);
|
|
328
|
+
};
|
|
329
|
+
exports.parseUrlNsid = parseUrlNsid;
|
|
335
330
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/xrpc-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "atproto HTTP API (XRPC) server library",
|
|
6
6
|
"keywords": [
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
"uint8arrays": "3.0.0",
|
|
25
25
|
"ws": "^8.12.0",
|
|
26
26
|
"zod": "^3.23.8",
|
|
27
|
+
"@atproto/common": "^0.4.4",
|
|
27
28
|
"@atproto/crypto": "^0.4.1",
|
|
28
|
-
"@atproto/lexicon": "^0.4.
|
|
29
|
-
"@atproto/
|
|
30
|
-
"@atproto/xrpc": "^0.6.2"
|
|
29
|
+
"@atproto/lexicon": "^0.4.2",
|
|
30
|
+
"@atproto/xrpc": "^0.6.3"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/express": "^4.17.13",
|
package/src/index.ts
CHANGED
|
@@ -5,10 +5,4 @@ export * from './stream'
|
|
|
5
5
|
export * from './rate-limiter'
|
|
6
6
|
|
|
7
7
|
export type { ServerTiming } from './util'
|
|
8
|
-
export {
|
|
9
|
-
createDecoders,
|
|
10
|
-
createDecoder,
|
|
11
|
-
parseReqNsid,
|
|
12
|
-
serverTimingHeader,
|
|
13
|
-
ServerTimer,
|
|
14
|
-
} from './util'
|
|
8
|
+
export { ServerTimer, parseReqNsid, serverTimingHeader } from './util'
|