@atproto/xrpc-server 0.4.2 → 0.4.4-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE.txt +1 -1
  3. package/dist/auth.d.ts +3 -2
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +124 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +25 -53377
  10. package/dist/index.js.map +1 -7
  11. package/dist/logger.d.ts +1 -0
  12. package/dist/logger.d.ts.map +1 -0
  13. package/dist/logger.js +7 -0
  14. package/dist/logger.js.map +1 -0
  15. package/dist/rate-limiter.d.ts +2 -1
  16. package/dist/rate-limiter.d.ts.map +1 -0
  17. package/dist/rate-limiter.js +166 -0
  18. package/dist/rate-limiter.js.map +1 -0
  19. package/dist/server.d.ts +6 -5
  20. package/dist/server.d.ts.map +1 -0
  21. package/dist/server.js +472 -0
  22. package/dist/server.js.map +1 -0
  23. package/dist/stream/frames.d.ts +2 -1
  24. package/dist/stream/frames.d.ts.map +1 -0
  25. package/dist/stream/frames.js +141 -0
  26. package/dist/stream/frames.js.map +1 -0
  27. package/dist/stream/index.d.ts +1 -0
  28. package/dist/stream/index.d.ts.map +1 -0
  29. package/dist/stream/index.js +22 -0
  30. package/dist/stream/index.js.map +1 -0
  31. package/dist/stream/logger.d.ts +1 -0
  32. package/dist/stream/logger.d.ts.map +1 -0
  33. package/dist/stream/logger.js +7 -0
  34. package/dist/stream/logger.js.map +1 -0
  35. package/dist/stream/server.d.ts +3 -1
  36. package/dist/stream/server.d.ts.map +1 -0
  37. package/dist/stream/server.js +70 -0
  38. package/dist/stream/server.js.map +1 -0
  39. package/dist/stream/stream.d.ts +1 -0
  40. package/dist/stream/stream.d.ts.map +1 -0
  41. package/dist/stream/stream.js +44 -0
  42. package/dist/stream/stream.js.map +1 -0
  43. package/dist/stream/subscription.d.ts +2 -0
  44. package/dist/stream/subscription.d.ts.map +1 -0
  45. package/dist/stream/subscription.js +80 -0
  46. package/dist/stream/subscription.js.map +1 -0
  47. package/dist/stream/types.d.ts +5 -4
  48. package/dist/stream/types.d.ts.map +1 -0
  49. package/dist/stream/types.js +47 -0
  50. package/dist/stream/types.js.map +1 -0
  51. package/dist/stream/websocket-keepalive.d.ts +2 -0
  52. package/dist/stream/websocket-keepalive.d.ts.map +1 -0
  53. package/dist/stream/websocket-keepalive.js +160 -0
  54. package/dist/stream/websocket-keepalive.js.map +1 -0
  55. package/dist/types.d.ts +54 -34
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +163 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/util.d.ts +3 -2
  60. package/dist/util.d.ts.map +1 -0
  61. package/dist/util.js +263 -0
  62. package/dist/util.js.map +1 -0
  63. package/jest.config.js +4 -3
  64. package/package.json +10 -11
  65. package/src/rate-limiter.ts +3 -0
  66. package/src/server.ts +53 -14
  67. package/src/stream/frames.ts +1 -1
  68. package/src/stream/websocket-keepalive.ts +2 -1
  69. package/src/types.ts +22 -10
  70. package/src/util.ts +3 -3
  71. package/tests/bodies.test.ts +4 -4
  72. package/tests/errors.test.ts +1 -1
  73. package/tsconfig.build.json +6 -2
  74. package/tsconfig.json +3 -11
  75. package/tsconfig.tests.json +7 -0
  76. package/babel.config.js +0 -1
  77. package/build.js +0 -14
package/dist/types.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { IncomingMessage } from 'http';
3
4
  import express from 'express';
4
5
  import zod from 'zod';
5
6
  import { ResponseType } from '@atproto/xrpc';
6
- export declare type Options = {
7
+ export type Options = {
7
8
  validateResponse?: boolean;
8
9
  payload?: {
9
10
  jsonLimit?: number;
@@ -16,9 +17,9 @@ export declare type Options = {
16
17
  shared?: ServerRateLimitDescription[];
17
18
  };
18
19
  };
19
- export declare type UndecodedParams = typeof express.request['query'];
20
- export declare type Primitive = string | number | boolean;
21
- export declare type Params = Record<string, Primitive | Primitive[] | undefined>;
20
+ export type UndecodedParams = typeof express.request['query'];
21
+ export type Primitive = string | number | boolean;
22
+ export type Params = Record<string, Primitive | Primitive[] | undefined>;
22
23
  export declare const handlerInput: zod.ZodObject<{
23
24
  encoding: zod.ZodString;
24
25
  body: zod.ZodAny;
@@ -29,7 +30,7 @@ export declare const handlerInput: zod.ZodObject<{
29
30
  encoding: string;
30
31
  body?: any;
31
32
  }>;
32
- export declare type HandlerInput = zod.infer<typeof handlerInput>;
33
+ export type HandlerInput = zod.infer<typeof handlerInput>;
33
34
  export declare const handlerAuth: zod.ZodObject<{
34
35
  credentials: zod.ZodAny;
35
36
  artifacts: zod.ZodAny;
@@ -40,7 +41,7 @@ export declare const handlerAuth: zod.ZodObject<{
40
41
  credentials?: any;
41
42
  artifacts?: any;
42
43
  }>;
43
- export declare type HandlerAuth = zod.infer<typeof handlerAuth>;
44
+ export type HandlerAuth = zod.infer<typeof handlerAuth>;
44
45
  export declare const handlerSuccess: zod.ZodObject<{
45
46
  encoding: zod.ZodString;
46
47
  body: zod.ZodAny;
@@ -54,7 +55,21 @@ export declare const handlerSuccess: zod.ZodObject<{
54
55
  body?: any;
55
56
  headers?: Record<string, string> | undefined;
56
57
  }>;
57
- export declare type HandlerSuccess = zod.infer<typeof handlerSuccess>;
58
+ export type HandlerSuccess = zod.infer<typeof handlerSuccess>;
59
+ export declare const handlerPipeThrough: zod.ZodObject<{
60
+ encoding: zod.ZodString;
61
+ buffer: zod.ZodType<ArrayBuffer, zod.ZodTypeDef, ArrayBuffer>;
62
+ headers: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodString>>;
63
+ }, "strip", zod.ZodTypeAny, {
64
+ encoding: string;
65
+ buffer: ArrayBuffer;
66
+ headers?: Record<string, string> | undefined;
67
+ }, {
68
+ encoding: string;
69
+ buffer: ArrayBuffer;
70
+ headers?: Record<string, string> | undefined;
71
+ }>;
72
+ export type HandlerPipeThrough = zod.infer<typeof handlerPipeThrough>;
58
73
  export declare const handlerError: zod.ZodObject<{
59
74
  status: zod.ZodNumber;
60
75
  error: zod.ZodOptional<zod.ZodString>;
@@ -68,67 +83,67 @@ export declare const handlerError: zod.ZodObject<{
68
83
  error?: string | undefined;
69
84
  message?: string | undefined;
70
85
  }>;
71
- export declare type HandlerError = zod.infer<typeof handlerError>;
72
- export declare type HandlerOutput = HandlerSuccess | HandlerError;
73
- export declare type XRPCReqContext = {
86
+ export type HandlerError = zod.infer<typeof handlerError>;
87
+ export type HandlerOutput = HandlerSuccess | HandlerPipeThrough | HandlerError;
88
+ export type XRPCReqContext = {
74
89
  auth: HandlerAuth | undefined;
75
90
  params: Params;
76
91
  input: HandlerInput | undefined;
77
92
  req: express.Request;
78
93
  res: express.Response;
79
94
  };
80
- export declare type XRPCHandler = (ctx: XRPCReqContext) => Promise<HandlerOutput> | HandlerOutput | undefined;
81
- export declare type XRPCStreamHandler = (ctx: {
95
+ export type XRPCHandler = (ctx: XRPCReqContext) => Promise<HandlerOutput> | HandlerOutput | undefined;
96
+ export type XRPCStreamHandler = (ctx: {
82
97
  auth: HandlerAuth | undefined;
83
98
  params: Params;
84
99
  req: IncomingMessage;
85
100
  signal: AbortSignal;
86
101
  }) => AsyncIterable<unknown>;
87
- export declare type AuthOutput = HandlerAuth | HandlerError;
88
- export declare type AuthVerifier = (ctx: {
102
+ export type AuthOutput = HandlerAuth | HandlerError;
103
+ export type AuthVerifier = (ctx: {
89
104
  req: express.Request;
90
105
  res: express.Response;
91
106
  }) => Promise<AuthOutput> | AuthOutput;
92
- export declare type StreamAuthVerifier = (ctx: {
107
+ export type StreamAuthVerifier = (ctx: {
93
108
  req: IncomingMessage;
94
109
  }) => Promise<AuthOutput> | AuthOutput;
95
- export declare type CalcKeyFn = (ctx: XRPCReqContext) => string;
96
- export declare type CalcPointsFn = (ctx: XRPCReqContext) => number;
110
+ export type CalcKeyFn = (ctx: XRPCReqContext) => string | null;
111
+ export type CalcPointsFn = (ctx: XRPCReqContext) => number;
97
112
  export interface RateLimiterI {
98
113
  consume: RateLimiterConsume;
99
114
  }
100
- export declare type RateLimiterConsume = (ctx: XRPCReqContext, opts?: {
115
+ export type RateLimiterConsume = (ctx: XRPCReqContext, opts?: {
101
116
  calcKey?: CalcKeyFn;
102
117
  calcPoints?: CalcPointsFn;
103
118
  }) => Promise<RateLimiterStatus | RateLimitExceededError | null>;
104
- export declare type RateLimiterCreator = (opts: {
119
+ export type RateLimiterCreator = (opts: {
105
120
  keyPrefix: string;
106
121
  durationMs: number;
107
122
  points: number;
108
- calcKey?: (ctx: XRPCReqContext) => string;
109
- calcPoints?: (ctx: XRPCReqContext) => number;
123
+ calcKey?: CalcKeyFn;
124
+ calcPoints?: CalcPointsFn;
110
125
  }) => RateLimiterI;
111
- export declare type ServerRateLimitDescription = {
126
+ export type ServerRateLimitDescription = {
112
127
  name: string;
113
128
  durationMs: number;
114
129
  points: number;
115
- calcKey?: (ctx: XRPCReqContext) => string;
116
- calcPoints?: (ctx: XRPCReqContext) => number;
130
+ calcKey?: CalcKeyFn;
131
+ calcPoints?: CalcPointsFn;
117
132
  };
118
- export declare type SharedRateLimitOpts = {
133
+ export type SharedRateLimitOpts = {
119
134
  name: string;
120
- calcKey?: (ctx: XRPCReqContext) => string;
121
- calcPoints?: (ctx: XRPCReqContext) => number;
135
+ calcKey?: CalcKeyFn;
136
+ calcPoints?: CalcPointsFn;
122
137
  };
123
- export declare type RouteRateLimitOpts = {
138
+ export type RouteRateLimitOpts = {
124
139
  durationMs: number;
125
140
  points: number;
126
- calcKey?: (ctx: XRPCReqContext) => string;
127
- calcPoints?: (ctx: XRPCReqContext) => number;
141
+ calcKey?: CalcKeyFn;
142
+ calcPoints?: CalcPointsFn;
128
143
  };
129
- export declare type HandlerRateLimitOpts = SharedRateLimitOpts | RouteRateLimitOpts;
144
+ export type HandlerRateLimitOpts = SharedRateLimitOpts | RouteRateLimitOpts;
130
145
  export declare const isShared: (opts: HandlerRateLimitOpts) => opts is SharedRateLimitOpts;
131
- export declare type RateLimiterStatus = {
146
+ export type RateLimiterStatus = {
132
147
  limit: number;
133
148
  duration: number;
134
149
  remainingPoints: number;
@@ -136,12 +151,16 @@ export declare type RateLimiterStatus = {
136
151
  consumedPoints: number;
137
152
  isFirstInDuration: boolean;
138
153
  };
139
- export declare type XRPCHandlerConfig = {
154
+ export type RouteOpts = {
155
+ blobLimit?: number;
156
+ };
157
+ export type XRPCHandlerConfig = {
158
+ opts?: RouteOpts;
140
159
  rateLimit?: HandlerRateLimitOpts | HandlerRateLimitOpts[];
141
160
  auth?: AuthVerifier;
142
161
  handler: XRPCHandler;
143
162
  };
144
- export declare type XRPCStreamHandlerConfig = {
163
+ export type XRPCStreamHandlerConfig = {
145
164
  auth?: StreamAuthVerifier;
146
165
  handler: XRPCStreamHandler;
147
166
  };
@@ -187,3 +206,4 @@ export declare class UpstreamTimeoutError extends XRPCError {
187
206
  export declare class MethodNotImplementedError extends XRPCError {
188
207
  constructor(errorMessage?: string, customErrorName?: string);
189
208
  }
209
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
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;
7
+ const http_errors_1 = require("http-errors");
8
+ const zod_1 = __importDefault(require("zod"));
9
+ const xrpc_1 = require("@atproto/xrpc");
10
+ exports.handlerInput = zod_1.default.object({
11
+ encoding: zod_1.default.string(),
12
+ body: zod_1.default.any(),
13
+ });
14
+ exports.handlerAuth = zod_1.default.object({
15
+ credentials: zod_1.default.any(),
16
+ artifacts: zod_1.default.any(),
17
+ });
18
+ exports.handlerSuccess = zod_1.default.object({
19
+ encoding: zod_1.default.string(),
20
+ body: zod_1.default.any(),
21
+ headers: zod_1.default.record(zod_1.default.string()).optional(),
22
+ });
23
+ exports.handlerPipeThrough = zod_1.default.object({
24
+ encoding: zod_1.default.string(),
25
+ buffer: zod_1.default.instanceof(ArrayBuffer),
26
+ headers: zod_1.default.record(zod_1.default.string()).optional(),
27
+ });
28
+ exports.handlerError = zod_1.default.object({
29
+ status: zod_1.default.number(),
30
+ error: zod_1.default.string().optional(),
31
+ message: zod_1.default.string().optional(),
32
+ });
33
+ const isShared = (opts) => {
34
+ return typeof opts['name'] === 'string';
35
+ };
36
+ exports.isShared = isShared;
37
+ class XRPCError extends Error {
38
+ constructor(type, errorMessage, customErrorName) {
39
+ super(errorMessage);
40
+ Object.defineProperty(this, "type", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: type
45
+ });
46
+ Object.defineProperty(this, "errorMessage", {
47
+ enumerable: true,
48
+ configurable: true,
49
+ writable: true,
50
+ value: errorMessage
51
+ });
52
+ Object.defineProperty(this, "customErrorName", {
53
+ enumerable: true,
54
+ configurable: true,
55
+ writable: true,
56
+ value: customErrorName
57
+ });
58
+ }
59
+ get payload() {
60
+ return {
61
+ error: this.customErrorName ?? this.typeName,
62
+ message: this.type === xrpc_1.ResponseType.InternalServerError
63
+ ? this.typeStr // Do not respond with error details for 500s
64
+ : this.errorMessage || this.typeStr,
65
+ };
66
+ }
67
+ get typeName() {
68
+ return xrpc_1.ResponseTypeNames[this.type];
69
+ }
70
+ get typeStr() {
71
+ return xrpc_1.ResponseTypeStrings[this.type];
72
+ }
73
+ static fromError(error) {
74
+ if (error instanceof XRPCError) {
75
+ return error;
76
+ }
77
+ let resultErr;
78
+ if ((0, http_errors_1.isHttpError)(error)) {
79
+ resultErr = new XRPCError(error.status, error.message, error.name);
80
+ }
81
+ else if (isHandlerError(error)) {
82
+ resultErr = new XRPCError(error.status, error.message, error.error);
83
+ }
84
+ else if (error instanceof Error) {
85
+ resultErr = new InternalServerError(error.message);
86
+ }
87
+ else {
88
+ resultErr = new InternalServerError('Unexpected internal server error');
89
+ }
90
+ resultErr.cause = error;
91
+ return resultErr;
92
+ }
93
+ }
94
+ exports.XRPCError = XRPCError;
95
+ function isHandlerError(v) {
96
+ return (!!v &&
97
+ typeof v === 'object' &&
98
+ typeof v['status'] === 'number' &&
99
+ (v['error'] === undefined || typeof v['error'] === 'string') &&
100
+ (v['message'] === undefined || typeof v['message'] === 'string'));
101
+ }
102
+ exports.isHandlerError = isHandlerError;
103
+ class InvalidRequestError extends XRPCError {
104
+ constructor(errorMessage, customErrorName) {
105
+ super(xrpc_1.ResponseType.InvalidRequest, errorMessage, customErrorName);
106
+ }
107
+ }
108
+ exports.InvalidRequestError = InvalidRequestError;
109
+ class AuthRequiredError extends XRPCError {
110
+ constructor(errorMessage, customErrorName) {
111
+ super(xrpc_1.ResponseType.AuthRequired, errorMessage, customErrorName);
112
+ }
113
+ }
114
+ exports.AuthRequiredError = AuthRequiredError;
115
+ class ForbiddenError extends XRPCError {
116
+ constructor(errorMessage, customErrorName) {
117
+ super(xrpc_1.ResponseType.Forbidden, errorMessage, customErrorName);
118
+ }
119
+ }
120
+ exports.ForbiddenError = ForbiddenError;
121
+ class RateLimitExceededError extends XRPCError {
122
+ constructor(status, errorMessage, customErrorName) {
123
+ super(xrpc_1.ResponseType.RateLimitExceeded, errorMessage, customErrorName);
124
+ Object.defineProperty(this, "status", {
125
+ enumerable: true,
126
+ configurable: true,
127
+ writable: true,
128
+ value: status
129
+ });
130
+ }
131
+ }
132
+ exports.RateLimitExceededError = RateLimitExceededError;
133
+ class InternalServerError extends XRPCError {
134
+ constructor(errorMessage, customErrorName) {
135
+ super(xrpc_1.ResponseType.InternalServerError, errorMessage, customErrorName);
136
+ }
137
+ }
138
+ exports.InternalServerError = InternalServerError;
139
+ class UpstreamFailureError extends XRPCError {
140
+ constructor(errorMessage, customErrorName) {
141
+ super(xrpc_1.ResponseType.UpstreamFailure, errorMessage, customErrorName);
142
+ }
143
+ }
144
+ exports.UpstreamFailureError = UpstreamFailureError;
145
+ class NotEnoughResourcesError extends XRPCError {
146
+ constructor(errorMessage, customErrorName) {
147
+ super(xrpc_1.ResponseType.NotEnoughResources, errorMessage, customErrorName);
148
+ }
149
+ }
150
+ exports.NotEnoughResourcesError = NotEnoughResourcesError;
151
+ class UpstreamTimeoutError extends XRPCError {
152
+ constructor(errorMessage, customErrorName) {
153
+ super(xrpc_1.ResponseType.UpstreamTimeout, errorMessage, customErrorName);
154
+ }
155
+ }
156
+ exports.UpstreamTimeoutError = UpstreamTimeoutError;
157
+ class MethodNotImplementedError extends XRPCError {
158
+ constructor(errorMessage, customErrorName) {
159
+ super(xrpc_1.ResponseType.MethodNotImplemented, errorMessage, customErrorName);
160
+ }
161
+ }
162
+ exports.MethodNotImplementedError = MethodNotImplementedError;
163
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/util.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import express from 'express';
2
2
  import { Lexicons, LexXrpcProcedure, LexXrpcQuery, LexXrpcSubscription } from '@atproto/lexicon';
3
- import { UndecodedParams, Params, HandlerInput, HandlerSuccess, Options } from './types';
3
+ import { UndecodedParams, Params, HandlerInput, HandlerSuccess, RouteOpts } from './types';
4
4
  export declare function decodeQueryParams(def: LexXrpcProcedure | LexXrpcQuery | LexXrpcSubscription, params: UndecodedParams): Params;
5
5
  export declare function decodeQueryParam(type: string, value: unknown): string | number | boolean | undefined;
6
6
  export declare function getQueryParams(url?: string): Record<string, string | string[]>;
7
- export declare function validateInput(nsid: string, def: LexXrpcProcedure | LexXrpcQuery, req: express.Request, opts: Options, lexicons: Lexicons): HandlerInput | undefined;
7
+ export declare function validateInput(nsid: string, def: LexXrpcProcedure | LexXrpcQuery, req: express.Request, opts: RouteOpts, lexicons: Lexicons): HandlerInput | undefined;
8
8
  export declare function validateOutput(nsid: string, def: LexXrpcProcedure | LexXrpcQuery, output: HandlerSuccess | undefined, lexicons: Lexicons): HandlerSuccess | undefined;
9
9
  export declare function normalizeMime(v: string): any;
10
10
  export declare function hasBody(req: express.Request): string | true | undefined;
@@ -24,3 +24,4 @@ export interface ServerTiming {
24
24
  duration?: number;
25
25
  description?: string;
26
26
  }
27
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAGA,OAAO,OAAO,MAAM,SAAS,CAAA;AAE7B,OAAO,EAEL,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACpB,MAAM,kBAAkB,CAAA;AAEzB,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,CA8D1B;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,GAAG,YAAY,EACpC,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,QAAQ,EAAE,QAAQ,GACjB,cAAc,GAAG,SAAS,CA0C5B;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,OAOtC;AAUD,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,6BAI3C;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAM5E;AA0CD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,UASzD;AAED,qBAAa,WAAY,YAAW,YAAY;IAG3B,IAAI,EAAE,MAAM;IAAS,WAAW,CAAC;IAF7C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,OAAO,CAAC,CAAQ;gBACL,IAAI,EAAE,MAAM,EAAS,WAAW,CAAC,oBAAQ;IAC5D,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"}
package/dist/util.js ADDED
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ServerTimer = exports.serverTimingHeader = exports.processBodyAsBytes = exports.hasBody = exports.normalizeMime = exports.validateOutput = exports.validateInput = exports.getQueryParams = exports.decodeQueryParam = exports.decodeQueryParams = void 0;
7
+ const assert_1 = __importDefault(require("assert"));
8
+ const zlib_1 = require("zlib");
9
+ const mime_types_1 = __importDefault(require("mime-types"));
10
+ const lexicon_1 = require("@atproto/lexicon");
11
+ const common_1 = require("@atproto/common");
12
+ const types_1 = require("./types");
13
+ function decodeQueryParams(def, params) {
14
+ const decoded = {};
15
+ for (const k in params) {
16
+ const val = params[k];
17
+ const property = def.parameters?.properties?.[k];
18
+ if (property) {
19
+ if (property.type === 'array') {
20
+ const vals = [];
21
+ decoded[k] = val
22
+ ? vals
23
+ .concat(val) // Cast to array
24
+ .flatMap((v) => decodeQueryParam(property.items.type, v) ?? [])
25
+ : undefined;
26
+ }
27
+ else {
28
+ decoded[k] = decodeQueryParam(property.type, val);
29
+ }
30
+ }
31
+ }
32
+ return decoded;
33
+ }
34
+ exports.decodeQueryParams = decodeQueryParams;
35
+ function decodeQueryParam(type, value) {
36
+ if (!value) {
37
+ return undefined;
38
+ }
39
+ if (type === 'string' || type === 'datetime') {
40
+ return String(value);
41
+ }
42
+ if (type === 'float') {
43
+ return Number(String(value));
44
+ }
45
+ else if (type === 'integer') {
46
+ return parseInt(String(value), 10) || 0;
47
+ }
48
+ else if (type === 'boolean') {
49
+ return value === 'true';
50
+ }
51
+ }
52
+ exports.decodeQueryParam = decodeQueryParam;
53
+ function getQueryParams(url = '') {
54
+ const { searchParams } = new URL(url ?? '', 'http://x');
55
+ const result = {};
56
+ for (const key of searchParams.keys()) {
57
+ result[key] = searchParams.getAll(key);
58
+ if (result[key].length === 1) {
59
+ result[key] = result[key][0];
60
+ }
61
+ }
62
+ return result;
63
+ }
64
+ exports.getQueryParams = getQueryParams;
65
+ function validateInput(nsid, def, req, opts, lexicons) {
66
+ // request expectation
67
+ const reqHasBody = hasBody(req);
68
+ if (reqHasBody && (def.type !== 'procedure' || !def.input)) {
69
+ throw new types_1.InvalidRequestError(`A request body was provided when none was expected`);
70
+ }
71
+ if (def.type === 'query') {
72
+ return;
73
+ }
74
+ if (!reqHasBody && def.input) {
75
+ throw new types_1.InvalidRequestError(`A request body is expected but none was provided`);
76
+ }
77
+ // mimetype
78
+ const inputEncoding = normalizeMime(req.headers['content-type'] || '');
79
+ if (def.input?.encoding &&
80
+ (!inputEncoding || !isValidEncoding(def.input?.encoding, inputEncoding))) {
81
+ if (!inputEncoding) {
82
+ throw new types_1.InvalidRequestError(`Request encoding (Content-Type) required but not provided`);
83
+ }
84
+ else {
85
+ throw new types_1.InvalidRequestError(`Wrong request encoding (Content-Type): ${inputEncoding}`);
86
+ }
87
+ }
88
+ if (!inputEncoding) {
89
+ // no input body
90
+ return undefined;
91
+ }
92
+ // if input schema, validate
93
+ if (def.input?.schema) {
94
+ try {
95
+ const lexBody = req.body ? (0, lexicon_1.jsonToLex)(req.body) : req.body;
96
+ req.body = lexicons.assertValidXrpcInput(nsid, lexBody);
97
+ }
98
+ catch (e) {
99
+ throw new types_1.InvalidRequestError(e instanceof Error ? e.message : String(e));
100
+ }
101
+ }
102
+ // if middleware already got the body, we pass that along as input
103
+ // otherwise, we pass along a decoded readable stream
104
+ let body;
105
+ if (req.readableEnded) {
106
+ body = req.body;
107
+ }
108
+ else {
109
+ body = decodeBodyStream(req, opts.blobLimit);
110
+ }
111
+ return {
112
+ encoding: inputEncoding,
113
+ body,
114
+ };
115
+ }
116
+ exports.validateInput = validateInput;
117
+ function validateOutput(nsid, def, output, lexicons) {
118
+ // initial validation
119
+ if (output) {
120
+ types_1.handlerSuccess.parse(output);
121
+ }
122
+ // response expectation
123
+ if (output?.body && !def.output) {
124
+ throw new types_1.InternalServerError(`A response body was provided when none was expected`);
125
+ }
126
+ if (!output?.body && def.output) {
127
+ throw new types_1.InternalServerError(`A response body is expected but none was provided`);
128
+ }
129
+ // mimetype
130
+ if (def.output?.encoding &&
131
+ (!output?.encoding ||
132
+ !isValidEncoding(def.output?.encoding, output?.encoding))) {
133
+ throw new types_1.InternalServerError(`Invalid response encoding: ${output?.encoding}`);
134
+ }
135
+ // output schema
136
+ if (def.output?.schema) {
137
+ try {
138
+ const result = lexicons.assertValidXrpcOutput(nsid, output?.body);
139
+ if (output) {
140
+ output.body = result;
141
+ }
142
+ }
143
+ catch (e) {
144
+ throw new types_1.InternalServerError(e instanceof Error ? e.message : String(e));
145
+ }
146
+ }
147
+ return output;
148
+ }
149
+ exports.validateOutput = validateOutput;
150
+ function normalizeMime(v) {
151
+ if (!v)
152
+ return false;
153
+ const fullType = mime_types_1.default.contentType(v);
154
+ if (!fullType)
155
+ return false;
156
+ const shortType = fullType.split(';')[0];
157
+ if (!shortType)
158
+ return false;
159
+ return shortType;
160
+ }
161
+ exports.normalizeMime = normalizeMime;
162
+ function isValidEncoding(possibleStr, value) {
163
+ const possible = possibleStr.split(',').map((v) => v.trim());
164
+ const normalized = normalizeMime(value);
165
+ if (!normalized)
166
+ return false;
167
+ if (possible.includes('*/*'))
168
+ return true;
169
+ return possible.includes(normalized);
170
+ }
171
+ function hasBody(req) {
172
+ const contentLength = req.headers['content-length'];
173
+ const transferEncoding = req.headers['transfer-encoding'];
174
+ return (contentLength && parseInt(contentLength, 10) > 0) || transferEncoding;
175
+ }
176
+ exports.hasBody = hasBody;
177
+ function processBodyAsBytes(req) {
178
+ return new Promise((resolve) => {
179
+ const chunks = [];
180
+ req.on('data', (chunk) => chunks.push(chunk));
181
+ req.on('end', () => resolve(new Uint8Array(Buffer.concat(chunks))));
182
+ });
183
+ }
184
+ exports.processBodyAsBytes = processBodyAsBytes;
185
+ function decodeBodyStream(req, maxSize) {
186
+ let stream = req;
187
+ const contentEncoding = req.headers['content-encoding'];
188
+ const contentLength = req.headers['content-length'];
189
+ if (maxSize !== undefined &&
190
+ contentLength &&
191
+ parseInt(contentLength, 10) > maxSize) {
192
+ throw new types_1.XRPCError(413, 'request entity too large');
193
+ }
194
+ let decoder;
195
+ if (contentEncoding === 'gzip') {
196
+ decoder = (0, zlib_1.createGunzip)();
197
+ }
198
+ else if (contentEncoding === 'deflate') {
199
+ decoder = (0, zlib_1.createDeflate)();
200
+ }
201
+ if (decoder) {
202
+ (0, common_1.forwardStreamErrors)(stream, decoder);
203
+ stream = stream.pipe(decoder);
204
+ }
205
+ if (maxSize !== undefined) {
206
+ const maxSizeChecker = new common_1.MaxSizeChecker(maxSize, () => new types_1.XRPCError(413, 'request entity too large'));
207
+ (0, common_1.forwardStreamErrors)(stream, maxSizeChecker);
208
+ stream = stream.pipe(maxSizeChecker);
209
+ }
210
+ return stream;
211
+ }
212
+ function serverTimingHeader(timings) {
213
+ return timings
214
+ .map((timing) => {
215
+ let header = timing.name;
216
+ if (timing.duration)
217
+ header += `;dur=${timing.duration}`;
218
+ if (timing.description)
219
+ header += `;desc="${timing.description}"`;
220
+ return header;
221
+ })
222
+ .join(', ');
223
+ }
224
+ exports.serverTimingHeader = serverTimingHeader;
225
+ class ServerTimer {
226
+ constructor(name, description) {
227
+ Object.defineProperty(this, "name", {
228
+ enumerable: true,
229
+ configurable: true,
230
+ writable: true,
231
+ value: name
232
+ });
233
+ Object.defineProperty(this, "description", {
234
+ enumerable: true,
235
+ configurable: true,
236
+ writable: true,
237
+ value: description
238
+ });
239
+ Object.defineProperty(this, "duration", {
240
+ enumerable: true,
241
+ configurable: true,
242
+ writable: true,
243
+ value: void 0
244
+ });
245
+ Object.defineProperty(this, "startMs", {
246
+ enumerable: true,
247
+ configurable: true,
248
+ writable: true,
249
+ value: void 0
250
+ });
251
+ }
252
+ start() {
253
+ this.startMs = Date.now();
254
+ return this;
255
+ }
256
+ stop() {
257
+ (0, assert_1.default)(this.startMs, "timer hasn't been started");
258
+ this.duration = Date.now() - this.startMs;
259
+ return this;
260
+ }
261
+ }
262
+ exports.ServerTimer = ServerTimer;
263
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}