@atproto/xrpc-server 0.7.19 → 0.9.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 (45) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/auth.js +11 -11
  3. package/dist/auth.js.map +1 -1
  4. package/dist/errors.d.ts +67 -0
  5. package/dist/errors.d.ts.map +1 -0
  6. package/dist/errors.js +202 -0
  7. package/dist/errors.js.map +1 -0
  8. package/dist/index.d.ts +4 -3
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +3 -2
  11. package/dist/index.js.map +1 -1
  12. package/dist/rate-limiter.d.ts +95 -26
  13. package/dist/rate-limiter.d.ts.map +1 -1
  14. package/dist/rate-limiter.js +179 -85
  15. package/dist/rate-limiter.js.map +1 -1
  16. package/dist/server.d.ts +20 -15
  17. package/dist/server.d.ts.map +1 -1
  18. package/dist/server.js +185 -220
  19. package/dist/server.js.map +1 -1
  20. package/dist/types.d.ts +80 -175
  21. package/dist/types.d.ts.map +1 -1
  22. package/dist/types.js +9 -226
  23. package/dist/types.js.map +1 -1
  24. package/dist/util.d.ts +12 -9
  25. package/dist/util.d.ts.map +1 -1
  26. package/dist/util.js +114 -78
  27. package/dist/util.js.map +1 -1
  28. package/package.json +4 -3
  29. package/src/auth.ts +1 -1
  30. package/src/errors.ts +293 -0
  31. package/src/index.ts +4 -3
  32. package/src/rate-limiter.ts +270 -104
  33. package/src/server.ts +265 -276
  34. package/src/types.ts +144 -429
  35. package/src/util.ts +131 -85
  36. package/tests/auth.test.ts +2 -2
  37. package/tests/bodies.test.ts +18 -27
  38. package/tests/errors.test.ts +1 -1
  39. package/tests/ipld.test.ts +15 -14
  40. package/tests/parameters.test.ts +4 -7
  41. package/tests/procedures.test.ts +22 -34
  42. package/tests/queries.test.ts +9 -12
  43. package/tests/rate-limiter.test.ts +8 -11
  44. package/tests/responses.test.ts +12 -15
  45. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAGnB,cAAc,EACf,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,SAAS,EACT,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACf,MAAM,SAAS,CAAA;AAEhB,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,UAAU,CAAC,EAAE,YAAY,CAAA;IACzB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,qBAAa,WAAY,YAAW,YAAY;IACvC,OAAO,EAAE,mBAAmB,CAAA;IACnC,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B,OAAO,CAAC,UAAU,CAAC,CAAS;IACrB,OAAO,EAAE,SAAS,CAAA;IAClB,UAAU,EAAE,YAAY,CAAA;gBAEnB,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,eAAe;IAQ/D,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW;IASjD,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,GAAG,WAAW;IAUhE,OAAO,CACX,GAAG,EAAE,cAAc,EACnB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAC,UAAU,CAAC,EAAE,YAAY,CAAA;KAAE,GACxD,OAAO,CAAC,iBAAiB,GAAG,sBAAsB,GAAG,IAAI,CAAC;IA8CvD,KAAK,CACT,GAAG,EAAE,cAAc,EACnB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,SAAS,CAAA;KAAE,GAC7B,OAAO,CAAC,IAAI,CAAC;CAYjB;AAED,eAAO,MAAM,mBAAmB,GAC9B,SAAS,mBAAmB,EAC5B,KAAK,cAAc,KAClB,iBASF,CAAA;AAED,eAAO,MAAM,WAAW,GACtB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EAAE,KACxB,OAAO,CAAC,iBAAiB,GAAG,sBAAsB,GAAG,IAAI,CAa3D,CAAA;AAED,eAAO,MAAM,SAAS,GACpB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EAAE,KACtB,OAAO,CAAC,IAAI,CAGd,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,KAAK,cAAc,EACnB,QAAQ,iBAAiB,SAS1B,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,OAAO,CAAC,iBAAiB,GAAG,sBAAsB,GAAG,IAAI,CAAC,EAAE,KAC3D,iBAAiB,GAAG,sBAAsB,GAAG,IAU/C,CAAA"}
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -1,28 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTightestLimit = exports.setResHeaders = exports.resetMany = exports.consumeMany = exports.formatLimiterStatus = exports.RateLimiter = void 0;
3
+ exports.RateLimitExceededError = exports.RouteRateLimiter = exports.CombinedRateLimiter = exports.WrappedRateLimiter = exports.formatLimiterStatus = exports.RedisRateLimiter = exports.MemoryRateLimiter = exports.RateLimiter = void 0;
4
4
  const rate_limiter_flexible_1 = require("rate-limiter-flexible");
5
+ const errors_1 = require("./errors");
5
6
  const logger_1 = require("./logger");
6
- const types_1 = require("./types");
7
7
  class RateLimiter {
8
- constructor(limiter, opts) {
8
+ constructor(limiter, options) {
9
9
  Object.defineProperty(this, "limiter", {
10
10
  enumerable: true,
11
11
  configurable: true,
12
12
  writable: true,
13
- value: void 0
14
- });
15
- Object.defineProperty(this, "bypassSecret", {
16
- enumerable: true,
17
- configurable: true,
18
- writable: true,
19
- value: void 0
20
- });
21
- Object.defineProperty(this, "bypassIps", {
22
- enumerable: true,
23
- configurable: true,
24
- writable: true,
25
- value: void 0
13
+ value: limiter
26
14
  });
27
15
  Object.defineProperty(this, "failClosed", {
28
16
  enumerable: true,
@@ -43,43 +31,18 @@ class RateLimiter {
43
31
  value: void 0
44
32
  });
45
33
  this.limiter = limiter;
46
- this.bypassSecret = opts.bypassSecret;
47
- this.bypassIps = opts.bypassIps;
48
- this.calcKey = opts.calcKey ?? defaultKey;
49
- this.calcPoints = opts.calcPoints ?? defaultPoints;
50
- }
51
- static memory(opts) {
52
- const limiter = new rate_limiter_flexible_1.RateLimiterMemory({
53
- keyPrefix: opts.keyPrefix,
54
- duration: Math.floor(opts.durationMs / 1000),
55
- points: opts.points,
56
- });
57
- return new RateLimiter(limiter, opts);
58
- }
59
- static redis(storeClient, opts) {
60
- const limiter = new rate_limiter_flexible_1.RateLimiterRedis({
61
- storeClient,
62
- keyPrefix: opts.keyPrefix,
63
- duration: Math.floor(opts.durationMs / 1000),
64
- points: opts.points,
65
- });
66
- return new RateLimiter(limiter, opts);
34
+ this.failClosed = options.failClosed ?? false;
35
+ this.calcKey = options.calcKey;
36
+ this.calcPoints = options.calcPoints;
67
37
  }
68
38
  async consume(ctx, opts) {
69
- if (this.bypassSecret &&
70
- ctx.req.header('x-ratelimit-bypass') === this.bypassSecret) {
71
- return null;
72
- }
73
- if (this.bypassIps && this.bypassIps.includes(ctx.req.ip)) {
74
- return null;
75
- }
76
- const key = opts?.calcKey ? opts.calcKey(ctx) : this.calcKey(ctx);
39
+ const calcKey = opts?.calcKey ?? this.calcKey;
40
+ const key = calcKey(ctx);
77
41
  if (key === null) {
78
42
  return null;
79
43
  }
80
- const points = opts?.calcPoints
81
- ? opts.calcPoints(ctx)
82
- : this.calcPoints(ctx);
44
+ const calcPoints = opts?.calcPoints ?? this.calcPoints;
45
+ const points = calcPoints(ctx);
83
46
  if (points < 1) {
84
47
  return null;
85
48
  }
@@ -91,7 +54,7 @@ class RateLimiter {
91
54
  // yes this library rejects with a res not an error
92
55
  if (err instanceof rate_limiter_flexible_1.RateLimiterRes) {
93
56
  const status = (0, exports.formatLimiterStatus)(this.limiter, err);
94
- return new types_1.RateLimitExceededError(status);
57
+ return new RateLimitExceededError(status);
95
58
  }
96
59
  else {
97
60
  if (this.failClosed) {
@@ -121,6 +84,29 @@ class RateLimiter {
121
84
  }
122
85
  }
123
86
  exports.RateLimiter = RateLimiter;
87
+ class MemoryRateLimiter extends RateLimiter {
88
+ constructor(options) {
89
+ const limiter = new rate_limiter_flexible_1.RateLimiterMemory({
90
+ keyPrefix: options.keyPrefix,
91
+ duration: Math.floor(options.durationMs / 1000),
92
+ points: options.points,
93
+ });
94
+ super(limiter, options);
95
+ }
96
+ }
97
+ exports.MemoryRateLimiter = MemoryRateLimiter;
98
+ class RedisRateLimiter extends RateLimiter {
99
+ constructor(storeClient, options) {
100
+ const limiter = new rate_limiter_flexible_1.RateLimiterRedis({
101
+ storeClient,
102
+ keyPrefix: options.keyPrefix,
103
+ duration: Math.floor(options.durationMs / 1000),
104
+ points: options.points,
105
+ });
106
+ super(limiter, options);
107
+ }
108
+ }
109
+ exports.RedisRateLimiter = RedisRateLimiter;
124
110
  const formatLimiterStatus = (limiter, res) => {
125
111
  return {
126
112
  limit: limiter.points,
@@ -132,43 +118,85 @@ const formatLimiterStatus = (limiter, res) => {
132
118
  };
133
119
  };
134
120
  exports.formatLimiterStatus = formatLimiterStatus;
135
- const consumeMany = async (ctx, fns) => {
136
- if (fns.length === 0)
137
- return null;
138
- const results = await Promise.all(fns.map((fn) => fn(ctx)));
139
- const tightestLimit = (0, exports.getTightestLimit)(results);
140
- if (tightestLimit === null) {
141
- return null;
142
- }
143
- else if (tightestLimit instanceof types_1.RateLimitExceededError) {
144
- (0, exports.setResHeaders)(ctx, tightestLimit.status);
145
- return tightestLimit;
146
- }
147
- else {
148
- (0, exports.setResHeaders)(ctx, tightestLimit);
149
- return tightestLimit;
121
+ /**
122
+ * Wraps a {@link RateLimiterI} instance with custom key and points calculation
123
+ * functions.
124
+ */
125
+ class WrappedRateLimiter {
126
+ constructor(rateLimiter, options) {
127
+ Object.defineProperty(this, "rateLimiter", {
128
+ enumerable: true,
129
+ configurable: true,
130
+ writable: true,
131
+ value: rateLimiter
132
+ });
133
+ Object.defineProperty(this, "options", {
134
+ enumerable: true,
135
+ configurable: true,
136
+ writable: true,
137
+ value: options
138
+ });
150
139
  }
151
- };
152
- exports.consumeMany = consumeMany;
153
- const resetMany = async (ctx, fns) => {
154
- if (fns.length === 0)
155
- return;
156
- await Promise.all(fns.map((fn) => fn(ctx)));
157
- };
158
- exports.resetMany = resetMany;
159
- const setResHeaders = (ctx, status) => {
160
- ctx.res.setHeader('RateLimit-Limit', status.limit);
161
- ctx.res.setHeader('RateLimit-Remaining', status.remainingPoints);
162
- ctx.res.setHeader('RateLimit-Reset', Math.floor((Date.now() + status.msBeforeNext) / 1000));
163
- ctx.res.setHeader('RateLimit-Policy', `${status.limit};w=${status.duration}`);
164
- };
165
- exports.setResHeaders = setResHeaders;
140
+ async consume(ctx, opts) {
141
+ return this.rateLimiter.consume(ctx, {
142
+ calcKey: opts?.calcKey ?? this.options.calcKey,
143
+ calcPoints: opts?.calcPoints ?? this.options.calcPoints,
144
+ });
145
+ }
146
+ async reset(ctx, opts) {
147
+ return this.rateLimiter.reset(ctx, {
148
+ calcKey: opts?.calcKey ?? this.options.calcKey,
149
+ });
150
+ }
151
+ static from(rateLimiter, { calcKey, calcPoints } = {}) {
152
+ if (!calcKey && !calcPoints)
153
+ return rateLimiter;
154
+ return new WrappedRateLimiter(rateLimiter, { calcKey, calcPoints });
155
+ }
156
+ }
157
+ exports.WrappedRateLimiter = WrappedRateLimiter;
158
+ /**
159
+ * Combines multiple rate limiters into one.
160
+ *
161
+ * The combined rate limiter will return the tightest (most restrictive) of all
162
+ * the provided rate limiters.
163
+ */
164
+ class CombinedRateLimiter {
165
+ constructor(rateLimiters) {
166
+ Object.defineProperty(this, "rateLimiters", {
167
+ enumerable: true,
168
+ configurable: true,
169
+ writable: true,
170
+ value: rateLimiters
171
+ });
172
+ }
173
+ async consume(ctx, opts) {
174
+ const promises = [];
175
+ for (const rl of this.rateLimiters)
176
+ promises.push(rl.consume(ctx, opts));
177
+ return Promise.all(promises).then(getTightestLimit);
178
+ }
179
+ async reset(ctx, opts) {
180
+ const promises = [];
181
+ for (const rl of this.rateLimiters)
182
+ promises.push(rl.reset(ctx, opts));
183
+ await Promise.all(promises);
184
+ }
185
+ static from(rateLimiters) {
186
+ if (rateLimiters.length === 0)
187
+ return undefined;
188
+ if (rateLimiters.length === 1)
189
+ return rateLimiters[0];
190
+ return new CombinedRateLimiter(rateLimiters);
191
+ }
192
+ }
193
+ exports.CombinedRateLimiter = CombinedRateLimiter;
166
194
  const getTightestLimit = (resps) => {
167
195
  let lowest = null;
168
196
  for (const resp of resps) {
169
197
  if (resp === null)
170
198
  continue;
171
- if (resp instanceof types_1.RateLimitExceededError)
199
+ if (resp instanceof RateLimitExceededError)
172
200
  return resp;
173
201
  if (lowest === null || resp.remainingPoints < lowest.remainingPoints) {
174
202
  lowest = resp;
@@ -176,9 +204,75 @@ const getTightestLimit = (resps) => {
176
204
  }
177
205
  return lowest;
178
206
  };
179
- exports.getTightestLimit = getTightestLimit;
180
- // when using a proxy, ensure headers are getting forwarded correctly: `app.set('trust proxy', true)`
181
- // https://expressjs.com/en/guide/behind-proxies.html
182
- const defaultKey = (ctx) => ctx.req.ip;
183
- const defaultPoints = () => 1;
207
+ /**
208
+ * Wraps a {@link RateLimiterI} interface into a class that will apply the
209
+ * appropriate headers to the response if a limit is exceeded.
210
+ */
211
+ class RouteRateLimiter {
212
+ constructor(rateLimiter, options = {}) {
213
+ Object.defineProperty(this, "rateLimiter", {
214
+ enumerable: true,
215
+ configurable: true,
216
+ writable: true,
217
+ value: rateLimiter
218
+ });
219
+ Object.defineProperty(this, "options", {
220
+ enumerable: true,
221
+ configurable: true,
222
+ writable: true,
223
+ value: options
224
+ });
225
+ }
226
+ async handle(ctx) {
227
+ const { bypass } = this.options;
228
+ if (bypass && bypass(ctx)) {
229
+ return null;
230
+ }
231
+ const result = await this.consume(ctx);
232
+ if (result instanceof RateLimitExceededError) {
233
+ setStatusHeaders(ctx, result.status);
234
+ throw result;
235
+ }
236
+ else if (result != null) {
237
+ setStatusHeaders(ctx, result);
238
+ }
239
+ return result;
240
+ }
241
+ async consume(...args) {
242
+ return this.rateLimiter.consume(...args);
243
+ }
244
+ async reset(...args) {
245
+ return this.rateLimiter.reset(...args);
246
+ }
247
+ static from(rateLimiters, { bypass } = {}) {
248
+ const rateLimiter = CombinedRateLimiter.from(rateLimiters);
249
+ if (!rateLimiter)
250
+ return undefined;
251
+ return new RouteRateLimiter(rateLimiter, { bypass });
252
+ }
253
+ }
254
+ exports.RouteRateLimiter = RouteRateLimiter;
255
+ function setStatusHeaders(ctx, status) {
256
+ const resetAt = Math.floor((Date.now() + status.msBeforeNext) / 1e3);
257
+ ctx.res?.setHeader('RateLimit-Limit', status.limit);
258
+ ctx.res?.setHeader('RateLimit-Reset', resetAt);
259
+ ctx.res?.setHeader('RateLimit-Remaining', status.remainingPoints);
260
+ ctx.res?.setHeader('RateLimit-Policy', `${status.limit};w=${status.duration}`);
261
+ }
262
+ class RateLimitExceededError extends errors_1.XRPCError {
263
+ constructor(status, errorMessage, customErrorName, options) {
264
+ super(errors_1.ResponseType.RateLimitExceeded, errorMessage, customErrorName, options);
265
+ Object.defineProperty(this, "status", {
266
+ enumerable: true,
267
+ configurable: true,
268
+ writable: true,
269
+ value: status
270
+ });
271
+ }
272
+ [Symbol.hasInstance](instance) {
273
+ return (instance instanceof errors_1.XRPCError &&
274
+ instance.type === errors_1.ResponseType.RateLimitExceeded);
275
+ }
276
+ }
277
+ exports.RateLimitExceededError = RateLimitExceededError;
184
278
  //# sourceMappingURL=rate-limiter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,7 +1,9 @@
1
- import { Express, NextFunction, Request, RequestHandler, Response, Router } from 'express';
1
+ import { IncomingMessage } from 'node:http';
2
+ import express, { Express, Request, RequestHandler, Router } from 'express';
2
3
  import { LexXrpcProcedure, LexXrpcQuery, LexXrpcSubscription, LexiconDoc, Lexicons } from '@atproto/lexicon';
4
+ import { RateLimiterI, RouteRateLimiter } from './rate-limiter';
3
5
  import { XrpcStreamServer } from './stream';
4
- import { Options, RateLimiterI, XRPCHandler, XRPCHandlerConfig, XRPCStreamHandler, XRPCStreamHandlerConfig } from './types';
6
+ import { Auth, AuthResult, AuthVerifier, CatchallHandler, HandlerContext, Input, MethodConfig, MethodConfigOrHandler, Options, Params, RouteOptions, StreamConfig, StreamConfigOrHandler } from './types';
5
7
  export declare function createServer(lexicons?: LexiconDoc[], options?: Options): Server;
6
8
  export declare class Server {
7
9
  router: Express;
@@ -9,22 +11,25 @@ export declare class Server {
9
11
  subscriptions: Map<string, XrpcStreamServer>;
10
12
  lex: Lexicons;
11
13
  options: Options;
12
- middleware: Record<'json' | 'text', RequestHandler>;
13
- globalRateLimiters: RateLimiterI[];
14
- sharedRateLimiters: Record<string, RateLimiterI>;
15
- routeRateLimiters: Record<string, RateLimiterI[]>;
14
+ globalRateLimiter?: RouteRateLimiter<HandlerContext>;
15
+ sharedRateLimiters?: Map<string, RateLimiterI<HandlerContext>>;
16
16
  constructor(lexicons?: LexiconDoc[], opts?: Options);
17
- method(nsid: string, configOrFn: XRPCHandlerConfig | XRPCHandler): void;
18
- addMethod(nsid: string, configOrFn: XRPCHandlerConfig | XRPCHandler): void;
19
- streamMethod(nsid: string, configOrFn: XRPCStreamHandlerConfig | XRPCStreamHandler): void;
20
- addStreamMethod(nsid: string, configOrFn: XRPCStreamHandlerConfig | XRPCStreamHandler): void;
17
+ method<A extends Auth = Auth>(nsid: string, configOrFn: MethodConfigOrHandler<A>): void;
18
+ addMethod<A extends Auth = Auth>(nsid: string, configOrFn: MethodConfigOrHandler<A>): void;
19
+ streamMethod<A extends Auth = Auth>(nsid: string, configOrFn: StreamConfigOrHandler<A>): void;
20
+ addStreamMethod<A extends Auth = Auth>(nsid: string, configOrFn: StreamConfigOrHandler<A>): void;
21
21
  addLexicon(doc: LexiconDoc): void;
22
22
  addLexicons(docs: LexiconDoc[]): void;
23
- protected addRoute(nsid: string, def: LexXrpcQuery | LexXrpcProcedure, config: XRPCHandlerConfig): Promise<void>;
24
- catchall(req: Request, res: Response, next: NextFunction): Promise<unknown>;
25
- createHandler(nsid: string, def: LexXrpcQuery | LexXrpcProcedure, routeCfg: XRPCHandlerConfig): RequestHandler;
26
- protected addSubscription(nsid: string, def: LexXrpcSubscription, config: XRPCStreamHandlerConfig): Promise<void>;
23
+ protected addRoute<A extends Auth = Auth>(nsid: string, def: LexXrpcQuery | LexXrpcProcedure, config: MethodConfig<A>): Promise<void>;
24
+ catchall: CatchallHandler;
25
+ protected createParamsVerifier(nsid: string, def: LexXrpcQuery | LexXrpcProcedure | LexXrpcSubscription): (req: Request | IncomingMessage) => Params;
26
+ protected createInputVerifier(nsid: string, def: LexXrpcQuery | LexXrpcProcedure, routeOpts: RouteOptions): (req: Request, res: express.Response) => import("./types").Awaitable<Input>;
27
+ protected createAuthVerifier<C, A extends Auth>(cfg: {
28
+ auth?: AuthVerifier<C, A & AuthResult>;
29
+ }): null | ((ctx: C) => Promise<A>);
30
+ createHandler<A extends Auth = Auth>(nsid: string, def: LexXrpcQuery | LexXrpcProcedure, cfg: MethodConfig<A>): RequestHandler;
31
+ protected addSubscription<A extends Auth = Auth>(nsid: string, def: LexXrpcSubscription, cfg: StreamConfig<A>): Promise<void>;
27
32
  private enableStreamingOnListen;
28
- private setupRouteRateLimits;
33
+ private createRouteRateLimiter;
29
34
  }
30
35
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAgB,EAGd,OAAO,EACP,YAAY,EACZ,OAAO,EACP,cAAc,EACd,QAAQ,EACR,MAAM,EAGP,MAAM,SAAS,CAAA;AAEhB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,QAAQ,EAET,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAmC,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC5E,OAAO,EAQL,OAAO,EAGP,YAAY,EAEZ,WAAW,EACX,iBAAiB,EAEjB,iBAAiB,EACjB,uBAAuB,EAKxB,MAAM,SAAS,CAAA;AAQhB,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,UAEtE;AAED,qBAAa,MAAM;IACjB,MAAM,EAAE,OAAO,CAAY;IAC3B,MAAM,EAAE,MAAM,CAAW;IACzB,aAAa,gCAAsC;IACnD,GAAG,WAAiB;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,CAAC,CAAA;IACnD,kBAAkB,EAAE,YAAY,EAAE,CAAA;IAClC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IAChD,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAA;gBAErC,QAAQ,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE,OAAY;IAyCvD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,GAAG,WAAW;IAIhE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,GAAG,WAAW;IAWnE,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,uBAAuB,GAAG,iBAAiB;IAKzD,eAAe,CACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,uBAAuB,GAAG,iBAAiB;IAezD,UAAU,CAAC,GAAG,EAAE,UAAU;IAI1B,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE;cASd,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,YAAY,GAAG,gBAAgB,EACpC,MAAM,EAAE,iBAAiB;IAoBrB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY;IAiD9D,aAAa,CACX,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,YAAY,GAAG,gBAAgB,EACpC,QAAQ,EAAE,iBAAiB,GAC1B,cAAc;cAgHD,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,mBAAmB,EACxB,MAAM,EAAE,uBAAuB;IA4DjC,OAAO,CAAC,uBAAuB;IAmB/B,OAAO,CAAC,oBAAoB;CA2D7B"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}