@atproto/xrpc-server 0.11.1 → 0.11.2

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 CHANGED
@@ -1,5 +1,23 @@
1
1
  # @atproto/xrpc-server
2
2
 
3
+ ## 0.11.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [#4967](https://github.com/bluesky-social/atproto/pull/4967) [`9fc720c`](https://github.com/bluesky-social/atproto/commit/9fc720ce75f3ee88a5e48a9be919b07c7647f6f5) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Use TypeScript 7 to build package
8
+
9
+ - Updated dependencies [[`9fc720c`](https://github.com/bluesky-social/atproto/commit/9fc720ce75f3ee88a5e48a9be919b07c7647f6f5)]:
10
+ - @atproto/lex-client@0.1.4
11
+ - @atproto/lex-schema@0.1.4
12
+ - @atproto/lex-cbor@0.1.1
13
+ - @atproto/lex-data@0.1.2
14
+ - @atproto/lex-json@0.1.1
15
+ - @atproto/ws-client@0.1.1
16
+ - @atproto/lexicon@0.7.2
17
+ - @atproto/common@0.6.3
18
+ - @atproto/crypto@0.5.1
19
+ - @atproto/xrpc@0.8.1
20
+
3
21
  ## 0.11.1
4
22
 
5
23
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAA;AAG5D,KAAK,gBAAgB,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAA;CACxB,CAAA;AAMD,KAAK,iBAAiB,GAAG;IACvB,GAAG,EAAE,SAAS,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAA;IACzC,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,gBAAgB,KACvB,OAAO,CAAC,MAAM,CAsBhB,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAU,QAAQ,gBAAgB;;;;EAKtE,CAAA;AAMD,MAAM,MAAM,wBAAwB,GAAG,CACrC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,UAAU,EACpB,GAAG,EAAE,MAAM,KACR,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB,eAAO,MAAM,SAAS,GACpB,QAAQ,MAAM,EACd,QAAQ,MAAM,GAAG,IAAI,EAAE,4CAA4C;AACnE,KAAK,MAAM,GAAG,IAAI,EAAE,uCAAuC;AAC3D,eAAe,CACb,GAAG,EAAE,SAAS,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,EACzC,YAAY,EAAE,OAAO,KAClB,OAAO,CAAC,MAAM,CAAC,EACpB,yBAAwB,wBAAuD,KAC9E,OAAO,CAAC,iBAAiB,CA+F3B,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,wBAU1C,CAAA"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAA;AAG5D,KAAK,gBAAgB,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAA;CACxB,CAAA;AAMD,KAAK,iBAAiB,GAAG;IACvB,GAAG,EAAE,SAAS,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAA;IACzC,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,eAAO,MAAM,gBAAgB,WACnB,gBAAgB,KACvB,OAAO,CAAC,MAAM,CAsBhB,CAAA;AAED,eAAO,MAAM,wBAAwB,WAAkB,gBAAgB;;QAGxD,aAAa;;EAE3B,CAAA;AAMD,MAAM,MAAM,wBAAwB,GAAG,CACrC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,UAAU,EACpB,GAAG,EAAE,MAAM,KACR,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB,eAAO,MAAM,SAAS,WACZ,MAAM,UACN,MAAM,GAAG,IAAI,EAAE,4CAA4C;KAC9D,MAAM,GAAG,IAAI,EAAE,uCAAuC;eAC5C,CACb,GAAG,EAAE,SAAS,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,EACzC,YAAY,EAAE,OAAO,KAClB,OAAO,CAAC,MAAM,CAAC,2BACI,wBAAwB,KAC/C,OAAO,CAAC,iBAAiB,CA+F3B,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,wBAU1C,CAAA"}
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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","sourcesContent":["import * as common from '@atproto/common'\nimport { MINUTE } from '@atproto/common'\nimport * as crypto from '@atproto/crypto'\nimport { DidString, isDidString } from '@atproto/lex-schema'\nimport { AuthRequiredError } from './errors.js'\n\ntype ServiceJwtParams = {\n iss: string\n aud: string\n iat?: number\n exp?: number\n lxm: string | null\n keypair: crypto.Keypair\n}\n\ntype ServiceJwtHeaders = {\n alg: string\n} & Record<string, unknown>\n\ntype ServiceJwtPayload = {\n iss: DidString | `${DidString}#${string}`\n aud: string\n exp: number\n lxm?: string\n jti?: string\n}\n\nexport const createServiceJwt = async (\n params: ServiceJwtParams,\n): Promise<string> => {\n const { iss, aud, keypair } = params\n const iat = params.iat ?? Math.floor(Date.now() / 1e3)\n const exp = params.exp ?? iat + MINUTE / 1e3\n const lxm = params.lxm ?? undefined\n const jti = await crypto.randomStr(16, 'hex')\n const header = {\n typ: 'JWT',\n alg: keypair.jwtAlg,\n }\n const payload = common.noUndefinedVals({\n iat,\n iss,\n aud,\n exp,\n lxm,\n jti,\n })\n const toSignStr = `${jsonToB64Url(header)}.${jsonToB64Url(payload)}`\n const toSign = Buffer.from(toSignStr, 'utf8')\n const sig = Buffer.from(await keypair.sign(toSign))\n return `${toSignStr}.${sig.toString('base64url')}`\n}\n\nexport const createServiceAuthHeaders = async (params: ServiceJwtParams) => {\n const jwt = await createServiceJwt(params)\n return {\n headers: { authorization: `Bearer ${jwt}` },\n }\n}\n\nconst jsonToB64Url = (json: Record<string, unknown>): string => {\n return Buffer.from(JSON.stringify(json)).toString('base64url')\n}\n\nexport type VerifySignatureWithKeyFn = (\n key: string,\n msgBytes: Uint8Array,\n sigBytes: Uint8Array,\n alg: string,\n) => Promise<boolean>\n\nexport const verifyJwt = async (\n jwtStr: string,\n ownDid: string | null, // null indicates to skip the audience check\n lxm: string | null, // null indicates to skip the lxm check\n getSigningKey: (\n iss: DidString | `${DidString}#${string}`,\n forceRefresh: boolean,\n ) => Promise<string>,\n verifySignatureWithKey: VerifySignatureWithKeyFn = cryptoVerifySignatureWithKey,\n): Promise<ServiceJwtPayload> => {\n const parts = jwtStr.split('.')\n if (parts.length !== 3) {\n throw new AuthRequiredError('poorly formatted jwt', 'BadJwt')\n }\n\n const header = parseHeader(parts[0])\n\n // The spec does not describe what to do with the \"typ\" claim. We can,\n // however, forbid some values that are not compatible with our use case.\n if (\n // service tokens are not OAuth 2.0 access tokens\n // https://datatracker.ietf.org/doc/html/rfc9068\n header['typ'] === 'at+jwt' ||\n // \"refresh+jwt\" is a non-standard type used by the @atproto packages\n header['typ'] === 'refresh+jwt' ||\n // \"DPoP\" proofs are not meant to be used as service tokens\n // https://datatracker.ietf.org/doc/html/rfc9449\n header['typ'] === 'dpop+jwt'\n ) {\n throw new AuthRequiredError(\n `Invalid jwt type \"${header['typ']}\"`,\n 'BadJwtType',\n )\n }\n\n const payload = parsePayload(parts[1])\n const sig = parts[2]\n\n if (Date.now() / 1000 > payload.exp) {\n throw new AuthRequiredError('jwt expired', 'JwtExpired')\n }\n if (ownDid !== null && payload.aud !== ownDid) {\n throw new AuthRequiredError(\n 'jwt audience does not match service did',\n 'BadJwtAudience',\n )\n }\n if (lxm !== null && payload.lxm !== lxm) {\n throw new AuthRequiredError(\n payload.lxm !== undefined\n ? `bad jwt lexicon method (\"lxm\"). must match: ${lxm}`\n : `missing jwt lexicon method (\"lxm\"). must match: ${lxm}`,\n 'BadJwtLexiconMethod',\n )\n }\n if (!payload.iss || !isDidStringOrService(payload.iss)) {\n throw new AuthRequiredError('jwt iss is not a valid did', 'BadJwtIss')\n }\n\n const msgBytes = Buffer.from(parts.slice(0, 2).join('.'), 'utf8')\n const sigBytes = Buffer.from(sig, 'base64url')\n\n const signingKey = await getSigningKey(payload.iss, false)\n const { alg } = header\n\n let validSig: boolean\n try {\n validSig = await verifySignatureWithKey(signingKey, msgBytes, sigBytes, alg)\n } catch (err) {\n throw new AuthRequiredError(\n 'could not verify jwt signature',\n 'BadJwtSignature',\n )\n }\n\n if (!validSig) {\n // get fresh signing key in case it failed due to a recent rotation\n const freshSigningKey = await getSigningKey(payload.iss, true)\n try {\n validSig =\n freshSigningKey !== signingKey\n ? await verifySignatureWithKey(\n freshSigningKey,\n msgBytes,\n sigBytes,\n alg,\n )\n : false\n } catch (err) {\n throw new AuthRequiredError(\n 'could not verify jwt signature',\n 'BadJwtSignature',\n )\n }\n }\n\n if (!validSig) {\n throw new AuthRequiredError(\n 'jwt signature does not match jwt issuer',\n 'BadJwtSignature',\n )\n }\n\n return payload\n}\n\nexport const cryptoVerifySignatureWithKey: VerifySignatureWithKeyFn = async (\n key: string,\n msgBytes: Uint8Array,\n sigBytes: Uint8Array,\n alg: string,\n) => {\n return crypto.verifySignature(key, msgBytes, sigBytes, {\n jwtAlg: alg,\n allowMalleableSig: true,\n })\n}\n\nconst parseB64UrlToJson = (b64: string) => {\n return JSON.parse(Buffer.from(b64, 'base64url').toString('utf8'))\n}\n\nconst parseHeader = (b64: string): ServiceJwtHeaders => {\n const header = parseB64UrlToJson(b64)\n if (!header || typeof header !== 'object' || typeof header.alg !== 'string') {\n throw new AuthRequiredError('poorly formatted jwt', 'BadJwt')\n }\n return header\n}\n\nconst parsePayload = (b64: string): ServiceJwtPayload => {\n const payload = parseB64UrlToJson(b64)\n if (\n !payload ||\n typeof payload !== 'object' ||\n typeof payload.iss !== 'string' ||\n typeof payload.aud !== 'string' ||\n typeof payload.exp !== 'number' ||\n (payload.lxm && typeof payload.lxm !== 'string') ||\n (payload.nonce && typeof payload.nonce !== 'string')\n ) {\n throw new AuthRequiredError('poorly formatted jwt', 'BadJwt')\n }\n return payload\n}\n\nfunction isDidStringOrService(\n value: string,\n): value is DidString | `${DidString}#${string}` {\n const hashIdx = value.indexOf('#')\n if (hashIdx === -1) {\n return isDidString(value)\n }\n\n // basic validation of the fragment part\n const fragmentLen = value.length - hashIdx - 1\n if (fragmentLen < 1 || value.includes('#', hashIdx + 1)) {\n return false\n }\n\n // Validate the did part\n const didPart = value.slice(0, hashIdx)\n return isDidString(didPart)\n}\n"]}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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","sourcesContent":["import * as common from '@atproto/common'\nimport { MINUTE } from '@atproto/common'\nimport * as crypto from '@atproto/crypto'\nimport { DidString, isDidString } from '@atproto/lex-schema'\nimport { AuthRequiredError } from './errors.js'\n\ntype ServiceJwtParams = {\n iss: string\n aud: string\n iat?: number\n exp?: number\n lxm: string | null\n keypair: crypto.Keypair\n}\n\ntype ServiceJwtHeaders = {\n alg: string\n} & Record<string, unknown>\n\ntype ServiceJwtPayload = {\n iss: DidString | `${DidString}#${string}`\n aud: string\n exp: number\n lxm?: string\n jti?: string\n}\n\nexport const createServiceJwt = async (\n params: ServiceJwtParams,\n): Promise<string> => {\n const { iss, aud, keypair } = params\n const iat = params.iat ?? Math.floor(Date.now() / 1e3)\n const exp = params.exp ?? iat + MINUTE / 1e3\n const lxm = params.lxm ?? undefined\n const jti = await crypto.randomStr(16, 'hex')\n const header = {\n typ: 'JWT',\n alg: keypair.jwtAlg,\n }\n const payload = common.noUndefinedVals({\n iat,\n iss,\n aud,\n exp,\n lxm,\n jti,\n })\n const toSignStr = `${jsonToB64Url(header)}.${jsonToB64Url(payload)}`\n const toSign = Buffer.from(toSignStr, 'utf8')\n const sig = Buffer.from(await keypair.sign(toSign))\n return `${toSignStr}.${sig.toString('base64url')}`\n}\n\nexport const createServiceAuthHeaders = async (params: ServiceJwtParams) => {\n const jwt = await createServiceJwt(params)\n return {\n headers: { authorization: `Bearer ${jwt}` },\n }\n}\n\nconst jsonToB64Url = (json: Record<string, unknown>): string => {\n return Buffer.from(JSON.stringify(json)).toString('base64url')\n}\n\nexport type VerifySignatureWithKeyFn = (\n key: string,\n msgBytes: Uint8Array,\n sigBytes: Uint8Array,\n alg: string,\n) => Promise<boolean>\n\nexport const verifyJwt = async (\n jwtStr: string,\n ownDid: string | null, // null indicates to skip the audience check\n lxm: string | null, // null indicates to skip the lxm check\n getSigningKey: (\n iss: DidString | `${DidString}#${string}`,\n forceRefresh: boolean,\n ) => Promise<string>,\n verifySignatureWithKey: VerifySignatureWithKeyFn = cryptoVerifySignatureWithKey,\n): Promise<ServiceJwtPayload> => {\n const parts = jwtStr.split('.')\n if (parts.length !== 3) {\n throw new AuthRequiredError('poorly formatted jwt', 'BadJwt')\n }\n\n const header = parseHeader(parts[0])\n\n // The spec does not describe what to do with the \"typ\" claim. We can,\n // however, forbid some values that are not compatible with our use case.\n if (\n // service tokens are not OAuth 2.0 access tokens\n // https://datatracker.ietf.org/doc/html/rfc9068\n header['typ'] === 'at+jwt' ||\n // \"refresh+jwt\" is a non-standard type used by the @atproto packages\n header['typ'] === 'refresh+jwt' ||\n // \"DPoP\" proofs are not meant to be used as service tokens\n // https://datatracker.ietf.org/doc/html/rfc9449\n header['typ'] === 'dpop+jwt'\n ) {\n throw new AuthRequiredError(\n `Invalid jwt type \"${header['typ']}\"`,\n 'BadJwtType',\n )\n }\n\n const payload = parsePayload(parts[1])\n const sig = parts[2]\n\n if (Date.now() / 1000 > payload.exp) {\n throw new AuthRequiredError('jwt expired', 'JwtExpired')\n }\n if (ownDid !== null && payload.aud !== ownDid) {\n throw new AuthRequiredError(\n 'jwt audience does not match service did',\n 'BadJwtAudience',\n )\n }\n if (lxm !== null && payload.lxm !== lxm) {\n throw new AuthRequiredError(\n payload.lxm !== undefined\n ? `bad jwt lexicon method (\"lxm\"). must match: ${lxm}`\n : `missing jwt lexicon method (\"lxm\"). must match: ${lxm}`,\n 'BadJwtLexiconMethod',\n )\n }\n if (!payload.iss || !isDidStringOrService(payload.iss)) {\n throw new AuthRequiredError('jwt iss is not a valid did', 'BadJwtIss')\n }\n\n const msgBytes = Buffer.from(parts.slice(0, 2).join('.'), 'utf8')\n const sigBytes = Buffer.from(sig, 'base64url')\n\n const signingKey = await getSigningKey(payload.iss, false)\n const { alg } = header\n\n let validSig: boolean\n try {\n validSig = await verifySignatureWithKey(signingKey, msgBytes, sigBytes, alg)\n } catch (err) {\n throw new AuthRequiredError(\n 'could not verify jwt signature',\n 'BadJwtSignature',\n )\n }\n\n if (!validSig) {\n // get fresh signing key in case it failed due to a recent rotation\n const freshSigningKey = await getSigningKey(payload.iss, true)\n try {\n validSig =\n freshSigningKey !== signingKey\n ? await verifySignatureWithKey(\n freshSigningKey,\n msgBytes,\n sigBytes,\n alg,\n )\n : false\n } catch (err) {\n throw new AuthRequiredError(\n 'could not verify jwt signature',\n 'BadJwtSignature',\n )\n }\n }\n\n if (!validSig) {\n throw new AuthRequiredError(\n 'jwt signature does not match jwt issuer',\n 'BadJwtSignature',\n )\n }\n\n return payload\n}\n\nexport const cryptoVerifySignatureWithKey: VerifySignatureWithKeyFn = async (\n key: string,\n msgBytes: Uint8Array,\n sigBytes: Uint8Array,\n alg: string,\n) => {\n return crypto.verifySignature(key, msgBytes, sigBytes, {\n jwtAlg: alg,\n allowMalleableSig: true,\n })\n}\n\nconst parseB64UrlToJson = (b64: string) => {\n return JSON.parse(Buffer.from(b64, 'base64url').toString('utf8'))\n}\n\nconst parseHeader = (b64: string): ServiceJwtHeaders => {\n const header = parseB64UrlToJson(b64)\n if (!header || typeof header !== 'object' || typeof header.alg !== 'string') {\n throw new AuthRequiredError('poorly formatted jwt', 'BadJwt')\n }\n return header\n}\n\nconst parsePayload = (b64: string): ServiceJwtPayload => {\n const payload = parseB64UrlToJson(b64)\n if (\n !payload ||\n typeof payload !== 'object' ||\n typeof payload.iss !== 'string' ||\n typeof payload.aud !== 'string' ||\n typeof payload.exp !== 'number' ||\n (payload.lxm && typeof payload.lxm !== 'string') ||\n (payload.nonce && typeof payload.nonce !== 'string')\n ) {\n throw new AuthRequiredError('poorly formatted jwt', 'BadJwt')\n }\n return payload\n}\n\nfunction isDidStringOrService(\n value: string,\n): value is DidString | `${DidString}#${string}` {\n const hashIdx = value.indexOf('#')\n if (hashIdx === -1) {\n return isDidString(value)\n }\n\n // basic validation of the fragment part\n const fragmentLen = value.length - hashIdx - 1\n if (fragmentLen < 1 || value.includes('#', hashIdx + 1)) {\n return false\n }\n\n // Validate the did part\n const didPart = value.slice(0, hashIdx)\n return isDidString(didPart)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAA;AACvC,OAAO,EACL,YAAY,EAKb,MAAM,eAAe,CAAA;AAKtB,eAAO,MAAM,WAAW;;;;EAItB,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAErD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,WAAW,CAE1D;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAE5B,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,CACpC;AAED,OAAO,EAAE,YAAY,EAAE,CAAA;AAEvB,qBAAa,SAAU,SAAQ,KAAK;IAEzB,IAAI,EAAE,YAAY;IAClB,YAAY,CAAC,EAAE,MAAM;IACrB,eAAe,CAAC,EAAE,MAAM;gBAFxB,IAAI,EAAE,YAAY,EAClB,YAAY,CAAC,EAAE,MAAM,YAAA,EACrB,eAAe,CAAC,EAAE,MAAM,YAAA,EAC/B,OAAO,CAAC,EAAE,YAAY;IAKxB,IAAI,UAAU,IAAI,MAAM,CAWvB;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED,IAAI,OAAO;;;MAQV;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,SAAS,CAEhC;IAED,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS;IAwC3C,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS;CAGpD;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBAE9C,YAAY,CAAC,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,YAAY;IAKxB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO;CAMjD;AAED,qBAAa,iBAAkB,SAAQ,SAAS;gBAE5C,YAAY,CAAC,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,YAAY;IAUxB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO;CAMjD;AAED,qBAAa,cAAe,SAAQ,SAAS;gBAEzC,YAAY,CAAC,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,YAAY;IAKxB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO;CAKjD;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBAE9C,YAAY,CAAC,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,YAAY;IAUxB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO;CAMjD;AAED,qBAAa,oBAAqB,SAAQ,SAAS;gBAE/C,YAAY,CAAC,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,YAAY;IAKxB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO;CAMjD;AAED,qBAAa,uBAAwB,SAAQ,SAAS;gBAElD,YAAY,CAAC,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,YAAY;IAUxB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO;CAMjD;AAED,qBAAa,oBAAqB,SAAQ,SAAS;gBAE/C,YAAY,CAAC,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,YAAY;IAKxB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO;CAMjD;AAED,qBAAa,yBAA0B,SAAQ,SAAS;gBAEpD,YAAY,CAAC,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,YAAY;IAUxB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO;CAMjD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line import/default, import/no-named-as-default-member\nimport httpErrors from 'http-errors'\n// eslint-disable-next-line import/no-named-as-default-member\nconst { isHttpError } = httpErrors\nimport { LexError, XrpcError } from '@atproto/lex-client'\nimport { l } from '@atproto/lex-schema'\nimport {\n ResponseType,\n ResponseTypeStrings,\n XRPCError as XRPCClientError,\n httpResponseCodeToName,\n httpResponseCodeToString,\n} from '@atproto/xrpc'\n\n// @NOTE Do not depend (directly or indirectly) on \"./types\" here, as it would\n// create a circular dependency.\n\nexport const errorResult = l.object({\n status: l.integer({ minimum: 400 }),\n error: l.optional(l.string()),\n message: l.optional(l.string()),\n})\nexport type ErrorResult = l.Infer<typeof errorResult>\n\nexport function isErrorResult(v: unknown): v is ErrorResult {\n return errorResult.safeParse(v).success\n}\n\nexport function excludeErrorResult<V>(v: V) {\n if (isErrorResult(v)) throw XRPCError.fromErrorResult(v)\n return v as Exclude<V, ErrorResult>\n}\n\nexport { ResponseType }\n\nexport class XRPCError extends Error {\n constructor(\n public type: ResponseType,\n public errorMessage?: string,\n public customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(errorMessage, options)\n }\n\n get statusCode(): number {\n const { type } = this\n\n // Fool-proofing. `new XRPCError(123.5 as number, '')` does not generate a TypeScript error.\n // Because of this, we can end-up with any numeric value instead of an actual `ResponseType`.\n // For legacy reasons, the `type` argument is not checked in the constructor, so we check it here.\n if (type < 400 || type >= 600 || !Number.isFinite(type)) {\n return 500\n }\n\n return type\n }\n\n get error(): string | undefined {\n return this.customErrorName ?? this.typeName\n }\n\n get payload() {\n return {\n error: this.error,\n message:\n this.type === ResponseType.InternalServerError\n ? this.typeStr // Do not respond with error details for 500s\n : this.errorMessage || this.typeStr,\n }\n }\n\n get typeName(): string | undefined {\n return ResponseType[this.type]\n }\n\n get typeStr(): string | undefined {\n return ResponseTypeStrings[this.type]\n }\n\n static fromError(cause: unknown): XRPCError {\n if (cause instanceof XRPCError) {\n return cause\n }\n\n if (cause instanceof XRPCClientError) {\n const { error, message, type } = mapFromClientError(cause)\n return new XRPCError(type, message, error, { cause })\n }\n\n if (cause instanceof XrpcError) {\n const { status, body } = cause.toDownstreamError()\n return new XRPCError(status, body.message, body.error, { cause })\n }\n\n if (cause instanceof LexError) {\n const data = cause.toJSON()\n const type = ResponseType.InternalServerError\n return new XRPCError(type, data.message, data.error, { cause })\n }\n\n if (isHttpError(cause)) {\n return new XRPCError(cause.status, cause.message, cause.name, { cause })\n }\n\n if (isErrorResult(cause)) {\n return this.fromErrorResult(cause)\n }\n\n if (cause instanceof Error) {\n return new InternalServerError(cause.message, undefined, { cause })\n }\n\n return new InternalServerError(\n 'Unexpected internal server error',\n undefined,\n { cause },\n )\n }\n\n static fromErrorResult(err: ErrorResult): XRPCError {\n return new XRPCError(err.status, err.message, err.error, { cause: err })\n }\n}\n\nexport class InvalidRequestError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(ResponseType.InvalidRequest, errorMessage, customErrorName, options)\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.InvalidRequest\n )\n }\n}\n\nexport class AuthRequiredError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(\n ResponseType.AuthenticationRequired,\n errorMessage,\n customErrorName,\n options,\n )\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.AuthenticationRequired\n )\n }\n}\n\nexport class ForbiddenError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(ResponseType.Forbidden, errorMessage, customErrorName, options)\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError && instance.type === ResponseType.Forbidden\n )\n }\n}\n\nexport class InternalServerError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(\n ResponseType.InternalServerError,\n errorMessage,\n customErrorName,\n options,\n )\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.InternalServerError\n )\n }\n}\n\nexport class UpstreamFailureError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(ResponseType.UpstreamFailure, errorMessage, customErrorName, options)\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.UpstreamFailure\n )\n }\n}\n\nexport class NotEnoughResourcesError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(\n ResponseType.NotEnoughResources,\n errorMessage,\n customErrorName,\n options,\n )\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.NotEnoughResources\n )\n }\n}\n\nexport class UpstreamTimeoutError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(ResponseType.UpstreamTimeout, errorMessage, customErrorName, options)\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.UpstreamTimeout\n )\n }\n}\n\nexport class MethodNotImplementedError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(\n ResponseType.MethodNotImplemented,\n errorMessage,\n customErrorName,\n options,\n )\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.MethodNotImplemented\n )\n }\n}\n\n/**\n * Converts an upstream XRPC {@link ResponseType} into a downstream {@link ResponseType}.\n */\nfunction mapFromClientError(error: XRPCClientError): {\n error: string\n message: string\n type: ResponseType\n} {\n switch (error.status) {\n case ResponseType.InvalidResponse:\n // Upstream server returned an XRPC response that is not compatible with our internal lexicon definitions for that XRPC method.\n // @NOTE This could be reflected as both a 500 (\"we\" are at fault) and 502 (\"they\" are at fault). Let's be gents about it.\n return {\n error: httpResponseCodeToName(ResponseType.InternalServerError),\n message: httpResponseCodeToString(ResponseType.InternalServerError),\n type: ResponseType.InternalServerError,\n }\n case ResponseType.Unknown:\n // Typically a network error / unknown host\n return {\n error: httpResponseCodeToName(ResponseType.InternalServerError),\n message: httpResponseCodeToString(ResponseType.InternalServerError),\n type: ResponseType.InternalServerError,\n }\n default:\n return {\n error: error.error,\n message: error.message,\n type: error.status,\n }\n }\n}\n"]}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line import/default, import/no-named-as-default-member\nimport httpErrors from 'http-errors'\n// eslint-disable-next-line import/no-named-as-default-member\nconst { isHttpError } = httpErrors\nimport { LexError, XrpcError } from '@atproto/lex-client'\nimport { l } from '@atproto/lex-schema'\nimport {\n ResponseType,\n ResponseTypeStrings,\n XRPCError as XRPCClientError,\n httpResponseCodeToName,\n httpResponseCodeToString,\n} from '@atproto/xrpc'\n\n// @NOTE Do not depend (directly or indirectly) on \"./types\" here, as it would\n// create a circular dependency.\n\nexport const errorResult = l.object({\n status: l.integer({ minimum: 400 }),\n error: l.optional(l.string()),\n message: l.optional(l.string()),\n})\nexport type ErrorResult = l.Infer<typeof errorResult>\n\nexport function isErrorResult(v: unknown): v is ErrorResult {\n return errorResult.safeParse(v).success\n}\n\nexport function excludeErrorResult<V>(v: V) {\n if (isErrorResult(v)) throw XRPCError.fromErrorResult(v)\n return v as Exclude<V, ErrorResult>\n}\n\nexport { ResponseType }\n\nexport class XRPCError extends Error {\n constructor(\n public type: ResponseType,\n public errorMessage?: string,\n public customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(errorMessage, options)\n }\n\n get statusCode(): number {\n const { type } = this\n\n // Fool-proofing. `new XRPCError(123.5 as number, '')` does not generate a TypeScript error.\n // Because of this, we can end-up with any numeric value instead of an actual `ResponseType`.\n // For legacy reasons, the `type` argument is not checked in the constructor, so we check it here.\n if (type < 400 || type >= 600 || !Number.isFinite(type)) {\n return 500\n }\n\n return type\n }\n\n get error(): string | undefined {\n return this.customErrorName ?? this.typeName\n }\n\n get payload() {\n return {\n error: this.error,\n message:\n this.type === ResponseType.InternalServerError\n ? this.typeStr // Do not respond with error details for 500s\n : this.errorMessage || this.typeStr,\n }\n }\n\n get typeName(): string | undefined {\n return ResponseType[this.type]\n }\n\n get typeStr(): string | undefined {\n return ResponseTypeStrings[this.type]\n }\n\n static fromError(cause: unknown): XRPCError {\n if (cause instanceof XRPCError) {\n return cause\n }\n\n if (cause instanceof XRPCClientError) {\n const { error, message, type } = mapFromClientError(cause)\n return new XRPCError(type, message, error, { cause })\n }\n\n if (cause instanceof XrpcError) {\n const { status, body } = cause.toDownstreamError()\n return new XRPCError(status, body.message, body.error, { cause })\n }\n\n if (cause instanceof LexError) {\n const data = cause.toJSON()\n const type = ResponseType.InternalServerError\n return new XRPCError(type, data.message, data.error, { cause })\n }\n\n if (isHttpError(cause)) {\n return new XRPCError(cause.status, cause.message, cause.name, { cause })\n }\n\n if (isErrorResult(cause)) {\n return this.fromErrorResult(cause)\n }\n\n if (cause instanceof Error) {\n return new InternalServerError(cause.message, undefined, { cause })\n }\n\n return new InternalServerError(\n 'Unexpected internal server error',\n undefined,\n { cause },\n )\n }\n\n static fromErrorResult(err: ErrorResult): XRPCError {\n return new XRPCError(err.status, err.message, err.error, { cause: err })\n }\n}\n\nexport class InvalidRequestError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(ResponseType.InvalidRequest, errorMessage, customErrorName, options)\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.InvalidRequest\n )\n }\n}\n\nexport class AuthRequiredError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(\n ResponseType.AuthenticationRequired,\n errorMessage,\n customErrorName,\n options,\n )\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.AuthenticationRequired\n )\n }\n}\n\nexport class ForbiddenError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(ResponseType.Forbidden, errorMessage, customErrorName, options)\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError && instance.type === ResponseType.Forbidden\n )\n }\n}\n\nexport class InternalServerError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(\n ResponseType.InternalServerError,\n errorMessage,\n customErrorName,\n options,\n )\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.InternalServerError\n )\n }\n}\n\nexport class UpstreamFailureError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(ResponseType.UpstreamFailure, errorMessage, customErrorName, options)\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.UpstreamFailure\n )\n }\n}\n\nexport class NotEnoughResourcesError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(\n ResponseType.NotEnoughResources,\n errorMessage,\n customErrorName,\n options,\n )\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.NotEnoughResources\n )\n }\n}\n\nexport class UpstreamTimeoutError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(ResponseType.UpstreamTimeout, errorMessage, customErrorName, options)\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.UpstreamTimeout\n )\n }\n}\n\nexport class MethodNotImplementedError extends XRPCError {\n constructor(\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(\n ResponseType.MethodNotImplemented,\n errorMessage,\n customErrorName,\n options,\n )\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.MethodNotImplemented\n )\n }\n}\n\n/**\n * Converts an upstream XRPC {@link ResponseType} into a downstream {@link ResponseType}.\n */\nfunction mapFromClientError(error: XRPCClientError): {\n error: string\n message: string\n type: ResponseType\n} {\n switch (error.status) {\n case ResponseType.InvalidResponse:\n // Upstream server returned an XRPC response that is not compatible with our internal lexicon definitions for that XRPC method.\n // @NOTE This could be reflected as both a 500 (\"we\" are at fault) and 502 (\"they\" are at fault). Let's be gents about it.\n return {\n error: httpResponseCodeToName(ResponseType.InternalServerError),\n message: httpResponseCodeToString(ResponseType.InternalServerError),\n type: ResponseType.InternalServerError,\n }\n case ResponseType.Unknown:\n // Typically a network error / unknown host\n return {\n error: httpResponseCodeToName(ResponseType.InternalServerError),\n message: httpResponseCodeToString(ResponseType.InternalServerError),\n type: ResponseType.InternalServerError,\n }\n default:\n return {\n error: error.error,\n message: error.message,\n type: error.status,\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,eAAO,MAAM,WAAW,gBAAgB,CAAA;AAExC,eAAO,MAAM,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CACxB,CAAA;AAE9B,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,eAAO,MAAM,WAAW,gBAAgB,CAAA;AAExC,eAAO,MAAM,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CACxB,CAAA;eAEf,MAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter-http.d.ts","sourceRoot":"","sources":["../src/rate-limiter-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,EAGL,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,eAAe,CAAA;IACpB,GAAG,CAAC,EAAE,cAAc,CAAA;CACrB;AAED,MAAM,MAAM,sBAAsB,CAChC,CAAC,SAAS,sBAAsB,GAAG,sBAAsB,IACvD;IACF,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAA;CAC7B,CAAA;AAED;;;;GAIG;AACH,qBAAa,eAAe,CAC1B,CAAC,SAAS,sBAAsB,GAAG,sBAAsB,CACzD,YAAW,YAAY,CAAC,CAAC,CAAC;IAGxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,EAC5B,OAAO,GAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAM;IAG9D,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB7B,OAAO,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAIlD,KAAK,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAIpD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,sBAAsB,GAAG,sBAAsB,EACnE,YAAY,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,EACxC,EAAE,MAAM,EAAE,GAAE,sBAAsB,CAAC,CAAC,CAAM,GACzC,eAAe,CAAC,CAAC,CAAC,GAAG,SAAS;CAMlC"}
1
+ {"version":3,"file":"rate-limiter-http.d.ts","sourceRoot":"","sources":["../src/rate-limiter-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,EAGL,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,eAAe,CAAA;IACpB,GAAG,CAAC,EAAE,cAAc,CAAA;CACrB;AAED,MAAM,MAAM,sBAAsB,CAChC,CAAC,SAAS,sBAAsB,GAAG,sBAAsB,IACvD;IACF,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAA;CAC7B,CAAA;AAED;;;;GAIG;AACH,qBAAa,eAAe,CAC1B,CAAC,SAAS,sBAAsB,GAAG,sBAAsB,CACzD,YAAW,YAAY,CAAC,CAAC,CAAC;IAGxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAF1B,YACmB,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,EAC5B,OAAO,GAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAM,EAChE;IAEE,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBlC;IAEK,OAAO,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,qCAEvD;IAEK,KAAK,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,iBAEnD;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,sBAAsB,GAAG,sBAAsB,EACnE,YAAY,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,EACxC,EAAE,MAAM,EAAE,GAAE,sBAAsB,CAAC,CAAC,CAAM,GACzC,eAAe,CAAC,CAAC,CAAC,GAAG,SAAS,CAKhC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter-http.js","sourceRoot":"","sources":["../src/rate-limiter-http.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,sBAAsB,GAKvB,MAAM,mBAAmB,CAAA;AAa1B;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAI1B,YACmB,WAA4B,EAC5B,UAA+C,EAAE;QADjD,gBAAW,GAAX,WAAW,CAAiB;QAC5B,YAAO,GAAP,OAAO,CAA0C;IACjE,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,GAAM;QACjB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAC/B,IAAI,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC;YAAE,OAAM;QAEjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACtC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;gBAC1C,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;YACnC,CAAC;YAED,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAG,IAAuC;QACtD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAG,IAAqC;QAClD,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,IAAI,CACT,YAAwC,EACxC,EAAE,MAAM,KAAgC,EAAE;QAE1C,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC1D,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAA;QAElC,OAAO,IAAI,eAAe,CAAI,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IACxD,CAAC;CACF;AAED,SAAS,gBAAgB,CAEvB,GAAM,EAAE,MAAyB;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,CAAA;IAEpE,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACnD,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;IAC9C,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,qBAAqB,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;IACjE,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,kBAAkB,EAAE,GAAG,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;AAChF,CAAC","sourcesContent":["import { IncomingMessage, ServerResponse } from 'node:http'\nimport {\n CombinedRateLimiter,\n RateLimitExceededError,\n RateLimiterConsume,\n RateLimiterI,\n RateLimiterReset,\n RateLimiterStatus,\n} from './rate-limiter.js'\n\nexport interface HttpRateLimiterContext {\n req: IncomingMessage\n res?: ServerResponse\n}\n\nexport type HttpRateLimiterOptions<\n C extends HttpRateLimiterContext = HttpRateLimiterContext,\n> = {\n bypass?: (ctx: C) => boolean\n}\n\n/**\n * Wraps a {@link RateLimiterI} class with an {@link RateLimiterI}\n * implementation that will apply the appropriate headers to the response if a\n * limit is exceeded.\n */\nexport class HttpRateLimiter<\n C extends HttpRateLimiterContext = HttpRateLimiterContext,\n> implements RateLimiterI<C>\n{\n constructor(\n private readonly rateLimiter: RateLimiterI<C>,\n private readonly options: Readonly<HttpRateLimiterOptions<C>> = {},\n ) {}\n\n async handle(ctx: C): Promise<void> {\n const { bypass } = this.options\n if (bypass && bypass(ctx)) return\n\n try {\n const result = await this.consume(ctx)\n if (result != null) {\n setStatusHeaders(ctx, result)\n }\n } catch (err) {\n if (err instanceof RateLimitExceededError) {\n setStatusHeaders(ctx, err.status)\n }\n\n throw err\n }\n }\n\n async consume(...args: Parameters<RateLimiterConsume<C>>) {\n return this.rateLimiter.consume(...args)\n }\n\n async reset(...args: Parameters<RateLimiterReset<C>>) {\n return this.rateLimiter.reset(...args)\n }\n\n static from<C extends HttpRateLimiterContext = HttpRateLimiterContext>(\n rateLimiters: readonly RateLimiterI<C>[],\n { bypass }: HttpRateLimiterOptions<C> = {},\n ): HttpRateLimiter<C> | undefined {\n const rateLimiter = CombinedRateLimiter.from(rateLimiters)\n if (!rateLimiter) return undefined\n\n return new HttpRateLimiter<C>(rateLimiter, { bypass })\n }\n}\n\nfunction setStatusHeaders<\n C extends HttpRateLimiterContext = HttpRateLimiterContext,\n>(ctx: C, status: RateLimiterStatus) {\n const resetAt = Math.floor((Date.now() + status.msBeforeNext) / 1e3)\n\n ctx.res?.setHeader('RateLimit-Limit', status.limit)\n ctx.res?.setHeader('RateLimit-Reset', resetAt)\n ctx.res?.setHeader('RateLimit-Remaining', status.remainingPoints)\n ctx.res?.setHeader('RateLimit-Policy', `${status.limit};w=${status.duration}`)\n}\n"]}
1
+ {"version":3,"file":"rate-limiter-http.js","sourceRoot":"","sources":["../src/rate-limiter-http.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,sBAAsB,GAKvB,MAAM,mBAAmB,CAAA;AAa1B;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAI1B,YACmB,WAA4B,EAC5B,OAAO,GAAwC,EAAE;2BADjD,WAAW;uBACX,OAAO;IACvB,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,GAAM;QACjB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAC/B,IAAI,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC;YAAE,OAAM;QAEjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACtC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;gBAC1C,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;YACnC,CAAC;YAED,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAG,IAAuC;QACtD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAG,IAAqC;QAClD,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,IAAI,CACT,YAAwC,EACxC,EAAE,MAAM,EAAE,GAA8B,EAAE;QAE1C,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC1D,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAA;QAElC,OAAO,IAAI,eAAe,CAAI,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IACxD,CAAC;CACF;AAED,SAAS,gBAAgB,CAEvB,GAAM,EAAE,MAAyB;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,CAAA;IAEpE,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACnD,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;IAC9C,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,qBAAqB,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;IACjE,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,kBAAkB,EAAE,GAAG,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;AAChF,CAAC","sourcesContent":["import { IncomingMessage, ServerResponse } from 'node:http'\nimport {\n CombinedRateLimiter,\n RateLimitExceededError,\n RateLimiterConsume,\n RateLimiterI,\n RateLimiterReset,\n RateLimiterStatus,\n} from './rate-limiter.js'\n\nexport interface HttpRateLimiterContext {\n req: IncomingMessage\n res?: ServerResponse\n}\n\nexport type HttpRateLimiterOptions<\n C extends HttpRateLimiterContext = HttpRateLimiterContext,\n> = {\n bypass?: (ctx: C) => boolean\n}\n\n/**\n * Wraps a {@link RateLimiterI} class with an {@link RateLimiterI}\n * implementation that will apply the appropriate headers to the response if a\n * limit is exceeded.\n */\nexport class HttpRateLimiter<\n C extends HttpRateLimiterContext = HttpRateLimiterContext,\n> implements RateLimiterI<C>\n{\n constructor(\n private readonly rateLimiter: RateLimiterI<C>,\n private readonly options: Readonly<HttpRateLimiterOptions<C>> = {},\n ) {}\n\n async handle(ctx: C): Promise<void> {\n const { bypass } = this.options\n if (bypass && bypass(ctx)) return\n\n try {\n const result = await this.consume(ctx)\n if (result != null) {\n setStatusHeaders(ctx, result)\n }\n } catch (err) {\n if (err instanceof RateLimitExceededError) {\n setStatusHeaders(ctx, err.status)\n }\n\n throw err\n }\n }\n\n async consume(...args: Parameters<RateLimiterConsume<C>>) {\n return this.rateLimiter.consume(...args)\n }\n\n async reset(...args: Parameters<RateLimiterReset<C>>) {\n return this.rateLimiter.reset(...args)\n }\n\n static from<C extends HttpRateLimiterContext = HttpRateLimiterContext>(\n rateLimiters: readonly RateLimiterI<C>[],\n { bypass }: HttpRateLimiterOptions<C> = {},\n ): HttpRateLimiter<C> | undefined {\n const rateLimiter = CombinedRateLimiter.from(rateLimiters)\n if (!rateLimiter) return undefined\n\n return new HttpRateLimiter<C>(rateLimiter, { bypass })\n }\n}\n\nfunction setStatusHeaders<\n C extends HttpRateLimiterContext = HttpRateLimiterContext,\n>(ctx: C, status: RateLimiterStatus) {\n const resetAt = Math.floor((Date.now() + status.msBeforeNext) / 1e3)\n\n ctx.res?.setHeader('RateLimit-Limit', status.limit)\n ctx.res?.setHeader('RateLimit-Reset', resetAt)\n ctx.res?.setHeader('RateLimit-Remaining', status.remainingPoints)\n ctx.res?.setHeader('RateLimit-Policy', `${status.limit};w=${status.duration}`)\n}\n"]}
@@ -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;AAC9B,OAAO,EAAgB,SAAS,EAAE,MAAM,aAAa,CAAA;AAKrD,YAAY,EAAE,mBAAmB,EAAE,CAAA;AAEnC,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,CAAA;AAC9D,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAA;AAE1D,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAA;IAC9B,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAA;CAC3B;AAED,MAAM,MAAM,yBAAyB,CAAC,CAAC,GAAG,OAAO,IAAI;IACnD,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;IACtB,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,IAAI,CAC5C,GAAG,EAAE,CAAC,EACN,IAAI,CAAC,EAAE,yBAAyB,CAAC,CAAC,CAAC,KAChC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;AAEtC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,uBAAuB,CAAC,CAAC,GAAG,OAAO,IAAI;IACjD,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,OAAO,IAAI,CAC1C,GAAG,EAAE,CAAC,EACN,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,KAC9B,OAAO,CAAC,IAAI,CAAC,CAAA;AAElB,MAAM,MAAM,8BAA8B,GAAG;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAA;QACjB,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF,CAAA;AACD,MAAM,MAAM,uBAAuB,CAAC,CAAC,GAAG,OAAO,IAAI,CACjD,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,CAAC,EACN,OAAO,EAAE,8BAA8B,KACpC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;AAEtC,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,IAAI;IAC5C,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;IACrB,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;IAC3B,OAAO,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAA;CACrC,CAAA;AAED,qBAAa,WAAW,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC;IAMrD,OAAO,EAAE,mBAAmB;IALrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA4B;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;gBAGnC,OAAO,EAAE,mBAAmB,EACnC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAQ1B,OAAO,CACX,GAAG,EAAE,CAAC,EACN,IAAI,CAAC,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAmC9B,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAYtE;AAED,qBAAa,iBAAiB,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;gBACpD,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;CAQ3C;AAED,qBAAa,gBAAgB,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;gBACnD,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;CASjE;AAED,eAAO,MAAM,mBAAmB,GAC9B,SAAS,mBAAmB,EAC5B,KAAK,cAAc,KAClB,iBASF,CAAA;AAED,MAAM,MAAM,yBAAyB,CAAC,CAAC,GAAG,OAAO,IAAI;IACnD,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;IACtB,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;CAC7B,CAAA;AAED;;;GAGG;AACH,qBAAa,kBAAkB,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC;IAEnE,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAF1B,OAAO;IAKD,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAOnD,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAMrD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,EACrB,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,EAC5B,EAAE,OAAO,EAAE,UAAU,EAAE,GAAE,yBAAyB,CAAC,CAAC,CAAM,GACzD,YAAY,CAAC,CAAC,CAAC;CAInB;AAED;;;;;GAKG;AACH,qBAAa,mBAAmB,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC;IAEpE,OAAO,CAAC,QAAQ,CAAC,YAAY;IAD/B,OAAO;IAID,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAiBnD,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAMrD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,EACrB,YAAY,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,GACvC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS;CAK/B;AAED,qBAAa,sBAAuB,SAAQ,SAAS;IAE1C,MAAM,EAAE,iBAAiB;gBAAzB,MAAM,EAAE,iBAAiB,EAChC,YAAY,CAAC,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,YAAY;IAUxB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO;CAMjD"}
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n RateLimiterAbstract,\n RateLimiterMemory,\n RateLimiterRedis,\n RateLimiterRes,\n} from 'rate-limiter-flexible'\nimport { ResponseType, XRPCError } from './errors.js'\n\n// @NOTE Do not depend (directly or indirectly) on \"./types\" here, as it would\n// create a circular dependency.\n\nexport type { RateLimiterAbstract }\n\nexport type CalcKeyFn<C = unknown> = (ctx: C) => string | null\nexport type CalcPointsFn<C = unknown> = (ctx: C) => number\n\nexport interface RateLimiterI<C = unknown> {\n consume: RateLimiterConsume<C>\n reset: RateLimiterReset<C>\n}\n\nexport type RateLimiterConsumeOptions<C = unknown> = {\n calcKey?: CalcKeyFn<C>\n calcPoints?: CalcPointsFn<C>\n}\n\nexport type RateLimiterConsume<C = unknown> = (\n ctx: C,\n opts?: RateLimiterConsumeOptions<C>,\n) => Promise<RateLimiterStatus | null>\n\nexport type RateLimiterStatus = {\n limit: number\n duration: number\n remainingPoints: number\n msBeforeNext: number\n consumedPoints: number\n isFirstInDuration: boolean\n}\n\nexport type RateLimiterResetOptions<C = unknown> = {\n calcKey?: CalcKeyFn<C>\n}\n\nexport type RateLimiterReset<C = unknown> = (\n ctx: C,\n opts?: RateLimiterResetOptions<C>,\n) => Promise<void>\n\nexport type RateLimiterErrorHandlerDetails = {\n key: string\n points: number\n limiter: {\n keyPrefix: string\n points: number\n duration: number\n }\n}\nexport type RateLimiterErrorHandler<C = unknown> = (\n err: unknown,\n ctx: C,\n details: RateLimiterErrorHandlerDetails,\n) => Promise<RateLimiterStatus | null>\n\nexport type RateLimiterOptions<C = unknown> = {\n keyPrefix: string\n durationMs: number\n points: number\n calcKey: CalcKeyFn<C>\n calcPoints: CalcPointsFn<C>\n onError?: RateLimiterErrorHandler<C>\n}\n\nexport class RateLimiter<C = unknown> implements RateLimiterI<C> {\n private readonly onError?: RateLimiterErrorHandler<C>\n private readonly calcKey: CalcKeyFn<C>\n private readonly calcPoints: CalcPointsFn<C>\n\n constructor(\n public limiter: RateLimiterAbstract,\n options: RateLimiterOptions<C>,\n ) {\n this.limiter = limiter\n this.onError = options.onError\n this.calcKey = options.calcKey\n this.calcPoints = options.calcPoints\n }\n\n async consume(\n ctx: C,\n opts?: RateLimiterConsumeOptions<C>,\n ): Promise<RateLimiterStatus | null> {\n const calcKey = opts?.calcKey ?? this.calcKey\n const key = calcKey(ctx)\n if (key === null) {\n return null\n }\n const calcPoints = opts?.calcPoints ?? this.calcPoints\n const points = calcPoints(ctx)\n if (points < 1) {\n return null\n }\n const { limiter } = this\n try {\n const res = await limiter.consume(key, points)\n return formatLimiterStatus(limiter, res)\n } catch (err) {\n if (err instanceof RateLimiterRes) {\n // Wrap rate-limiter-flexible error into our own error type\n const status = formatLimiterStatus(limiter, err)\n throw new RateLimitExceededError(status)\n } else if (err instanceof RateLimitExceededError) {\n // Propagate RateLimitExceededError errors\n throw err\n } else {\n // Most likely a system error (failed to connect to Redis, etc). Allow\n // the caller to decide how to handle it (fail open by allowing the\n // request, fail closed by rejecting the request, etc).\n const { onError } = this\n if (onError) return onError(err, ctx, { key, points, limiter })\n\n throw err\n }\n }\n }\n\n async reset(ctx: C, opts?: RateLimiterResetOptions<C>): Promise<void> {\n const key = opts?.calcKey ? opts.calcKey(ctx) : this.calcKey(ctx)\n if (key === null) {\n return\n }\n\n try {\n await this.limiter.delete(key)\n } catch (cause) {\n throw new Error(`rate limiter failed to reset key: ${key}`, { cause })\n }\n }\n}\n\nexport class MemoryRateLimiter<C = unknown> extends RateLimiter<C> {\n constructor(options: RateLimiterOptions<C>) {\n const limiter = new RateLimiterMemory({\n keyPrefix: options.keyPrefix,\n duration: Math.floor(options.durationMs / 1000),\n points: options.points,\n })\n super(limiter, options)\n }\n}\n\nexport class RedisRateLimiter<C = unknown> extends RateLimiter<C> {\n constructor(storeClient: unknown, options: RateLimiterOptions<C>) {\n const limiter = new RateLimiterRedis({\n storeClient,\n keyPrefix: options.keyPrefix,\n duration: Math.floor(options.durationMs / 1000),\n points: options.points,\n })\n super(limiter, options)\n }\n}\n\nexport const formatLimiterStatus = (\n limiter: RateLimiterAbstract,\n res: RateLimiterRes,\n): RateLimiterStatus => {\n return {\n limit: limiter.points,\n duration: limiter.duration,\n remainingPoints: res.remainingPoints,\n msBeforeNext: res.msBeforeNext,\n consumedPoints: res.consumedPoints,\n isFirstInDuration: res.isFirstInDuration,\n }\n}\n\nexport type WrappedRateLimiterOptions<C = unknown> = {\n calcKey?: CalcKeyFn<C>\n calcPoints?: CalcPointsFn<C>\n}\n\n/**\n * Wraps a {@link RateLimiterI} instance with custom key and points calculation\n * functions.\n */\nexport class WrappedRateLimiter<C = unknown> implements RateLimiterI<C> {\n private constructor(\n private readonly rateLimiter: RateLimiterI<C>,\n private readonly options: Readonly<WrappedRateLimiterOptions<C>>,\n ) {}\n\n async consume(ctx: C, opts?: RateLimiterConsumeOptions<C>) {\n return this.rateLimiter.consume(ctx, {\n calcKey: opts?.calcKey ?? this.options.calcKey,\n calcPoints: opts?.calcPoints ?? this.options.calcPoints,\n })\n }\n\n async reset(ctx: C, opts?: RateLimiterResetOptions<C>) {\n return this.rateLimiter.reset(ctx, {\n calcKey: opts?.calcKey ?? this.options.calcKey,\n })\n }\n\n static from<C = unknown>(\n rateLimiter: RateLimiterI<C>,\n { calcKey, calcPoints }: WrappedRateLimiterOptions<C> = {},\n ): RateLimiterI<C> {\n if (!calcKey && !calcPoints) return rateLimiter\n return new WrappedRateLimiter<C>(rateLimiter, { calcKey, calcPoints })\n }\n}\n\n/**\n * Combines multiple rate limiters into one.\n *\n * The combined rate limiter will return the tightest (most restrictive) of all\n * the provided rate limiters.\n */\nexport class CombinedRateLimiter<C = unknown> implements RateLimiterI<C> {\n private constructor(\n private readonly rateLimiters: readonly RateLimiterI<C>[],\n ) {}\n\n async consume(ctx: C, opts?: RateLimiterConsumeOptions<C>) {\n const promises: ReturnType<RateLimiterConsume>[] = []\n for (const rl of this.rateLimiters) promises.push(rl.consume(ctx, opts))\n const results = await Promise.all(promises)\n\n // Compute the tightest rate limit status (the one with the least remaining points)\n let lowest: RateLimiterStatus | null = null\n for (const resp of results) {\n if (resp === null) continue\n if (lowest === null || resp.remainingPoints < lowest.remainingPoints) {\n lowest = resp\n }\n }\n\n return lowest\n }\n\n async reset(ctx: C, opts?: RateLimiterResetOptions<C>) {\n const promises: ReturnType<RateLimiterReset>[] = []\n for (const rl of this.rateLimiters) promises.push(rl.reset(ctx, opts))\n await Promise.all(promises)\n }\n\n static from<C = unknown>(\n rateLimiters: readonly RateLimiterI<C>[],\n ): RateLimiterI<C> | undefined {\n if (rateLimiters.length === 0) return undefined\n if (rateLimiters.length === 1) return rateLimiters[0]\n return new CombinedRateLimiter(rateLimiters)\n }\n}\n\nexport class RateLimitExceededError extends XRPCError {\n constructor(\n public status: RateLimiterStatus,\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(\n ResponseType.RateLimitExceeded,\n errorMessage,\n customErrorName,\n options,\n )\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.RateLimitExceeded\n )\n }\n}\n"]}
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n RateLimiterAbstract,\n RateLimiterMemory,\n RateLimiterRedis,\n RateLimiterRes,\n} from 'rate-limiter-flexible'\nimport { ResponseType, XRPCError } from './errors.js'\n\n// @NOTE Do not depend (directly or indirectly) on \"./types\" here, as it would\n// create a circular dependency.\n\nexport type { RateLimiterAbstract }\n\nexport type CalcKeyFn<C = unknown> = (ctx: C) => string | null\nexport type CalcPointsFn<C = unknown> = (ctx: C) => number\n\nexport interface RateLimiterI<C = unknown> {\n consume: RateLimiterConsume<C>\n reset: RateLimiterReset<C>\n}\n\nexport type RateLimiterConsumeOptions<C = unknown> = {\n calcKey?: CalcKeyFn<C>\n calcPoints?: CalcPointsFn<C>\n}\n\nexport type RateLimiterConsume<C = unknown> = (\n ctx: C,\n opts?: RateLimiterConsumeOptions<C>,\n) => Promise<RateLimiterStatus | null>\n\nexport type RateLimiterStatus = {\n limit: number\n duration: number\n remainingPoints: number\n msBeforeNext: number\n consumedPoints: number\n isFirstInDuration: boolean\n}\n\nexport type RateLimiterResetOptions<C = unknown> = {\n calcKey?: CalcKeyFn<C>\n}\n\nexport type RateLimiterReset<C = unknown> = (\n ctx: C,\n opts?: RateLimiterResetOptions<C>,\n) => Promise<void>\n\nexport type RateLimiterErrorHandlerDetails = {\n key: string\n points: number\n limiter: {\n keyPrefix: string\n points: number\n duration: number\n }\n}\nexport type RateLimiterErrorHandler<C = unknown> = (\n err: unknown,\n ctx: C,\n details: RateLimiterErrorHandlerDetails,\n) => Promise<RateLimiterStatus | null>\n\nexport type RateLimiterOptions<C = unknown> = {\n keyPrefix: string\n durationMs: number\n points: number\n calcKey: CalcKeyFn<C>\n calcPoints: CalcPointsFn<C>\n onError?: RateLimiterErrorHandler<C>\n}\n\nexport class RateLimiter<C = unknown> implements RateLimiterI<C> {\n private readonly onError?: RateLimiterErrorHandler<C>\n private readonly calcKey: CalcKeyFn<C>\n private readonly calcPoints: CalcPointsFn<C>\n\n constructor(\n public limiter: RateLimiterAbstract,\n options: RateLimiterOptions<C>,\n ) {\n this.limiter = limiter\n this.onError = options.onError\n this.calcKey = options.calcKey\n this.calcPoints = options.calcPoints\n }\n\n async consume(\n ctx: C,\n opts?: RateLimiterConsumeOptions<C>,\n ): Promise<RateLimiterStatus | null> {\n const calcKey = opts?.calcKey ?? this.calcKey\n const key = calcKey(ctx)\n if (key === null) {\n return null\n }\n const calcPoints = opts?.calcPoints ?? this.calcPoints\n const points = calcPoints(ctx)\n if (points < 1) {\n return null\n }\n const { limiter } = this\n try {\n const res = await limiter.consume(key, points)\n return formatLimiterStatus(limiter, res)\n } catch (err) {\n if (err instanceof RateLimiterRes) {\n // Wrap rate-limiter-flexible error into our own error type\n const status = formatLimiterStatus(limiter, err)\n throw new RateLimitExceededError(status)\n } else if (err instanceof RateLimitExceededError) {\n // Propagate RateLimitExceededError errors\n throw err\n } else {\n // Most likely a system error (failed to connect to Redis, etc). Allow\n // the caller to decide how to handle it (fail open by allowing the\n // request, fail closed by rejecting the request, etc).\n const { onError } = this\n if (onError) return onError(err, ctx, { key, points, limiter })\n\n throw err\n }\n }\n }\n\n async reset(ctx: C, opts?: RateLimiterResetOptions<C>): Promise<void> {\n const key = opts?.calcKey ? opts.calcKey(ctx) : this.calcKey(ctx)\n if (key === null) {\n return\n }\n\n try {\n await this.limiter.delete(key)\n } catch (cause) {\n throw new Error(`rate limiter failed to reset key: ${key}`, { cause })\n }\n }\n}\n\nexport class MemoryRateLimiter<C = unknown> extends RateLimiter<C> {\n constructor(options: RateLimiterOptions<C>) {\n const limiter = new RateLimiterMemory({\n keyPrefix: options.keyPrefix,\n duration: Math.floor(options.durationMs / 1000),\n points: options.points,\n })\n super(limiter, options)\n }\n}\n\nexport class RedisRateLimiter<C = unknown> extends RateLimiter<C> {\n constructor(storeClient: unknown, options: RateLimiterOptions<C>) {\n const limiter = new RateLimiterRedis({\n storeClient,\n keyPrefix: options.keyPrefix,\n duration: Math.floor(options.durationMs / 1000),\n points: options.points,\n })\n super(limiter, options)\n }\n}\n\nexport const formatLimiterStatus = (\n limiter: RateLimiterAbstract,\n res: RateLimiterRes,\n): RateLimiterStatus => {\n return {\n limit: limiter.points,\n duration: limiter.duration,\n remainingPoints: res.remainingPoints,\n msBeforeNext: res.msBeforeNext,\n consumedPoints: res.consumedPoints,\n isFirstInDuration: res.isFirstInDuration,\n }\n}\n\nexport type WrappedRateLimiterOptions<C = unknown> = {\n calcKey?: CalcKeyFn<C>\n calcPoints?: CalcPointsFn<C>\n}\n\n/**\n * Wraps a {@link RateLimiterI} instance with custom key and points calculation\n * functions.\n */\nexport class WrappedRateLimiter<C = unknown> implements RateLimiterI<C> {\n private constructor(\n private readonly rateLimiter: RateLimiterI<C>,\n private readonly options: Readonly<WrappedRateLimiterOptions<C>>,\n ) {}\n\n async consume(ctx: C, opts?: RateLimiterConsumeOptions<C>) {\n return this.rateLimiter.consume(ctx, {\n calcKey: opts?.calcKey ?? this.options.calcKey,\n calcPoints: opts?.calcPoints ?? this.options.calcPoints,\n })\n }\n\n async reset(ctx: C, opts?: RateLimiterResetOptions<C>) {\n return this.rateLimiter.reset(ctx, {\n calcKey: opts?.calcKey ?? this.options.calcKey,\n })\n }\n\n static from<C = unknown>(\n rateLimiter: RateLimiterI<C>,\n { calcKey, calcPoints }: WrappedRateLimiterOptions<C> = {},\n ): RateLimiterI<C> {\n if (!calcKey && !calcPoints) return rateLimiter\n return new WrappedRateLimiter<C>(rateLimiter, { calcKey, calcPoints })\n }\n}\n\n/**\n * Combines multiple rate limiters into one.\n *\n * The combined rate limiter will return the tightest (most restrictive) of all\n * the provided rate limiters.\n */\nexport class CombinedRateLimiter<C = unknown> implements RateLimiterI<C> {\n private constructor(\n private readonly rateLimiters: readonly RateLimiterI<C>[],\n ) {}\n\n async consume(ctx: C, opts?: RateLimiterConsumeOptions<C>) {\n const promises: ReturnType<RateLimiterConsume>[] = []\n for (const rl of this.rateLimiters) promises.push(rl.consume(ctx, opts))\n const results = await Promise.all(promises)\n\n // Compute the tightest rate limit status (the one with the least remaining points)\n let lowest: RateLimiterStatus | null = null\n for (const resp of results) {\n if (resp === null) continue\n if (lowest === null || resp.remainingPoints < lowest.remainingPoints) {\n lowest = resp\n }\n }\n\n return lowest\n }\n\n async reset(ctx: C, opts?: RateLimiterResetOptions<C>) {\n const promises: ReturnType<RateLimiterReset>[] = []\n for (const rl of this.rateLimiters) promises.push(rl.reset(ctx, opts))\n await Promise.all(promises)\n }\n\n static from<C = unknown>(\n rateLimiters: readonly RateLimiterI<C>[],\n ): RateLimiterI<C> | undefined {\n if (rateLimiters.length === 0) return undefined\n if (rateLimiters.length === 1) return rateLimiters[0]\n return new CombinedRateLimiter(rateLimiters)\n }\n}\n\nexport class RateLimitExceededError extends XRPCError {\n constructor(\n public status: RateLimiterStatus,\n errorMessage?: string,\n customErrorName?: string,\n options?: ErrorOptions,\n ) {\n super(\n ResponseType.RateLimitExceeded,\n errorMessage,\n customErrorName,\n options,\n )\n }\n\n [Symbol.hasInstance](instance: unknown): boolean {\n return (\n instance instanceof XRPCError &&\n instance.type === ResponseType.RateLimitExceeded\n )\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { IncomingMessage } from 'node:http'\nimport { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport express, {\n Application,\n ErrorRequestHandler,\n Express,\n RequestHandler,\n Router,\n} from 'express'\nimport { LexValue } from '@atproto/lex-data'\nimport { l } from '@atproto/lex-schema'\nimport {\n LexXrpcProcedure,\n LexXrpcQuery,\n LexXrpcSubscription,\n LexiconDoc,\n Lexicons,\n lexToJson,\n} from '@atproto/lexicon'\nimport {\n InternalServerError,\n InvalidRequestError,\n MethodNotImplementedError,\n XRPCError,\n excludeErrorResult,\n} from './errors.js'\nimport log, { LOGGER_NAME } from './logger.js'\nimport { HttpRateLimiter } from './rate-limiter-http.js'\nimport {\n CalcKeyFn,\n CalcPointsFn,\n RateLimiterErrorHandlerDetails,\n RateLimiterI,\n RateLimiterOptions,\n WrappedRateLimiter,\n} from './rate-limiter.js'\nimport {\n ErrorFrame,\n Frame,\n MessageFrame,\n XrpcStreamServer,\n} from './stream/index.js'\nimport {\n Auth,\n AuthResult,\n AuthVerifier,\n CatchallHandler,\n HandlerContext,\n Input,\n LexMethodConfig,\n LexMethodHandler,\n LexMethodInput,\n LexMethodOutput,\n LexMethodParams,\n LexSubscriptionConfig,\n LexSubscriptionHandler,\n MethodAuthContext,\n MethodConfig,\n MethodConfigOrHandler,\n MethodHandler,\n Options,\n Output,\n Params,\n RouteOptions,\n ServerRateLimitDescription,\n StreamAuthContext,\n StreamConfig,\n StreamConfigOrHandler,\n StreamContext,\n isHandlerPipeThroughBuffer,\n isHandlerPipeThroughStream,\n isHandlerSuccess,\n isSharedRateLimitOpts,\n} from './types.js'\nimport {\n AuthVerifierInternal,\n InputVerifierInternal,\n OutputVerifierInternal,\n ParamsVerifierInternal,\n asArray,\n createLexiconInputVerifier,\n createLexiconOutputVerifier,\n createLexiconParamsVerifier,\n createSchemaInputVerifier,\n createSchemaOutputVerifier,\n createSchemaParamsVerifier,\n extractUrlNsid,\n setHeaders,\n} from './util.js'\n\nexport function createServer(lexicons?: LexiconDoc[], options?: Options) {\n return new Server(lexicons, options)\n}\n\nexport class Server {\n router: Express = express()\n routes: Router = Router()\n subscriptions = new Map<string, XrpcStreamServer>()\n lex = new Lexicons()\n options: Options\n globalRateLimiter?: HttpRateLimiter<HandlerContext>\n sharedRateLimiters?: Map<string, RateLimiterI<HandlerContext>>\n\n constructor(lexicons?: LexiconDoc[], opts: Options = {}) {\n if (lexicons) {\n this.addLexicons(lexicons)\n }\n this.router.use(this.routes)\n this.router.use(this.catchall)\n this.router.use(createErrorMiddleware(opts))\n this.router.once('mount', (app: Application) => {\n this.enableStreamingOnListen(app)\n })\n this.options = opts\n\n if (opts.rateLimits) {\n const { global, shared, creator, bypass } = opts.rateLimits\n\n if (global) {\n this.globalRateLimiter = HttpRateLimiter.from(\n global.map((options) => creator(buildRateLimiterOptions(options))),\n { bypass },\n )\n }\n\n if (shared) {\n this.sharedRateLimiters = new Map(\n shared.map((options) => [\n options.name,\n creator(buildRateLimiterOptions(options)),\n ]),\n )\n }\n }\n }\n\n listen(port: number, callback?: () => void) {\n return this.router.listen(port, callback)\n }\n\n // handlers\n // =\n\n // Routes with auth\n add<M extends l.Procedure | l.Query | l.Subscription, A extends AuthResult>(\n ns: l.Main<M>,\n config: M extends l.Procedure | l.Query\n ? LexMethodConfig<M, A> & { auth: Exclude<unknown, void> }\n : M extends l.Subscription\n ? LexSubscriptionConfig<M, A> & { auth: Exclude<unknown, void> }\n : never,\n ): void\n // Routes without auth\n add<M extends l.Procedure | l.Query | l.Subscription>(\n ns: l.Main<M>,\n config: M extends l.Procedure | l.Query\n ? LexMethodConfig<M, void> | LexMethodHandler<M, void>\n : M extends l.Subscription\n ? LexSubscriptionConfig<M, void> | LexSubscriptionHandler<M, void>\n : never,\n ): void\n add<M extends l.Procedure | l.Query | l.Subscription, A extends Auth>(\n ns: l.Main<M>,\n configOfHandler: M extends l.Procedure | l.Query\n ? LexMethodConfig<M, A> | LexMethodHandler<M, A>\n : M extends l.Subscription\n ? LexSubscriptionConfig<M, A> | LexSubscriptionHandler<M, A>\n : never,\n ): void {\n const schema = l.getMain(ns)\n const config =\n typeof configOfHandler === 'function'\n ? { handler: configOfHandler }\n : configOfHandler\n switch (schema.type) {\n case 'procedure':\n return this.addProcedureSchema(\n schema,\n config as LexMethodConfig<l.Procedure, A>,\n )\n case 'query':\n return this.addQuerySchema(\n schema,\n config as LexMethodConfig<l.Query, A>,\n )\n case 'subscription':\n return this.addSubscriptionSchema(\n schema,\n config as LexSubscriptionConfig<l.Subscription, A>,\n )\n default:\n throw new TypeError(\n // @ts-expect-error should never happen\n `Unsupported schema ${schema.nsid} of type ${schema.type}`,\n )\n }\n }\n\n protected addProcedureSchema<M extends l.Procedure, A extends Auth>(\n schema: M,\n config: LexMethodConfig<M, A>,\n ): void {\n this.routes.post(\n `/xrpc/${schema.nsid}`,\n this.createHandlerInternal<\n A,\n LexMethodParams<M>,\n LexMethodInput<M>,\n LexMethodOutput<M>\n >(\n this.createAuthVerifier(config),\n this.createSchemaParamsVerifier(schema, config.opts),\n this.createSchemaInputVerifier(schema, config.opts),\n this.createRouteRateLimiter(schema.nsid, config),\n config.handler,\n this.createSchemaOutputVerifier(schema),\n ),\n )\n }\n\n protected addQuerySchema<M extends l.Query, A extends Auth>(\n schema: M,\n config: LexMethodConfig<M, A>,\n ): void {\n this.routes.get(\n `/xrpc/${schema.nsid}`,\n this.createHandlerInternal<\n A,\n LexMethodParams<M>,\n LexMethodInput<M>,\n LexMethodOutput<M>\n >(\n this.createAuthVerifier(config),\n this.createSchemaParamsVerifier(schema, config.opts),\n this.createSchemaInputVerifier(schema, config.opts),\n this.createRouteRateLimiter(schema.nsid, config),\n config.handler,\n this.createSchemaOutputVerifier(schema),\n ),\n )\n }\n\n protected addSubscriptionSchema<\n M extends l.Subscription,\n A extends Auth = void,\n >(schema: M, config: LexSubscriptionConfig<M, A>): void {\n const { handler } = config\n const messageSchema =\n this.options.validateResponse === false ? undefined : schema.message\n\n return this.addSubscriptionInternal(\n schema.nsid,\n this.createSchemaParamsVerifier(schema),\n this.createAuthVerifier(config),\n // Wrap the handler to validate outgoing messages if a message schema\n // is available\n messageSchema\n ? async function* (ctx) {\n for await (const item of handler(ctx)) {\n if (item instanceof Frame) {\n messageSchema.validate(item.body)\n yield item\n } else {\n yield messageSchema.validate(item)\n }\n }\n }\n : handler,\n )\n }\n\n method<A extends Auth = Auth>(\n nsid: string,\n configOrFn: MethodConfigOrHandler<A>,\n ): void {\n this.addMethod(nsid, configOrFn)\n }\n\n addMethod<A extends Auth = Auth>(\n nsid: string,\n configOrFn: MethodConfigOrHandler<A>,\n ) {\n const config =\n typeof configOrFn === 'function' ? { handler: configOrFn } : configOrFn\n if (config.opts && 'paramsParseLoose' in config.opts) {\n throw new Error(\n `paramsParseLoose is not supported with method(), use add() instead`,\n )\n }\n const def = this.lex.getDef(nsid)\n if (def?.type === 'query' || def?.type === 'procedure') {\n this.addRoute(nsid, def, config)\n } else {\n throw new Error(`Lex def for ${nsid} is not a query or a procedure`)\n }\n }\n\n streamMethod<A extends Auth = Auth>(\n nsid: string,\n configOrFn: StreamConfigOrHandler<A, Params>,\n ) {\n this.addStreamMethod(nsid, configOrFn)\n }\n\n addStreamMethod<A extends Auth = Auth>(\n nsid: string,\n configOrFn: StreamConfigOrHandler<A, Params>,\n ) {\n const config =\n typeof configOrFn === 'function' ? { handler: configOrFn } : configOrFn\n const def = this.lex.getDef(nsid)\n if (def?.type === 'subscription') {\n this.addSubscription(nsid, def, config)\n } else {\n throw new Error(`Lex def for ${nsid} is not a subscription`)\n }\n }\n\n // schemas\n // =\n\n addLexicon(doc: LexiconDoc) {\n this.lex.add(doc)\n }\n\n addLexicons(docs: LexiconDoc[]) {\n for (const doc of docs) {\n this.addLexicon(doc)\n }\n }\n\n // http\n // =\n\n protected async addRoute<A extends Auth = Auth>(\n nsid: string,\n def: LexXrpcQuery | LexXrpcProcedure,\n config: MethodConfig<A>,\n ) {\n const path = `/xrpc/${nsid}`\n const handler = this.createHandler(nsid, def, config)\n\n if (def.type === 'procedure') {\n this.routes.post(path, handler)\n } else {\n this.routes.get(path, handler)\n }\n }\n\n catchall: CatchallHandler = async (req, res, next) => {\n // catchall handler only applies to XRPC routes\n if (!req.url.startsWith('/xrpc/')) return next()\n\n // Validate the NSID\n const nsid = extractUrlNsid(req.url)\n if (!nsid) {\n return next(new InvalidRequestError('invalid xrpc path'))\n }\n\n if (this.globalRateLimiter) {\n try {\n await this.globalRateLimiter.handle({\n req,\n res,\n auth: undefined,\n params: {},\n input: undefined,\n async resetRouteRateLimits() {},\n })\n } catch (err) {\n return next(err)\n }\n }\n\n // Ensure that known XRPC methods are only called with the correct HTTP\n // method.\n const def = this.lex.getDef(nsid)\n if (def) {\n const expectedMethod =\n def.type === 'procedure' ? 'POST' : def.type === 'query' ? 'GET' : null\n if (expectedMethod != null && expectedMethod !== req.method) {\n return next(\n new InvalidRequestError(\n `Incorrect HTTP method (${req.method}) expected ${expectedMethod}`,\n ),\n )\n }\n }\n\n if (this.options.catchall) {\n this.options.catchall.call(null, req, res, next)\n } else if (!def) {\n next(new MethodNotImplementedError())\n } else {\n next()\n }\n }\n\n createHandler<\n A extends Auth = Auth,\n P extends Params = Params,\n I extends Input = Input,\n O extends Output = Output,\n >(\n nsid: string,\n def: LexXrpcQuery | LexXrpcProcedure,\n cfg: MethodConfig<A, P, I, O>,\n ): RequestHandler {\n return this.createHandlerInternal<A, P, I, O>(\n this.createAuthVerifier(cfg),\n this.createLexiconParamsVerifier<P>(nsid, def),\n this.createLexiconInputVerifier<I>(nsid, def, cfg.opts),\n this.createRouteRateLimiter(nsid, cfg),\n cfg.handler,\n this.createLexiconOutputVerifier<O>(nsid, def),\n )\n }\n\n protected createHandlerInternal<\n A extends Auth,\n P extends Params,\n I extends Input,\n O extends Output,\n >(\n authVerifier: AuthVerifierInternal<MethodAuthContext<P>, A> | null,\n paramsVerifier: ParamsVerifierInternal<P>,\n inputVerifier: InputVerifierInternal<I>,\n routeLimiter: HttpRateLimiter<HandlerContext<A, P, I>> | undefined,\n handler: MethodHandler<A, P, I, O>,\n validateResOutput: null | OutputVerifierInternal<O>,\n ): RequestHandler {\n return async function (req, res, next) {\n try {\n // parse & validate params\n const params = paramsVerifier(req)\n\n // authenticate request\n const auth: A = authVerifier\n ? await authVerifier({ req, res, params })\n : (undefined as A)\n\n // parse & validate input\n const input: I = await inputVerifier(req, res)\n\n const ctx: HandlerContext<A, P, I> = {\n params,\n input,\n auth,\n req,\n res,\n resetRouteRateLimits: async () => routeLimiter?.reset(ctx),\n }\n\n // handle rate limits\n if (routeLimiter) await routeLimiter.handle(ctx)\n\n // run the handler\n const output = (await handler(ctx)) as O\n\n if (!output) {\n validateResOutput?.(output)\n res.status(200)\n res.end()\n } else if (isHandlerPipeThroughStream(output)) {\n setHeaders(res, output.headers)\n res.status(200)\n res.header('Content-Type', output.encoding)\n await pipeline(output.stream, res)\n } else if (isHandlerPipeThroughBuffer(output)) {\n setHeaders(res, output.headers)\n res.status(200)\n res.header('Content-Type', output.encoding)\n res.end(output.buffer)\n } else if (isHandlerSuccess(output)) {\n validateResOutput?.(output)\n\n res.status(200)\n setHeaders(res, output.headers)\n\n const encoding =\n output.encoding === 'json' ? 'application/json' : output.encoding\n\n res.header('Content-Type', encoding)\n\n if (output.body instanceof Readable) {\n // The \"Readable\" check comes first to avoid calling \"lexToJson\" on\n // a stream, which would be a bug.\n await pipeline(output.body, res)\n } else if (encoding === 'application/json') {\n const json = lexToJson(output.body)\n res.json(json)\n } else {\n res.send(\n Buffer.isBuffer(output.body)\n ? output.body\n : output.body instanceof Uint8Array\n ? Buffer.from(output.body)\n : output.body,\n )\n }\n } else {\n next(XRPCError.fromError(output))\n }\n } catch (err: unknown) {\n // Express will not call the next middleware (errorMiddleware in this case)\n // if the value passed to next is false-y (e.g. null, undefined, 0).\n // Hence we replace it with an InternalServerError.\n if (!err) {\n next(new InternalServerError())\n } else {\n next(err)\n }\n }\n }\n }\n\n protected async addSubscription<A extends Auth = Auth>(\n nsid: string,\n def: LexXrpcSubscription,\n cfg: StreamConfig<A, Params>,\n ) {\n this.addSubscriptionInternal(\n nsid,\n this.createLexiconParamsVerifier(nsid, def),\n this.createAuthVerifier(cfg),\n // @NOTE outgoing messages are not validated against the lexicon schema\n // (unlike the handlers for @atproto/lex based subscriptions)\n cfg.handler,\n )\n }\n\n protected addSubscriptionInternal<A extends Auth, P extends Params>(\n nsid: string,\n paramsVerifier: ParamsVerifierInternal<P>,\n authVerifier: AuthVerifierInternal<StreamAuthContext<P>, A> | null,\n handler: (ctx: StreamContext<A, P>) => AsyncIterable<unknown>,\n ) {\n this.subscriptions.set(\n nsid,\n new XrpcStreamServer({\n noServer: true,\n handler: async function* (req, signal) {\n try {\n // validate request\n const params = paramsVerifier(req)\n\n // authenticate request\n const auth = authVerifier\n ? await authVerifier({ req, params })\n : (undefined as A)\n\n // stream\n for await (const item of handler({ req, params, auth, signal })) {\n yield item instanceof Frame\n ? item\n : MessageFrame.fromLexValue(item as LexValue, nsid)\n }\n } catch (err) {\n yield ErrorFrame.fromError(err)\n }\n },\n }),\n )\n }\n\n private createAuthVerifier<C, A extends AuthResult>(cfg: {\n auth?: AuthVerifier<C, A>\n }): null | AuthVerifierInternal<C, A> {\n const { auth } = cfg\n if (!auth) return null\n\n return async (ctx) => {\n const result = await auth(ctx)\n return excludeErrorResult(result)\n }\n }\n\n private createLexiconParamsVerifier<P extends Params = Params>(\n nsid: string,\n def: LexXrpcQuery | LexXrpcProcedure | LexXrpcSubscription,\n ) {\n return createLexiconParamsVerifier<P>(nsid, def, this.lex)\n }\n\n private createLexiconInputVerifier<I extends Input = Input>(\n nsid: string,\n def: LexXrpcQuery | LexXrpcProcedure,\n opts?: RouteOptions,\n ): InputVerifierInternal<I> {\n return createLexiconInputVerifier(\n nsid,\n def,\n {\n blobLimit: opts?.blobLimit ?? this.options.payload?.blobLimit,\n jsonLimit: opts?.jsonLimit ?? this.options.payload?.jsonLimit,\n textLimit: opts?.textLimit ?? this.options.payload?.textLimit,\n },\n this.lex,\n )\n }\n\n private createLexiconOutputVerifier<O extends Output = Output>(\n nsid: string,\n def: LexXrpcQuery | LexXrpcProcedure,\n ): null | OutputVerifierInternal<O> {\n if (this.options.validateResponse === false) {\n return null\n }\n return createLexiconOutputVerifier(nsid, def, this.lex)\n }\n\n private createSchemaParamsVerifier<\n M extends l.Procedure | l.Query | l.Subscription,\n >(\n ns: l.Main<M>,\n opts?: RouteOptions,\n ): ParamsVerifierInternal<LexMethodParams<M>> {\n return createSchemaParamsVerifier<M>(ns, opts)\n }\n\n private createSchemaInputVerifier<M extends l.Procedure | l.Query>(\n ns: l.Main<M>,\n opts?: RouteOptions,\n ): InputVerifierInternal<LexMethodInput<M>> {\n return createSchemaInputVerifier<M>(ns, {\n blobLimit: opts?.blobLimit ?? this.options.payload?.blobLimit,\n jsonLimit: opts?.jsonLimit ?? this.options.payload?.jsonLimit,\n textLimit: opts?.textLimit ?? this.options.payload?.textLimit,\n })\n }\n\n private createSchemaOutputVerifier<M extends l.Procedure | l.Query>(\n ns: l.Main<M>,\n ): null | OutputVerifierInternal<LexMethodOutput<M>> {\n if (this.options.validateResponse === false) {\n return null\n }\n return createSchemaOutputVerifier<M>(ns)\n }\n\n private enableStreamingOnListen(app: Application) {\n const _listen = app.listen\n app.listen = (...args) => {\n // @ts-ignore the args spread\n const httpServer = _listen.call(app, ...args)\n httpServer.on('upgrade', (req, socket, head) => {\n const nsid = req.url ? extractUrlNsid(req.url) : undefined\n const sub = nsid ? this.subscriptions.get(nsid) : undefined\n if (!sub) return socket.destroy()\n sub.wss.handleUpgrade(req, socket, head, (ws) =>\n sub.wss.emit('connection', ws, req),\n )\n })\n return httpServer\n }\n }\n\n private createRouteRateLimiter<\n A extends Auth,\n P extends Params,\n I extends Input,\n O extends Output,\n >(\n nsid: string,\n config: MethodConfig<A, P, I, O>,\n ): HttpRateLimiter<HandlerContext<A, P, I>> | undefined {\n // @NOTE global & shared rate limiters are instantiated with a context of\n // HandlerContext which is compatible (more generic) with the context of\n // this route specific rate limiters (C). For this reason, it's safe to cast\n // the context of the global rate limiter to the context of the route\n // specific rate limiter (HandlerContext<A, P, I>).\n\n const globalRateLimiter = this.globalRateLimiter as\n | HttpRateLimiter<HandlerContext<A, P, I>>\n | undefined\n\n // No route specific rate limiting configured, use the global rate limiter.\n if (!config.rateLimit) return globalRateLimiter\n\n const { rateLimits } = this.options\n\n // @NOTE Silently ignore creation of route specific rate limiter if the\n // `rateLimits` options was not provided to the constructor.\n if (!rateLimits) return globalRateLimiter\n\n const { creator, bypass } = rateLimits\n\n const rateLimiters = asArray(config.rateLimit).map((options, i) => {\n if (isSharedRateLimitOpts(options)) {\n const rateLimiter = this.sharedRateLimiters?.get(options.name) as\n | RateLimiterI<HandlerContext<A, P, I>>\n | undefined\n\n // The route config references a shared rate limiter that does not\n // exist. This is a configuration error.\n assert(rateLimiter, `Shared rate limiter \"${options.name}\" not defined`)\n\n return WrappedRateLimiter.from<HandlerContext<A, P, I>>(\n rateLimiter,\n options,\n )\n } else {\n return creator({\n ...options,\n calcKey: options.calcKey ?? defaultKey,\n calcPoints: options.calcPoints ?? defaultPoints,\n keyPrefix: `${nsid}-${i}`,\n })\n }\n })\n\n // If the route config contains an empty array, use global rate limiter.\n if (!rateLimiters.length) return globalRateLimiter\n\n // The global rate limiter (if present) should be applied in addition to\n // the route specific rate limiters.\n if (globalRateLimiter) rateLimiters.push(globalRateLimiter)\n\n return HttpRateLimiter.from<HandlerContext<A, P, I>>(rateLimiters, {\n bypass,\n })\n }\n}\n\nfunction createErrorMiddleware({\n errorParser = (err) => XRPCError.fromError(err),\n}: Options): ErrorRequestHandler {\n return (err, req, res, next) => {\n const nsid = extractUrlNsid(req.originalUrl)\n const xrpcError = errorParser(err)\n\n // Use the request's logger (if available) to benefit from request context\n // (id, timing) and logging configuration (serialization, etc.).\n const logger = isPinoHttpRequest(req) ? req.log : log\n\n const isInternalError = xrpcError instanceof InternalServerError\n\n const msgPrefix = isInternalError ? 'unhandled exception' : 'error'\n const msgSuffix = nsid ? `xrpc method ${nsid}` : `${req.method} ${req.url}`\n const msg = `${msgPrefix} in ${msgSuffix}`\n\n logger.error(\n {\n // @NOTE Computation of error stack is an expensive operation, so\n // we strip it for expected errors.\n err:\n isInternalError || process.env.NODE_ENV === 'development'\n ? err\n : toSimplifiedErrorLike(err),\n\n // XRPC specific properties, for easier browsing of logs\n nsid,\n type: xrpcError.type,\n status: xrpcError.statusCode,\n payload: xrpcError.payload,\n\n // Ensure that the logged item's name is set to LOGGER_NAME, instead of\n // the name of the pino-http logger, to ensure consistency across logs.\n name: LOGGER_NAME,\n },\n msg,\n )\n\n if (res.headersSent) {\n return next(err)\n }\n\n return res.status(xrpcError.statusCode).json(xrpcError.payload)\n }\n}\n\nfunction isPinoHttpRequest(req: IncomingMessage): req is IncomingMessage & {\n log: { error: (obj: unknown, msg: string) => void }\n} {\n return typeof (req as { log?: any }).log?.error === 'function'\n}\n\nfunction toSimplifiedErrorLike(err: unknown): unknown {\n if (err instanceof Error) {\n // Transform into an \"ErrorLike\" for pino's std \"err\" serializer\n return {\n ...err,\n // Carry over non-enumerable properties\n message: err.message,\n name:\n !Object.hasOwn(err, 'name') &&\n Object.prototype.toString.call(err.constructor) === '[object Function]'\n ? err.constructor.name // extract the class name for sub-classes of Error\n : err.name,\n // @NOTE Error.stack, Error.cause and AggregateError.error are non\n // enumerable properties so they won't be spread to the ErrorLike\n }\n }\n\n return err\n}\n\nfunction buildRateLimiterOptions<C extends HandlerContext = HandlerContext>({\n name,\n calcKey = defaultKey,\n calcPoints = defaultPoints,\n failClosed = false,\n durationMs,\n points,\n}: ServerRateLimitDescription<C>): RateLimiterOptions<C> {\n return {\n durationMs,\n points,\n calcKey,\n calcPoints,\n keyPrefix: `rl-${name}`,\n onError: failClosed\n ? undefined // Let the error propagate\n : rateLimiterLoggerErrorHandler,\n }\n}\n\nconst defaultPoints: CalcPointsFn = () => 1\n\n/**\n * @note when using a proxy, ensure headers are getting forwarded correctly:\n * `app.set('trust proxy', true)`\n *\n * @see {@link https://expressjs.com/en/guide/behind-proxies.html}\n */\nconst defaultKey: CalcKeyFn<HandlerContext> = ({ req }) => req.ip\n\nasync function rateLimiterLoggerErrorHandler(\n err: unknown,\n ctx: HandlerContext,\n { limiter: { keyPrefix, points, duration } }: RateLimiterErrorHandlerDetails,\n): Promise<null> {\n const { req } = ctx\n const logger = isPinoHttpRequest(req) ? req.log : log\n\n logger.error(\n { err, keyPrefix, points, duration },\n 'rate limiter failed to consume points',\n )\n\n return null\n}\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { IncomingMessage } from 'node:http'\nimport { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport express, {\n Application,\n ErrorRequestHandler,\n Express,\n RequestHandler,\n Router,\n} from 'express'\nimport { LexValue } from '@atproto/lex-data'\nimport { l } from '@atproto/lex-schema'\nimport {\n LexXrpcProcedure,\n LexXrpcQuery,\n LexXrpcSubscription,\n LexiconDoc,\n Lexicons,\n lexToJson,\n} from '@atproto/lexicon'\nimport {\n InternalServerError,\n InvalidRequestError,\n MethodNotImplementedError,\n XRPCError,\n excludeErrorResult,\n} from './errors.js'\nimport log, { LOGGER_NAME } from './logger.js'\nimport { HttpRateLimiter } from './rate-limiter-http.js'\nimport {\n CalcKeyFn,\n CalcPointsFn,\n RateLimiterErrorHandlerDetails,\n RateLimiterI,\n RateLimiterOptions,\n WrappedRateLimiter,\n} from './rate-limiter.js'\nimport {\n ErrorFrame,\n Frame,\n MessageFrame,\n XrpcStreamServer,\n} from './stream/index.js'\nimport {\n Auth,\n AuthResult,\n AuthVerifier,\n CatchallHandler,\n HandlerContext,\n Input,\n LexMethodConfig,\n LexMethodHandler,\n LexMethodInput,\n LexMethodOutput,\n LexMethodParams,\n LexSubscriptionConfig,\n LexSubscriptionHandler,\n MethodAuthContext,\n MethodConfig,\n MethodConfigOrHandler,\n MethodHandler,\n Options,\n Output,\n Params,\n RouteOptions,\n ServerRateLimitDescription,\n StreamAuthContext,\n StreamConfig,\n StreamConfigOrHandler,\n StreamContext,\n isHandlerPipeThroughBuffer,\n isHandlerPipeThroughStream,\n isHandlerSuccess,\n isSharedRateLimitOpts,\n} from './types.js'\nimport {\n AuthVerifierInternal,\n InputVerifierInternal,\n OutputVerifierInternal,\n ParamsVerifierInternal,\n asArray,\n createLexiconInputVerifier,\n createLexiconOutputVerifier,\n createLexiconParamsVerifier,\n createSchemaInputVerifier,\n createSchemaOutputVerifier,\n createSchemaParamsVerifier,\n extractUrlNsid,\n setHeaders,\n} from './util.js'\n\nexport function createServer(lexicons?: LexiconDoc[], options?: Options) {\n return new Server(lexicons, options)\n}\n\nexport class Server {\n router: Express = express()\n routes: Router = Router()\n subscriptions = new Map<string, XrpcStreamServer>()\n lex = new Lexicons()\n options: Options\n globalRateLimiter?: HttpRateLimiter<HandlerContext>\n sharedRateLimiters?: Map<string, RateLimiterI<HandlerContext>>\n\n constructor(lexicons?: LexiconDoc[], opts: Options = {}) {\n if (lexicons) {\n this.addLexicons(lexicons)\n }\n this.router.use(this.routes)\n this.router.use(this.catchall)\n this.router.use(createErrorMiddleware(opts))\n this.router.once('mount', (app: Application) => {\n this.enableStreamingOnListen(app)\n })\n this.options = opts\n\n if (opts.rateLimits) {\n const { global, shared, creator, bypass } = opts.rateLimits\n\n if (global) {\n this.globalRateLimiter = HttpRateLimiter.from(\n global.map((options) => creator(buildRateLimiterOptions(options))),\n { bypass },\n )\n }\n\n if (shared) {\n this.sharedRateLimiters = new Map(\n shared.map((options) => [\n options.name,\n creator(buildRateLimiterOptions(options)),\n ]),\n )\n }\n }\n }\n\n listen(port: number, callback?: () => void) {\n return this.router.listen(port, callback)\n }\n\n // handlers\n // =\n\n // Routes with auth\n add<M extends l.Procedure | l.Query | l.Subscription, A extends AuthResult>(\n ns: l.Main<M>,\n config: M extends l.Procedure | l.Query\n ? LexMethodConfig<M, A> & { auth: Exclude<unknown, void> }\n : M extends l.Subscription\n ? LexSubscriptionConfig<M, A> & { auth: Exclude<unknown, void> }\n : never,\n ): void\n // Routes without auth\n add<M extends l.Procedure | l.Query | l.Subscription>(\n ns: l.Main<M>,\n config: M extends l.Procedure | l.Query\n ? LexMethodConfig<M, void> | LexMethodHandler<M, void>\n : M extends l.Subscription\n ? LexSubscriptionConfig<M, void> | LexSubscriptionHandler<M, void>\n : never,\n ): void\n add<M extends l.Procedure | l.Query | l.Subscription, A extends Auth>(\n ns: l.Main<M>,\n configOfHandler: M extends l.Procedure | l.Query\n ? LexMethodConfig<M, A> | LexMethodHandler<M, A>\n : M extends l.Subscription\n ? LexSubscriptionConfig<M, A> | LexSubscriptionHandler<M, A>\n : never,\n ): void {\n const schema = l.getMain(ns)\n const config =\n typeof configOfHandler === 'function'\n ? { handler: configOfHandler }\n : configOfHandler\n switch (schema.type) {\n case 'procedure':\n return this.addProcedureSchema(\n schema,\n config as LexMethodConfig<l.Procedure, A>,\n )\n case 'query':\n return this.addQuerySchema(\n schema,\n config as LexMethodConfig<l.Query, A>,\n )\n case 'subscription':\n return this.addSubscriptionSchema(\n schema,\n config as LexSubscriptionConfig<l.Subscription, A>,\n )\n default:\n throw new TypeError(\n // @ts-expect-error should never happen\n `Unsupported schema ${schema.nsid} of type ${schema.type}`,\n )\n }\n }\n\n protected addProcedureSchema<M extends l.Procedure, A extends Auth>(\n schema: M,\n config: LexMethodConfig<M, A>,\n ): void {\n this.routes.post(\n `/xrpc/${schema.nsid}`,\n this.createHandlerInternal<\n A,\n LexMethodParams<M>,\n LexMethodInput<M>,\n LexMethodOutput<M>\n >(\n this.createAuthVerifier(config),\n this.createSchemaParamsVerifier(schema, config.opts),\n this.createSchemaInputVerifier(schema, config.opts),\n this.createRouteRateLimiter(schema.nsid, config),\n config.handler,\n this.createSchemaOutputVerifier(schema),\n ),\n )\n }\n\n protected addQuerySchema<M extends l.Query, A extends Auth>(\n schema: M,\n config: LexMethodConfig<M, A>,\n ): void {\n this.routes.get(\n `/xrpc/${schema.nsid}`,\n this.createHandlerInternal<\n A,\n LexMethodParams<M>,\n LexMethodInput<M>,\n LexMethodOutput<M>\n >(\n this.createAuthVerifier(config),\n this.createSchemaParamsVerifier(schema, config.opts),\n this.createSchemaInputVerifier(schema, config.opts),\n this.createRouteRateLimiter(schema.nsid, config),\n config.handler,\n this.createSchemaOutputVerifier(schema),\n ),\n )\n }\n\n protected addSubscriptionSchema<\n M extends l.Subscription,\n A extends Auth = void,\n >(schema: M, config: LexSubscriptionConfig<M, A>): void {\n const { handler } = config\n const messageSchema =\n this.options.validateResponse === false ? undefined : schema.message\n\n return this.addSubscriptionInternal(\n schema.nsid,\n this.createSchemaParamsVerifier(schema),\n this.createAuthVerifier(config),\n // Wrap the handler to validate outgoing messages if a message schema\n // is available\n messageSchema\n ? async function* (ctx) {\n for await (const item of handler(ctx)) {\n if (item instanceof Frame) {\n messageSchema.validate(item.body)\n yield item\n } else {\n yield messageSchema.validate(item)\n }\n }\n }\n : handler,\n )\n }\n\n method<A extends Auth = Auth>(\n nsid: string,\n configOrFn: MethodConfigOrHandler<A>,\n ): void {\n this.addMethod(nsid, configOrFn)\n }\n\n addMethod<A extends Auth = Auth>(\n nsid: string,\n configOrFn: MethodConfigOrHandler<A>,\n ) {\n const config =\n typeof configOrFn === 'function' ? { handler: configOrFn } : configOrFn\n if (config.opts && 'paramsParseLoose' in config.opts) {\n throw new Error(\n `paramsParseLoose is not supported with method(), use add() instead`,\n )\n }\n const def = this.lex.getDef(nsid)\n if (def?.type === 'query' || def?.type === 'procedure') {\n this.addRoute(nsid, def, config)\n } else {\n throw new Error(`Lex def for ${nsid} is not a query or a procedure`)\n }\n }\n\n streamMethod<A extends Auth = Auth>(\n nsid: string,\n configOrFn: StreamConfigOrHandler<A, Params>,\n ) {\n this.addStreamMethod(nsid, configOrFn)\n }\n\n addStreamMethod<A extends Auth = Auth>(\n nsid: string,\n configOrFn: StreamConfigOrHandler<A, Params>,\n ) {\n const config =\n typeof configOrFn === 'function' ? { handler: configOrFn } : configOrFn\n const def = this.lex.getDef(nsid)\n if (def?.type === 'subscription') {\n this.addSubscription(nsid, def, config)\n } else {\n throw new Error(`Lex def for ${nsid} is not a subscription`)\n }\n }\n\n // schemas\n // =\n\n addLexicon(doc: LexiconDoc) {\n this.lex.add(doc)\n }\n\n addLexicons(docs: LexiconDoc[]) {\n for (const doc of docs) {\n this.addLexicon(doc)\n }\n }\n\n // http\n // =\n\n protected async addRoute<A extends Auth = Auth>(\n nsid: string,\n def: LexXrpcQuery | LexXrpcProcedure,\n config: MethodConfig<A>,\n ) {\n const path = `/xrpc/${nsid}`\n const handler = this.createHandler(nsid, def, config)\n\n if (def.type === 'procedure') {\n this.routes.post(path, handler)\n } else {\n this.routes.get(path, handler)\n }\n }\n\n catchall: CatchallHandler = async (req, res, next) => {\n // catchall handler only applies to XRPC routes\n if (!req.url.startsWith('/xrpc/')) return next()\n\n // Validate the NSID\n const nsid = extractUrlNsid(req.url)\n if (!nsid) {\n return next(new InvalidRequestError('invalid xrpc path'))\n }\n\n if (this.globalRateLimiter) {\n try {\n await this.globalRateLimiter.handle({\n req,\n res,\n auth: undefined,\n params: {},\n input: undefined,\n async resetRouteRateLimits() {},\n })\n } catch (err) {\n return next(err)\n }\n }\n\n // Ensure that known XRPC methods are only called with the correct HTTP\n // method.\n const def = this.lex.getDef(nsid)\n if (def) {\n const expectedMethod =\n def.type === 'procedure' ? 'POST' : def.type === 'query' ? 'GET' : null\n if (expectedMethod != null && expectedMethod !== req.method) {\n return next(\n new InvalidRequestError(\n `Incorrect HTTP method (${req.method}) expected ${expectedMethod}`,\n ),\n )\n }\n }\n\n if (this.options.catchall) {\n this.options.catchall.call(null, req, res, next)\n } else if (!def) {\n next(new MethodNotImplementedError())\n } else {\n next()\n }\n }\n\n createHandler<\n A extends Auth = Auth,\n P extends Params = Params,\n I extends Input = Input,\n O extends Output = Output,\n >(\n nsid: string,\n def: LexXrpcQuery | LexXrpcProcedure,\n cfg: MethodConfig<A, P, I, O>,\n ): RequestHandler {\n return this.createHandlerInternal<A, P, I, O>(\n this.createAuthVerifier(cfg),\n this.createLexiconParamsVerifier<P>(nsid, def),\n this.createLexiconInputVerifier<I>(nsid, def, cfg.opts),\n this.createRouteRateLimiter(nsid, cfg),\n cfg.handler,\n this.createLexiconOutputVerifier<O>(nsid, def),\n )\n }\n\n protected createHandlerInternal<\n A extends Auth,\n P extends Params,\n I extends Input,\n O extends Output,\n >(\n authVerifier: AuthVerifierInternal<MethodAuthContext<P>, A> | null,\n paramsVerifier: ParamsVerifierInternal<P>,\n inputVerifier: InputVerifierInternal<I>,\n routeLimiter: HttpRateLimiter<HandlerContext<A, P, I>> | undefined,\n handler: MethodHandler<A, P, I, O>,\n validateResOutput: null | OutputVerifierInternal<O>,\n ): RequestHandler {\n return async function (req, res, next) {\n try {\n // parse & validate params\n const params = paramsVerifier(req)\n\n // authenticate request\n const auth: A = authVerifier\n ? await authVerifier({ req, res, params })\n : (undefined as A)\n\n // parse & validate input\n const input: I = await inputVerifier(req, res)\n\n const ctx: HandlerContext<A, P, I> = {\n params,\n input,\n auth,\n req,\n res,\n resetRouteRateLimits: async () => routeLimiter?.reset(ctx),\n }\n\n // handle rate limits\n if (routeLimiter) await routeLimiter.handle(ctx)\n\n // run the handler\n const output = (await handler(ctx)) as O\n\n if (!output) {\n validateResOutput?.(output)\n res.status(200)\n res.end()\n } else if (isHandlerPipeThroughStream(output)) {\n setHeaders(res, output.headers)\n res.status(200)\n res.header('Content-Type', output.encoding)\n await pipeline(output.stream, res)\n } else if (isHandlerPipeThroughBuffer(output)) {\n setHeaders(res, output.headers)\n res.status(200)\n res.header('Content-Type', output.encoding)\n res.end(output.buffer)\n } else if (isHandlerSuccess(output)) {\n validateResOutput?.(output)\n\n res.status(200)\n setHeaders(res, output.headers)\n\n const encoding =\n output.encoding === 'json' ? 'application/json' : output.encoding\n\n res.header('Content-Type', encoding)\n\n if (output.body instanceof Readable) {\n // The \"Readable\" check comes first to avoid calling \"lexToJson\" on\n // a stream, which would be a bug.\n await pipeline(output.body, res)\n } else if (encoding === 'application/json') {\n const json = lexToJson(output.body)\n res.json(json)\n } else {\n res.send(\n Buffer.isBuffer(output.body)\n ? output.body\n : output.body instanceof Uint8Array\n ? Buffer.from(output.body)\n : output.body,\n )\n }\n } else {\n next(XRPCError.fromError(output))\n }\n } catch (err: unknown) {\n // Express will not call the next middleware (errorMiddleware in this case)\n // if the value passed to next is false-y (e.g. null, undefined, 0).\n // Hence we replace it with an InternalServerError.\n if (!err) {\n next(new InternalServerError())\n } else {\n next(err)\n }\n }\n }\n }\n\n protected async addSubscription<A extends Auth = Auth>(\n nsid: string,\n def: LexXrpcSubscription,\n cfg: StreamConfig<A, Params>,\n ) {\n this.addSubscriptionInternal(\n nsid,\n this.createLexiconParamsVerifier(nsid, def),\n this.createAuthVerifier(cfg),\n // @NOTE outgoing messages are not validated against the lexicon schema\n // (unlike the handlers for @atproto/lex based subscriptions)\n cfg.handler,\n )\n }\n\n protected addSubscriptionInternal<A extends Auth, P extends Params>(\n nsid: string,\n paramsVerifier: ParamsVerifierInternal<P>,\n authVerifier: AuthVerifierInternal<StreamAuthContext<P>, A> | null,\n handler: (ctx: StreamContext<A, P>) => AsyncIterable<unknown>,\n ) {\n this.subscriptions.set(\n nsid,\n new XrpcStreamServer({\n noServer: true,\n handler: async function* (req, signal) {\n try {\n // validate request\n const params = paramsVerifier(req)\n\n // authenticate request\n const auth = authVerifier\n ? await authVerifier({ req, params })\n : (undefined as A)\n\n // stream\n for await (const item of handler({ req, params, auth, signal })) {\n yield item instanceof Frame\n ? item\n : MessageFrame.fromLexValue(item as LexValue, nsid)\n }\n } catch (err) {\n yield ErrorFrame.fromError(err)\n }\n },\n }),\n )\n }\n\n private createAuthVerifier<C, A extends AuthResult>(cfg: {\n auth?: AuthVerifier<C, A>\n }): null | AuthVerifierInternal<C, A> {\n const { auth } = cfg\n if (!auth) return null\n\n return async (ctx) => {\n const result = await auth(ctx)\n return excludeErrorResult(result)\n }\n }\n\n private createLexiconParamsVerifier<P extends Params = Params>(\n nsid: string,\n def: LexXrpcQuery | LexXrpcProcedure | LexXrpcSubscription,\n ) {\n return createLexiconParamsVerifier<P>(nsid, def, this.lex)\n }\n\n private createLexiconInputVerifier<I extends Input = Input>(\n nsid: string,\n def: LexXrpcQuery | LexXrpcProcedure,\n opts?: RouteOptions,\n ): InputVerifierInternal<I> {\n return createLexiconInputVerifier(\n nsid,\n def,\n {\n blobLimit: opts?.blobLimit ?? this.options.payload?.blobLimit,\n jsonLimit: opts?.jsonLimit ?? this.options.payload?.jsonLimit,\n textLimit: opts?.textLimit ?? this.options.payload?.textLimit,\n },\n this.lex,\n )\n }\n\n private createLexiconOutputVerifier<O extends Output = Output>(\n nsid: string,\n def: LexXrpcQuery | LexXrpcProcedure,\n ): null | OutputVerifierInternal<O> {\n if (this.options.validateResponse === false) {\n return null\n }\n return createLexiconOutputVerifier(nsid, def, this.lex)\n }\n\n private createSchemaParamsVerifier<\n M extends l.Procedure | l.Query | l.Subscription,\n >(\n ns: l.Main<M>,\n opts?: RouteOptions,\n ): ParamsVerifierInternal<LexMethodParams<M>> {\n return createSchemaParamsVerifier<M>(ns, opts)\n }\n\n private createSchemaInputVerifier<M extends l.Procedure | l.Query>(\n ns: l.Main<M>,\n opts?: RouteOptions,\n ): InputVerifierInternal<LexMethodInput<M>> {\n return createSchemaInputVerifier<M>(ns, {\n blobLimit: opts?.blobLimit ?? this.options.payload?.blobLimit,\n jsonLimit: opts?.jsonLimit ?? this.options.payload?.jsonLimit,\n textLimit: opts?.textLimit ?? this.options.payload?.textLimit,\n })\n }\n\n private createSchemaOutputVerifier<M extends l.Procedure | l.Query>(\n ns: l.Main<M>,\n ): null | OutputVerifierInternal<LexMethodOutput<M>> {\n if (this.options.validateResponse === false) {\n return null\n }\n return createSchemaOutputVerifier<M>(ns)\n }\n\n private enableStreamingOnListen(app: Application) {\n const _listen = app.listen\n app.listen = (...args) => {\n // @ts-ignore the args spread\n const httpServer = _listen.call(app, ...args)\n httpServer.on('upgrade', (req, socket, head) => {\n const nsid = req.url ? extractUrlNsid(req.url) : undefined\n const sub = nsid ? this.subscriptions.get(nsid) : undefined\n if (!sub) return socket.destroy()\n sub.wss.handleUpgrade(req, socket, head, (ws) =>\n sub.wss.emit('connection', ws, req),\n )\n })\n return httpServer\n }\n }\n\n private createRouteRateLimiter<\n A extends Auth,\n P extends Params,\n I extends Input,\n O extends Output,\n >(\n nsid: string,\n config: MethodConfig<A, P, I, O>,\n ): HttpRateLimiter<HandlerContext<A, P, I>> | undefined {\n // @NOTE global & shared rate limiters are instantiated with a context of\n // HandlerContext which is compatible (more generic) with the context of\n // this route specific rate limiters (C). For this reason, it's safe to cast\n // the context of the global rate limiter to the context of the route\n // specific rate limiter (HandlerContext<A, P, I>).\n\n const globalRateLimiter = this.globalRateLimiter as\n | HttpRateLimiter<HandlerContext<A, P, I>>\n | undefined\n\n // No route specific rate limiting configured, use the global rate limiter.\n if (!config.rateLimit) return globalRateLimiter\n\n const { rateLimits } = this.options\n\n // @NOTE Silently ignore creation of route specific rate limiter if the\n // `rateLimits` options was not provided to the constructor.\n if (!rateLimits) return globalRateLimiter\n\n const { creator, bypass } = rateLimits\n\n const rateLimiters = asArray(config.rateLimit).map((options, i) => {\n if (isSharedRateLimitOpts(options)) {\n const rateLimiter = this.sharedRateLimiters?.get(options.name) as\n | RateLimiterI<HandlerContext<A, P, I>>\n | undefined\n\n // The route config references a shared rate limiter that does not\n // exist. This is a configuration error.\n assert(rateLimiter, `Shared rate limiter \"${options.name}\" not defined`)\n\n return WrappedRateLimiter.from<HandlerContext<A, P, I>>(\n rateLimiter,\n options,\n )\n } else {\n return creator({\n ...options,\n calcKey: options.calcKey ?? defaultKey,\n calcPoints: options.calcPoints ?? defaultPoints,\n keyPrefix: `${nsid}-${i}`,\n })\n }\n })\n\n // If the route config contains an empty array, use global rate limiter.\n if (!rateLimiters.length) return globalRateLimiter\n\n // The global rate limiter (if present) should be applied in addition to\n // the route specific rate limiters.\n if (globalRateLimiter) rateLimiters.push(globalRateLimiter)\n\n return HttpRateLimiter.from<HandlerContext<A, P, I>>(rateLimiters, {\n bypass,\n })\n }\n}\n\nfunction createErrorMiddleware({\n errorParser = (err) => XRPCError.fromError(err),\n}: Options): ErrorRequestHandler {\n return (err, req, res, next) => {\n const nsid = extractUrlNsid(req.originalUrl)\n const xrpcError = errorParser(err)\n\n // Use the request's logger (if available) to benefit from request context\n // (id, timing) and logging configuration (serialization, etc.).\n const logger = isPinoHttpRequest(req) ? req.log : log\n\n const isInternalError = xrpcError instanceof InternalServerError\n\n const msgPrefix = isInternalError ? 'unhandled exception' : 'error'\n const msgSuffix = nsid ? `xrpc method ${nsid}` : `${req.method} ${req.url}`\n const msg = `${msgPrefix} in ${msgSuffix}`\n\n logger.error(\n {\n // @NOTE Computation of error stack is an expensive operation, so\n // we strip it for expected errors.\n err:\n isInternalError || process.env.NODE_ENV === 'development'\n ? err\n : toSimplifiedErrorLike(err),\n\n // XRPC specific properties, for easier browsing of logs\n nsid,\n type: xrpcError.type,\n status: xrpcError.statusCode,\n payload: xrpcError.payload,\n\n // Ensure that the logged item's name is set to LOGGER_NAME, instead of\n // the name of the pino-http logger, to ensure consistency across logs.\n name: LOGGER_NAME,\n },\n msg,\n )\n\n if (res.headersSent) {\n return next(err)\n }\n\n return res.status(xrpcError.statusCode).json(xrpcError.payload)\n }\n}\n\nfunction isPinoHttpRequest(req: IncomingMessage): req is IncomingMessage & {\n log: { error: (obj: unknown, msg: string) => void }\n} {\n return typeof (req as { log?: any }).log?.error === 'function'\n}\n\nfunction toSimplifiedErrorLike(err: unknown): unknown {\n if (err instanceof Error) {\n // Transform into an \"ErrorLike\" for pino's std \"err\" serializer\n return {\n ...err,\n // Carry over non-enumerable properties\n message: err.message,\n name:\n !Object.hasOwn(err, 'name') &&\n Object.prototype.toString.call(err.constructor) === '[object Function]'\n ? err.constructor.name // extract the class name for sub-classes of Error\n : err.name,\n // @NOTE Error.stack, Error.cause and AggregateError.error are non\n // enumerable properties so they won't be spread to the ErrorLike\n }\n }\n\n return err\n}\n\nfunction buildRateLimiterOptions<C extends HandlerContext = HandlerContext>({\n name,\n calcKey = defaultKey,\n calcPoints = defaultPoints,\n failClosed = false,\n durationMs,\n points,\n}: ServerRateLimitDescription<C>): RateLimiterOptions<C> {\n return {\n durationMs,\n points,\n calcKey,\n calcPoints,\n keyPrefix: `rl-${name}`,\n onError: failClosed\n ? undefined // Let the error propagate\n : rateLimiterLoggerErrorHandler,\n }\n}\n\nconst defaultPoints: CalcPointsFn = () => 1\n\n/**\n * @note when using a proxy, ensure headers are getting forwarded correctly:\n * `app.set('trust proxy', true)`\n *\n * @see {@link https://expressjs.com/en/guide/behind-proxies.html}\n */\nconst defaultKey: CalcKeyFn<HandlerContext> = ({ req }) => req.ip\n\nasync function rateLimiterLoggerErrorHandler(\n err: unknown,\n ctx: HandlerContext,\n { limiter: { keyPrefix, points, duration } }: RateLimiterErrorHandlerDetails,\n): Promise<null> {\n const { req } = ctx\n const logger = isPinoHttpRequest(req) ? req.log : log\n\n logger.error(\n { err, keyPrefix, points, duration },\n 'rate limiter failed to consume points',\n )\n\n return null\n}\n"]}
@@ -7,7 +7,7 @@ export declare abstract class Frame<T extends LexValue = LexValue> {
7
7
  toBytes(): Uint8Array;
8
8
  isMessage(): this is MessageFrame;
9
9
  isError(): this is ErrorFrame;
10
- static fromBytes(bytes: Uint8Array): MessageFrame<LexValue> | ErrorFrame<string>;
10
+ static fromBytes(bytes: Uint8Array): ErrorFrame<string> | MessageFrame<LexValue>;
11
11
  }
12
12
  export declare class MessageFrame<T extends LexValue = LexValue> extends Frame<T> {
13
13
  header: MessageFrameHeader;
@@ -16,9 +16,9 @@ export declare class MessageFrame<T extends LexValue = LexValue> extends Frame<T
16
16
  type?: string;
17
17
  });
18
18
  get type(): string | undefined;
19
- static fromLexValue(data: LexValue, nsid: string): MessageFrame<import("@atproto/lex-data").LexScalar | LexValue[]> | MessageFrame<{
19
+ static fromLexValue(data: LexValue, nsid: string): MessageFrame<{
20
20
  [x: string]: LexValue | undefined;
21
- }>;
21
+ }> | MessageFrame<LexValue[] | import("@atproto/lex-data").LexScalar>;
22
22
  }
23
23
  export declare class ErrorFrame<T extends string = string> extends Frame<ErrorFrameBody<T>> {
24
24
  header: ErrorFrameHeader;
@@ -1 +1 @@
1
- {"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../src/stream/frames.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAiB,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,kBAAkB,EAGnB,MAAM,YAAY,CAAA;AAEnB,8BAAsB,KAAK,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IACvD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAEhB,IAAI,EAAE,IAAI,SAAS,CAElB;IACD,OAAO,IAAI,UAAU;IAGrB,SAAS,IAAI,IAAI,IAAI,YAAY;IAGjC,OAAO,IAAI,IAAI,IAAI,UAAU;IAG7B,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU;CA8BnC;AAED,qBAAa,YAAY,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IACvE,MAAM,EAAE,kBAAkB,CAAA;IAC1B,IAAI,EAAE,CAAC,CAAA;gBAEK,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;IAQ7C,IAAI,IAAI,uBAEP;IAED,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM;;;CAsBjD;AAED,qBAAa,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,KAAK,CAC9D,cAAc,CAAC,CAAC,CAAC,CAClB;IACC,MAAM,EAAE,gBAAgB,CAAA;IACxB,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;gBAEX,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IAKnC,IAAI,IAAI,MAEP;IACD,IAAI,OAAO,uBAEV;IAED,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU;CAK3C"}
1
+ {"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../src/stream/frames.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAiB,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,kBAAkB,EAGnB,MAAM,YAAY,CAAA;AAEnB,8BAAsB,KAAK,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IACvD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAEhB,IAAI,EAAE,IAAI,SAAS,CAElB;IACD,OAAO,IAAI,UAAU,CAEpB;IACD,SAAS,IAAI,IAAI,IAAI,YAAY,CAEhC;IACD,OAAO,IAAI,IAAI,IAAI,UAAU,CAE5B;IACD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,+CA6BjC;CACF;AAED,qBAAa,YAAY,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IACvE,MAAM,EAAE,kBAAkB,CAAA;IAC1B,IAAI,EAAE,CAAC,CAAA;IAEP,YAAY,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAO5C;IACD,IAAI,IAAI,uBAEP;IAED,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM;;0EAqB/C;CACF;AAED,qBAAa,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,KAAK,CAC9D,cAAc,CAAC,CAAC,CAAC,CAClB;IACC,MAAM,EAAE,gBAAgB,CAAA;IACxB,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;IAEvB,YAAY,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAIlC;IACD,IAAI,IAAI,MAEP;IACD,IAAI,OAAO,uBAEV;IAED,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAIzC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/stream/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,eAAO,MAAM,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CACtB,CAAA;AAEhC,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/stream/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,eAAO,MAAM,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CACtB,CAAA;eAEjB,MAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/stream/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,IAAI,CAAA;AAE/C,OAAO,EAAc,KAAK,EAAE,MAAM,aAAa,CAAA;AAG/C,qBAAa,gBAAgB;IAC3B,GAAG,EAAE,eAAe,CAAA;gBACR,IAAI,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE;CAqCvD;AAED,MAAM,MAAM,OAAO,GAAG,CACpB,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,KACrB,aAAa,CAAC,KAAK,CAAC,CAAA"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/stream/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,IAAI,CAAA;AAE/C,OAAO,EAAc,KAAK,EAAE,MAAM,aAAa,CAAA;AAG/C,qBAAa,gBAAgB;IAC3B,GAAG,EAAE,eAAe,CAAA;IACpB,YAAY,IAAI,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,EAoCrD;CACF;AAED,MAAM,MAAM,OAAO,GAAG,CACpB,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,KACrB,aAAa,CAAC,KAAK,CAAC,CAAA"}
@@ -2,7 +2,7 @@ import { DuplexOptions } from 'node:stream';
2
2
  import { WebSocket } from 'ws';
3
3
  import { MessageFrame } from './frames.js';
4
4
  export declare function streamByteChunks(ws: WebSocket, options?: DuplexOptions): import("stream").Duplex;
5
- export declare function byFrame(ws: WebSocket, options?: DuplexOptions): AsyncGenerator<MessageFrame<import("@atproto/lex-data").LexValue> | import("./frames.js").ErrorFrame<string>, void, unknown>;
5
+ export declare function byFrame(ws: WebSocket, options?: DuplexOptions): AsyncGenerator<import("./frames.js").ErrorFrame<string> | MessageFrame<import("@atproto/lex-data").LexValue>, void, unknown>;
6
6
  export declare function byMessage(ws: WebSocket, options?: DuplexOptions): AsyncGenerator<MessageFrame<import("@atproto/lex-data").LexValue>, void, unknown>;
7
7
  export declare function ensureChunkIsMessage(chunk: Uint8Array): MessageFrame;
8
8
  //# sourceMappingURL=stream.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/stream/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAKvC,qBAAa,YAAY,CAAC,CAAC,GAAG,OAAO;IAE1B,IAAI,EAAE,aAAa,GAAG;QAC3B,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;QACd,mBAAmB,CAAC,EAAE,MAAM,CAAA;QAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAA;QAC5B,MAAM,CAAC,EAAE,WAAW,CAAA;QACpB,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,SAAS,CAAA;QACzC,gBAAgB,CAAC,EAAE,CACjB,KAAK,EAAE,OAAO,EACd,CAAC,EAAE,MAAM,EACT,YAAY,EAAE,OAAO,KAClB,IAAI,CAAA;QACT,SAAS,CAAC,EAAE,MACR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAC5C,SAAS,CAAA;KACd;gBAhBM,IAAI,EAAE,aAAa,GAAG;QAC3B,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;QACd,mBAAmB,CAAC,EAAE,MAAM,CAAA;QAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAA;QAC5B,MAAM,CAAC,EAAE,WAAW,CAAA;QACpB,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,SAAS,CAAA;QACzC,gBAAgB,CAAC,EAAE,CACjB,KAAK,EAAE,OAAO,EACd,CAAC,EAAE,MAAM,EACT,YAAY,EAAE,OAAO,KAClB,IAAI,CAAA;QACT,SAAS,CAAC,EAAE,MACR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAC5C,SAAS,CAAA;KACd;IAGI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;CA4BnD;AAED,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/stream/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAKvC,qBAAa,YAAY,CAAC,CAAC,GAAG,OAAO;IAE1B,IAAI,EAAE,aAAa,GAAG;QAC3B,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;QACd,mBAAmB,CAAC,EAAE,MAAM,CAAA;QAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAA;QAC5B,MAAM,CAAC,EAAE,WAAW,CAAA;QACpB,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,SAAS,CAAA;QACzC,gBAAgB,CAAC,EAAE,CACjB,KAAK,EAAE,OAAO,EACd,CAAC,EAAE,MAAM,EACT,YAAY,EAAE,OAAO,KAClB,IAAI,CAAA;QACT,SAAS,CAAC,EAAE,MACR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAC5C,SAAS,CAAA;KACd;IAjBH,YACS,IAAI,EAAE,aAAa,GAAG;QAC3B,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;QACd,mBAAmB,CAAC,EAAE,MAAM,CAAA;QAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAA;QAC5B,MAAM,CAAC,EAAE,WAAW,CAAA;QACpB,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,SAAS,CAAA;QACzC,gBAAgB,CAAC,EAAE,CACjB,KAAK,EAAE,OAAO,EACd,CAAC,EAAE,MAAM,EACT,YAAY,EAAE,OAAO,KAClB,IAAI,CAAA;QACT,SAAS,CAAC,EAAE,MACR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAC5C,SAAS,CAAA;KACd,EACC;IAEG,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CA2BjD;CACF;eAEc,YAAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/stream/subscription.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ClientOptions } from 'ws'\nimport { isPlainObject } from '@atproto/lex-data'\nimport { WebSocketKeepAlive } from '@atproto/ws-client'\nimport { ensureChunkIsMessage } from './stream.js'\n\nexport class Subscription<T = unknown> {\n constructor(\n public opts: ClientOptions & {\n service: string\n method: string\n maxReconnectSeconds?: number\n heartbeatIntervalMs?: number\n signal?: AbortSignal\n validate: (obj: unknown) => T | undefined\n onReconnectError?: (\n error: unknown,\n n: number,\n initialSetup: boolean,\n ) => void\n getParams?: () =>\n | Record<string, unknown>\n | Promise<Record<string, unknown> | undefined>\n | undefined\n },\n ) {}\n\n async *[Symbol.asyncIterator](): AsyncGenerator<T> {\n const ws = new WebSocketKeepAlive({\n ...this.opts,\n getUrl: async () => {\n const params = (await this.opts.getParams?.()) ?? {}\n const query = encodeQueryParams(params)\n return `${this.opts.service}/xrpc/${this.opts.method}?${query}`\n },\n })\n for await (const chunk of ws) {\n const message = ensureChunkIsMessage(chunk)\n const t = message.header.t\n\n const typedBody = isPlainObject(message.body)\n ? t !== undefined\n ? {\n ...message.body,\n $type: t.startsWith('#') ? this.opts.method + t : t,\n }\n : message.body\n : undefined\n\n const result = this.opts.validate(typedBody)\n if (result !== undefined) {\n yield result\n }\n }\n }\n}\n\nexport default Subscription\n\nfunction encodeQueryParams(obj: Record<string, unknown>): string {\n const params = new URLSearchParams()\n Object.entries(obj).forEach(([key, value]) => {\n const encoded = encodeQueryParam(value)\n if (Array.isArray(encoded)) {\n encoded.forEach((enc) => params.append(key, enc))\n } else {\n params.set(key, encoded)\n }\n })\n return params.toString()\n}\n\n// Adapted from xrpc, but without any lex-specific knowledge\nfunction encodeQueryParam(value: unknown): string | string[] {\n if (typeof value === 'string') {\n return value\n }\n if (typeof value === 'number') {\n return value.toString()\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false'\n }\n if (typeof value === 'undefined') {\n return ''\n }\n if (typeof value === 'object') {\n if (value instanceof Date) {\n return value.toISOString()\n } else if (Array.isArray(value)) {\n return value.flatMap(encodeQueryParam)\n } else if (!value) {\n return ''\n }\n }\n throw new Error(`Cannot encode ${typeof value}s into query params`)\n}\n"]}
1
+ {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/stream/subscription.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ClientOptions } from 'ws'\nimport { isPlainObject } from '@atproto/lex-data'\nimport { WebSocketKeepAlive } from '@atproto/ws-client'\nimport { ensureChunkIsMessage } from './stream.js'\n\nexport class Subscription<T = unknown> {\n constructor(\n public opts: ClientOptions & {\n service: string\n method: string\n maxReconnectSeconds?: number\n heartbeatIntervalMs?: number\n signal?: AbortSignal\n validate: (obj: unknown) => T | undefined\n onReconnectError?: (\n error: unknown,\n n: number,\n initialSetup: boolean,\n ) => void\n getParams?: () =>\n | Record<string, unknown>\n | Promise<Record<string, unknown> | undefined>\n | undefined\n },\n ) {}\n\n async *[Symbol.asyncIterator](): AsyncGenerator<T> {\n const ws = new WebSocketKeepAlive({\n ...this.opts,\n getUrl: async () => {\n const params = (await this.opts.getParams?.()) ?? {}\n const query = encodeQueryParams(params)\n return `${this.opts.service}/xrpc/${this.opts.method}?${query}`\n },\n })\n for await (const chunk of ws) {\n const message = ensureChunkIsMessage(chunk)\n const t = message.header.t\n\n const typedBody = isPlainObject(message.body)\n ? t !== undefined\n ? {\n ...message.body,\n $type: t.startsWith('#') ? this.opts.method + t : t,\n }\n : message.body\n : undefined\n\n const result = this.opts.validate(typedBody)\n if (result !== undefined) {\n yield result\n }\n }\n }\n}\n\nexport default Subscription\n\nfunction encodeQueryParams(obj: Record<string, unknown>): string {\n const params = new URLSearchParams()\n Object.entries(obj).forEach(([key, value]) => {\n const encoded = encodeQueryParam(value)\n if (Array.isArray(encoded)) {\n encoded.forEach((enc) => params.append(key, enc))\n } else {\n params.set(key, encoded)\n }\n })\n return params.toString()\n}\n\n// Adapted from xrpc, but without any lex-specific knowledge\nfunction encodeQueryParam(value: unknown): string | string[] {\n if (typeof value === 'string') {\n return value\n }\n if (typeof value === 'number') {\n return value.toString()\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false'\n }\n if (typeof value === 'undefined') {\n return ''\n }\n if (typeof value === 'object') {\n if (value instanceof Date) {\n return value.toISOString()\n } else if (Array.isArray(value)) {\n return value.flatMap(encodeQueryParam)\n } else if (!value) {\n return ''\n }\n }\n throw new Error(`Cannot encode ${typeof value}s into query params`)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
package/dist/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { IncomingMessage, OutgoingMessage } from 'node:http'\nimport { Duplex, Readable, pipeline } from 'node:stream'\nimport {\n Request as ExpressRequest,\n Response as ExpressResponse,\n json,\n text,\n} from 'express'\n// eslint-disable-next-line import/default, import/no-named-as-default-member\nimport mimeTypes from 'mime-types'\n// eslint-disable-next-line import/no-named-as-default-member\nconst { contentType } = mimeTypes\nimport { MaxSizeChecker, createDecoders } from '@atproto/common'\nimport { jsonToLex } from '@atproto/lex-json'\nimport { l } from '@atproto/lex-schema'\nimport {\n type LexXrpcBody,\n type LexXrpcProcedure,\n type LexXrpcQuery,\n type LexXrpcSubscription,\n Lexicons,\n jsonToLex as jsonToLexWithBlobRef,\n} from '@atproto/lexicon'\nimport { ResponseType } from '@atproto/xrpc'\nimport {\n ErrorResult,\n InternalServerError,\n InvalidRequestError,\n XRPCError,\n} from './errors.js'\nimport {\n Auth,\n Input,\n LexMethodInput,\n LexMethodOutput,\n LexMethodParams,\n Output,\n Params,\n RouteOptions,\n UndecodedParams,\n handlerSuccess,\n} from './types.js'\n\nexport type ParamsVerifierInternal<P extends Params = Params> = (\n req: IncomingMessage | ExpressRequest,\n) => P\n\nexport type AuthVerifierInternal<C, A extends Auth = Auth> = (\n ctx: C,\n) => Promise<Exclude<A, ErrorResult>>\n\nexport type InputVerifierInternal<I extends Input = Input> = (\n req: ExpressRequest,\n res: ExpressResponse,\n) => Promise<I>\n\nexport type OutputVerifierInternal<O extends Output = Output> = (\n handleOutput: O,\n) => void\n\nexport const asArray = <T>(arr: T | T[]): T[] =>\n Array.isArray(arr) ? arr : [arr]\n\nexport function setHeaders(\n res: OutgoingMessage,\n headers?: Record<string, string | number>,\n) {\n if (headers) {\n for (const [name, val] of Object.entries(headers)) {\n if (val != null) res.setHeader(name, val)\n }\n }\n}\n\nfunction decodeQueryParams(\n def: LexXrpcProcedure | LexXrpcQuery | LexXrpcSubscription,\n params: UndecodedParams,\n): Params {\n const decoded: Params = {}\n for (const k in params) {\n const val = params[k]\n const property = def.parameters?.properties?.[k]\n if (property) {\n if (property.type === 'array') {\n const vals: (typeof val)[] = []\n decoded[k] = val\n ? vals\n .concat(val) // Cast to array\n .flatMap((v) => decodeQueryParam(property.items.type, v) ?? [])\n : undefined\n } else {\n decoded[k] = decodeQueryParam(property.type, val)\n }\n }\n }\n return decoded\n}\n\nexport function decodeQueryParam(\n type: string,\n value: unknown,\n): string | number | boolean | undefined {\n if (!value) {\n return undefined\n }\n if (type === 'string' || type === 'datetime') {\n return String(value)\n }\n if (type === 'float') {\n return Number(String(value))\n } else if (type === 'integer') {\n return parseInt(String(value), 10) || 0\n } else if (type === 'boolean') {\n return value === 'true'\n }\n}\n\nfunction getSearchParams(\n url?: string,\n opts?: { parseLoose?: boolean },\n): URLSearchParams | undefined {\n if (!url) return undefined\n\n const queryStringIdx = url.indexOf('?')\n if (queryStringIdx === -1) return undefined\n\n const queryString = url.slice(queryStringIdx + 1)\n if (queryString.length === 0) return undefined\n\n const urlSearchParams = new URLSearchParams(queryString)\n\n if (opts?.parseLoose) {\n // @NOTE this is non-standard and should only be used for limited backwards-compatibility purposes.\n // Converts \"foo[]=bar&foo[0]=baz\" syntax into \"foo=bar&foo=baz\"\n\n // We cannot \"delete()\" while iterating. SO we'll first collect all keys\n // that need to be changed, then apply the changes after\n const toAppend = new URLSearchParams()\n const toDelete = new Set<string>()\n\n for (const [key, value] of urlSearchParams) {\n const match = key.endsWith(']') ? key.match(/^([^[]*)\\[\\d*\\]$/) : null\n if (match) {\n toAppend.append(match[1], value)\n toDelete.add(key)\n }\n }\n\n for (const key of toDelete) {\n urlSearchParams.delete(key)\n }\n\n for (const [key, value] of toAppend) {\n urlSearchParams.append(key, value)\n }\n }\n\n return urlSearchParams\n}\n\nexport function getQueryParams(\n req: IncomingMessage | ExpressRequest,\n opts?: { parseLoose?: boolean },\n): UndecodedParams {\n if ('query' in req) return req.query\n\n const result: UndecodedParams = Object.create(null)\n\n const searchParams = getSearchParams(req.url, opts)\n if (!searchParams) return result\n\n if (searchParams.has('__proto__')) {\n // Prevent prototype pollution\n throw new InvalidRequestError(\n `Invalid query parameter: __proto__`,\n 'InvalidQueryParameter',\n )\n }\n\n for (const key of searchParams.keys()) {\n const values = searchParams.getAll(key)\n result[key] = values.length === 1 ? values[0] : values\n }\n\n return result\n}\n\nexport function createLexiconParamsVerifier<P extends Params = Params>(\n nsid: string,\n def: LexXrpcQuery | LexXrpcProcedure | LexXrpcSubscription,\n lexicons: Lexicons,\n): ParamsVerifierInternal<P> {\n return (req) => {\n const queryParams = getQueryParams(req)\n const params = decodeQueryParams(def, queryParams)\n try {\n return lexicons.assertValidXrpcParams(nsid, params) as P\n } catch (cause) {\n // @NOTE WE historically did not check for specific error types here,\n throw new InvalidRequestError(String(cause), undefined, { cause })\n }\n }\n}\n\nexport function createSchemaParamsVerifier<\n M extends l.Procedure | l.Query | l.Subscription,\n>(\n ns: l.Main<M>,\n options?: RouteOptions,\n): ParamsVerifierInternal<LexMethodParams<M>> {\n const schema = l.getMain(ns)\n const queryOpts = { parseLoose: options?.paramsParseLoose }\n return (req) => {\n const urlSearchParams =\n getSearchParams(req.url, queryOpts) ?? new URLSearchParams()\n try {\n const params = schema.parameters.fromURLSearchParams(urlSearchParams)\n return params as LexMethodParams<M>\n } catch (cause) {\n if (cause instanceof l.LexValidationError) {\n const message = `Invalid ${schema.nsid} params: ${cause.issues\n .map((issue) => issue.message)\n .join(', ')}`\n throw new InvalidRequestError(message, undefined, { cause })\n }\n throw cause\n }\n }\n}\n\nexport function createLexiconInputVerifier<I extends Input = Input>(\n nsid: string,\n def: LexXrpcProcedure | LexXrpcQuery,\n options: RouteOptions,\n lexicons: Lexicons,\n): InputVerifierInternal<I> {\n if (def.type === 'query' || !def.input) {\n return async (req) => {\n // @NOTE We allow (and ignore) \"empty\" bodies\n if (getBodyPresence(req) === 'present') {\n throw new InvalidRequestError(\n `A request body was provided when none was expected`,\n )\n }\n\n return undefined as I\n }\n }\n\n // Lexicon definition expects a request body\n\n const { input } = def\n const { blobLimit } = options\n\n const allowedEncodings = parseDefEncoding(input)\n const checkEncoding = allowedEncodings.includes(ENCODING_ANY)\n ? undefined // No need to check\n : (encoding: string) => allowedEncodings.includes(encoding)\n\n const bodyParser = createBodyParser(input.encoding, options)\n\n return async (req, res) => {\n if (getBodyPresence(req) === 'missing') {\n throw new InvalidRequestError(\n `A request body is expected but none was provided`,\n )\n }\n\n const reqEncoding = parseReqEncoding(req)\n if (checkEncoding && !checkEncoding(reqEncoding)) {\n throw new InvalidRequestError(\n `Wrong request encoding (Content-Type): ${reqEncoding}`,\n )\n }\n\n if (bodyParser) {\n await bodyParser(req, res)\n }\n\n if (input.schema) {\n try {\n const lexBody = req.body ? jsonToLexWithBlobRef(req.body) : req.body\n req.body = lexicons.assertValidXrpcInput(nsid, lexBody)\n } catch (cause) {\n throw new InvalidRequestError(\n cause instanceof Error ? cause.message : String(cause),\n undefined,\n { cause },\n )\n }\n }\n\n // if middleware already got the body, we pass that along as input\n // otherwise, we pass along a decoded readable stream\n const body = req.readableEnded ? req.body : decodeBodyStream(req, blobLimit)\n\n return { encoding: reqEncoding, body } as I\n }\n}\n\nexport function createSchemaInputVerifier<M extends l.Procedure | l.Query>(\n ns: l.Main<M>,\n options: RouteOptions,\n): InputVerifierInternal<LexMethodInput<M>> {\n const schema = l.getMain(ns)\n const { blobLimit } = options\n\n const input: l.Payload | undefined =\n 'input' in schema ? schema.input : undefined\n\n if (!input?.encoding) {\n //\n return async (req) => {\n if (getBodyPresence(req) === 'present') {\n // @NOTE we *could* also discard the body here instead of throwing an error\n throw new InvalidRequestError(\n `A request body was provided when none was expected`,\n )\n }\n\n return undefined as LexMethodInput<M>\n }\n }\n\n const bodyParser = createBodyParser(input.encoding, options)\n\n return async (req, res) => {\n if (getBodyPresence(req) === 'missing') {\n throw new InvalidRequestError(\n `A request body is expected but none was provided`,\n )\n }\n\n const reqEncoding = parseReqEncoding(req)\n if (!input.matchesEncoding(reqEncoding)) {\n throw new InvalidRequestError(\n `Wrong request encoding (Content-Type): ${reqEncoding}`,\n )\n }\n\n if (bodyParser) {\n await bodyParser(req, res)\n }\n\n if (input.schema) {\n try {\n const lexBody = req.body ? jsonToLex(req.body) : req.body\n req.body = input.schema.parse(lexBody)\n } catch (cause) {\n throw new InvalidRequestError(\n cause instanceof Error ? cause.message : String(cause),\n undefined,\n { cause },\n )\n }\n }\n\n // if middleware already got the body, we pass that along as input\n // otherwise, we pass along a decoded readable stream\n const body = req.readableEnded ? req.body : decodeBodyStream(req, blobLimit)\n\n return { encoding: reqEncoding, body } as LexMethodInput<M>\n }\n}\n\nexport function createLexiconOutputVerifier<O extends Output = Output>(\n nsid: string,\n def: LexXrpcProcedure | LexXrpcQuery,\n lexicons: Lexicons,\n): OutputVerifierInternal<O> {\n const outputDef = def.output\n\n // Expects no output\n if (!outputDef) {\n return (handlerOutput) => {\n if (handlerOutput !== undefined) {\n throw new InternalServerError(\n `A response body was provided when none was expected`,\n )\n }\n }\n }\n\n // An output is expected\n return (handlerOutput) => {\n if (handlerOutput === undefined) {\n throw new InternalServerError(\n `A response body is expected but none was provided`,\n )\n }\n\n if (!('encoding' in handlerOutput)) {\n // Ensure handlerOutput is valid ErrorResult\n if ('status' in handlerOutput && handlerOutput.status >= 400) {\n return\n }\n\n throw new InternalServerError(`Invalid handler output: missing encoding`)\n }\n\n if (!('body' in handlerOutput)) {\n // Ensure handlerOutput is valid HandlerPipeThrough\n if ('stream' in handlerOutput || 'buffer' in handlerOutput) {\n return // Validation is ignored for pipe-through outputs\n }\n\n throw new InternalServerError(`Invalid handler output: missing body`)\n }\n\n // Fool-proofing (should not be necessary due to type system)\n const result = handlerSuccess.safeParse(handlerOutput)\n if (!result.success) {\n throw new InternalServerError(`Invalid handler output`, undefined, {\n cause: result.reason,\n })\n }\n\n // output mime\n const { encoding } = handlerOutput\n if (!isValidEncoding(outputDef, encoding)) {\n throw new InternalServerError(`Invalid response encoding: ${encoding}`)\n }\n\n // output schema\n try {\n lexicons.assertValidXrpcOutput(nsid, handlerOutput.body)\n // @TODO Since the output verifier is typically enabled in dev/tests and\n // disabled in production, we don't want to assign the (altered) output\n // back to the handlerOutput object, as this would cause different\n // behaviors between environments. Instead, we should compare the value\n // returned by assertValidXrpcOutput with the original output and throw if\n // they differ (indicating that the output was mutated during validation,\n // e.g. due to default values being applied).\n } catch (cause) {\n const message =\n cause instanceof Error ? cause.message : 'Output body validation failed'\n throw new InternalServerError(message, undefined, { cause })\n }\n }\n}\n\nexport function createSchemaOutputVerifier<M extends l.Procedure | l.Query>(\n ns: l.Main<M>,\n): OutputVerifierInternal<LexMethodOutput<M>> {\n const outputSchema = l.getMain(ns).output\n return (handlerOutput) => {\n // @NOTE If the user of the lib wants to return an output that doesn't\n // conform to the schema, they can use HandlerPipeThrough return types\n if (!outputSchema.matchesEncoding(handlerOutput?.encoding)) {\n throw new InternalServerError('Output encoding mismatch')\n }\n if (outputSchema.schema) {\n const result = outputSchema.schema.safeValidate(handlerOutput?.body)\n if (!result.success) {\n throw new InternalServerError(result.reason.message, undefined, {\n cause: result.reason,\n })\n }\n } else if (!outputSchema.encoding && handlerOutput?.body !== undefined) {\n throw new InternalServerError('Output body not expected')\n }\n }\n}\n\nexport function parseReqEncoding(req: IncomingMessage): string {\n const encoding = normalizeMime(req.headers['content-type'])\n if (encoding) return encoding\n throw new InvalidRequestError(\n `Request encoding (Content-Type) required but not provided`,\n )\n}\n\nfunction normalizeMime(v?: string): string | null {\n if (!v) return null\n const fullType = contentType(v)\n if (!fullType) return null\n const shortType = fullType.split(';')[0]\n if (!shortType) return null\n return shortType\n}\n\nconst ENCODING_ANY = '*/*'\n\nfunction parseDefEncoding({ encoding }: LexXrpcBody) {\n return encoding.split(',').map(trimString)\n}\n\nfunction trimString(str: string): string {\n return str.trim()\n}\n\nfunction isValidEncoding(output: LexXrpcBody, encoding?: string) {\n if (!encoding) return false\n\n const normalized = normalizeMime(encoding)\n if (!normalized) return false\n\n const allowed = parseDefEncoding(output)\n if (!allowed.length) return false\n\n if (allowed.includes(ENCODING_ANY)) return true\n if (allowed.includes(normalized)) return true\n\n // Check for wildcard matches (e.g. normalized=application/json, allowed=application/*)\n for (const allowedEnc of allowed) {\n if (\n allowedEnc.endsWith('/*') &&\n normalized.startsWith(allowedEnc.slice(0, -1))\n ) {\n return true\n }\n }\n\n return false\n}\n\ntype BodyPresence = 'missing' | 'empty' | 'present'\n\nfunction getBodyPresence(req: IncomingMessage): BodyPresence {\n if (req.headers['transfer-encoding'] != null) return 'present'\n if (req.headers['content-length'] === '0') return 'empty'\n if (req.headers['content-length'] != null) return 'present'\n return 'missing'\n}\n\nfunction createBodyParser(inputEncoding: string, options: RouteOptions) {\n if (inputEncoding === ENCODING_ANY) {\n // When the lexicon's input encoding is */*, the handler will determine how to process it\n return\n }\n const { jsonLimit, textLimit } = options\n const jsonParser = json({ limit: jsonLimit })\n const textParser = text({ limit: textLimit })\n // Transform json and text parser middlewares into a single function\n return (req: ExpressRequest, res: ExpressResponse) => {\n return new Promise<void>((resolve, reject) => {\n jsonParser(req, res, (err) => {\n if (err) return reject(XRPCError.fromError(err))\n textParser(req, res, (err) => {\n if (err) return reject(XRPCError.fromError(err))\n resolve()\n })\n })\n })\n }\n}\n\nfunction decodeBodyStream(\n req: IncomingMessage,\n maxSize: number | undefined,\n): Readable {\n const contentEncoding = req.headers['content-encoding']\n const contentLength = req.headers['content-length']\n\n const contentLengthParsed = contentLength\n ? parseInt(contentLength, 10)\n : undefined\n\n if (Number.isNaN(contentLengthParsed)) {\n throw new XRPCError(ResponseType.InvalidRequest, 'invalid content-length')\n }\n\n if (\n maxSize !== undefined &&\n contentLengthParsed !== undefined &&\n contentLengthParsed > maxSize\n ) {\n throw new XRPCError(\n ResponseType.PayloadTooLarge,\n 'request entity too large',\n )\n }\n\n let transforms: Duplex[]\n try {\n transforms = createDecoders(contentEncoding)\n } catch (cause) {\n throw new XRPCError(\n ResponseType.UnsupportedMediaType,\n 'unsupported content-encoding',\n undefined,\n { cause },\n )\n }\n\n if (maxSize !== undefined) {\n const maxSizeChecker = new MaxSizeChecker(\n maxSize,\n () =>\n new XRPCError(ResponseType.PayloadTooLarge, 'request entity too large'),\n )\n transforms.push(maxSizeChecker)\n }\n\n return transforms.length > 0\n ? (pipeline([req, ...transforms], () => {}) as Duplex)\n : req\n}\n\nexport function serverTimingHeader(timings: ServerTiming[]) {\n return timings\n .map((timing) => {\n let header = timing.name\n if (timing.duration) header += `;dur=${timing.duration}`\n if (timing.description) header += `;desc=\"${timing.description}\"`\n return header\n })\n .join(', ')\n}\n\nexport class ServerTimer implements ServerTiming {\n public duration?: number\n private startMs?: number\n constructor(\n public name: string,\n public description?: string,\n ) {}\n start() {\n this.startMs = Date.now()\n return this\n }\n stop() {\n assert(this.startMs, \"timer hasn't been started\")\n this.duration = Date.now() - this.startMs\n return this\n }\n}\n\nexport interface ServerTiming {\n name: string\n duration?: number\n description?: string\n}\n\nexport const parseReqNsid = (req: ExpressRequest | IncomingMessage) =>\n parseUrlNsid('originalUrl' in req ? req.originalUrl : req.url || '/')\n\n/**\n * Validates and extracts the nsid from an xrpc path\n */\nexport const parseUrlNsid = (url: string): string => {\n const nsid = extractUrlNsid(url)\n if (nsid) return nsid\n throw new InvalidRequestError('invalid xrpc path')\n}\n\nexport const extractUrlNsid = (url: string): string | undefined => {\n // /!\\ Hot path\n\n if (\n // Ordered by likelihood of failure\n url.length <= 6 ||\n url[5] !== '/' ||\n url[4] !== 'c' ||\n url[3] !== 'p' ||\n url[2] !== 'r' ||\n url[1] !== 'x' ||\n url[0] !== '/'\n ) {\n return undefined\n }\n\n const startOfNsid = 6\n\n let curr = startOfNsid\n let char: number\n let alphaNumRequired = true\n for (; curr < url.length; curr++) {\n char = url.charCodeAt(curr)\n if (\n (char >= 48 && char <= 57) || // 0-9\n (char >= 65 && char <= 90) || // A-Z\n (char >= 97 && char <= 122) // a-z\n ) {\n alphaNumRequired = false\n } else if (char === 45 /* \"-\" */ || char === 46 /* \".\" */) {\n if (alphaNumRequired) {\n return undefined\n }\n alphaNumRequired = true\n } else if (char === 47 /* \"/\" */) {\n // Allow trailing slash (next char is either EOS or \"?\")\n if (curr === url.length - 1 || url.charCodeAt(curr + 1) === 63) {\n break\n }\n return undefined\n } else if (char === 63 /* \"?\"\" */) {\n break\n } else {\n return undefined\n }\n }\n\n // last char was one of: '-', '.', '/'\n if (alphaNumRequired) {\n return undefined\n }\n\n // A domain name consists of minimum two characters\n if (curr - startOfNsid < 2) {\n return undefined\n }\n\n // @TODO check max length of nsid\n\n return url.slice(startOfNsid, curr)\n}\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { IncomingMessage, OutgoingMessage } from 'node:http'\nimport { Duplex, Readable, pipeline } from 'node:stream'\nimport {\n Request as ExpressRequest,\n Response as ExpressResponse,\n json,\n text,\n} from 'express'\n// eslint-disable-next-line import/default, import/no-named-as-default-member\nimport mimeTypes from 'mime-types'\n// eslint-disable-next-line import/no-named-as-default-member\nconst { contentType } = mimeTypes\nimport { MaxSizeChecker, createDecoders } from '@atproto/common'\nimport { jsonToLex } from '@atproto/lex-json'\nimport { l } from '@atproto/lex-schema'\nimport {\n type LexXrpcBody,\n type LexXrpcProcedure,\n type LexXrpcQuery,\n type LexXrpcSubscription,\n Lexicons,\n jsonToLex as jsonToLexWithBlobRef,\n} from '@atproto/lexicon'\nimport { ResponseType } from '@atproto/xrpc'\nimport {\n ErrorResult,\n InternalServerError,\n InvalidRequestError,\n XRPCError,\n} from './errors.js'\nimport {\n Auth,\n Input,\n LexMethodInput,\n LexMethodOutput,\n LexMethodParams,\n Output,\n Params,\n RouteOptions,\n UndecodedParams,\n handlerSuccess,\n} from './types.js'\n\nexport type ParamsVerifierInternal<P extends Params = Params> = (\n req: IncomingMessage | ExpressRequest,\n) => P\n\nexport type AuthVerifierInternal<C, A extends Auth = Auth> = (\n ctx: C,\n) => Promise<Exclude<A, ErrorResult>>\n\nexport type InputVerifierInternal<I extends Input = Input> = (\n req: ExpressRequest,\n res: ExpressResponse,\n) => Promise<I>\n\nexport type OutputVerifierInternal<O extends Output = Output> = (\n handleOutput: O,\n) => void\n\nexport const asArray = <T>(arr: T | T[]): T[] =>\n Array.isArray(arr) ? arr : [arr]\n\nexport function setHeaders(\n res: OutgoingMessage,\n headers?: Record<string, string | number>,\n) {\n if (headers) {\n for (const [name, val] of Object.entries(headers)) {\n if (val != null) res.setHeader(name, val)\n }\n }\n}\n\nfunction decodeQueryParams(\n def: LexXrpcProcedure | LexXrpcQuery | LexXrpcSubscription,\n params: UndecodedParams,\n): Params {\n const decoded: Params = {}\n for (const k in params) {\n const val = params[k]\n const property = def.parameters?.properties?.[k]\n if (property) {\n if (property.type === 'array') {\n const vals: (typeof val)[] = []\n decoded[k] = val\n ? vals\n .concat(val) // Cast to array\n .flatMap((v) => decodeQueryParam(property.items.type, v) ?? [])\n : undefined\n } else {\n decoded[k] = decodeQueryParam(property.type, val)\n }\n }\n }\n return decoded\n}\n\nexport function decodeQueryParam(\n type: string,\n value: unknown,\n): string | number | boolean | undefined {\n if (!value) {\n return undefined\n }\n if (type === 'string' || type === 'datetime') {\n return String(value)\n }\n if (type === 'float') {\n return Number(String(value))\n } else if (type === 'integer') {\n return parseInt(String(value), 10) || 0\n } else if (type === 'boolean') {\n return value === 'true'\n }\n}\n\nfunction getSearchParams(\n url?: string,\n opts?: { parseLoose?: boolean },\n): URLSearchParams | undefined {\n if (!url) return undefined\n\n const queryStringIdx = url.indexOf('?')\n if (queryStringIdx === -1) return undefined\n\n const queryString = url.slice(queryStringIdx + 1)\n if (queryString.length === 0) return undefined\n\n const urlSearchParams = new URLSearchParams(queryString)\n\n if (opts?.parseLoose) {\n // @NOTE this is non-standard and should only be used for limited backwards-compatibility purposes.\n // Converts \"foo[]=bar&foo[0]=baz\" syntax into \"foo=bar&foo=baz\"\n\n // We cannot \"delete()\" while iterating. SO we'll first collect all keys\n // that need to be changed, then apply the changes after\n const toAppend = new URLSearchParams()\n const toDelete = new Set<string>()\n\n for (const [key, value] of urlSearchParams) {\n const match = key.endsWith(']') ? key.match(/^([^[]*)\\[\\d*\\]$/) : null\n if (match) {\n toAppend.append(match[1], value)\n toDelete.add(key)\n }\n }\n\n for (const key of toDelete) {\n urlSearchParams.delete(key)\n }\n\n for (const [key, value] of toAppend) {\n urlSearchParams.append(key, value)\n }\n }\n\n return urlSearchParams\n}\n\nexport function getQueryParams(\n req: IncomingMessage | ExpressRequest,\n opts?: { parseLoose?: boolean },\n): UndecodedParams {\n if ('query' in req) return req.query\n\n const result: UndecodedParams = Object.create(null)\n\n const searchParams = getSearchParams(req.url, opts)\n if (!searchParams) return result\n\n if (searchParams.has('__proto__')) {\n // Prevent prototype pollution\n throw new InvalidRequestError(\n `Invalid query parameter: __proto__`,\n 'InvalidQueryParameter',\n )\n }\n\n for (const key of searchParams.keys()) {\n const values = searchParams.getAll(key)\n result[key] = values.length === 1 ? values[0] : values\n }\n\n return result\n}\n\nexport function createLexiconParamsVerifier<P extends Params = Params>(\n nsid: string,\n def: LexXrpcQuery | LexXrpcProcedure | LexXrpcSubscription,\n lexicons: Lexicons,\n): ParamsVerifierInternal<P> {\n return (req) => {\n const queryParams = getQueryParams(req)\n const params = decodeQueryParams(def, queryParams)\n try {\n return lexicons.assertValidXrpcParams(nsid, params) as P\n } catch (cause) {\n // @NOTE WE historically did not check for specific error types here,\n throw new InvalidRequestError(String(cause), undefined, { cause })\n }\n }\n}\n\nexport function createSchemaParamsVerifier<\n M extends l.Procedure | l.Query | l.Subscription,\n>(\n ns: l.Main<M>,\n options?: RouteOptions,\n): ParamsVerifierInternal<LexMethodParams<M>> {\n const schema = l.getMain(ns)\n const queryOpts = { parseLoose: options?.paramsParseLoose }\n return (req) => {\n const urlSearchParams =\n getSearchParams(req.url, queryOpts) ?? new URLSearchParams()\n try {\n const params = schema.parameters.fromURLSearchParams(urlSearchParams)\n return params as LexMethodParams<M>\n } catch (cause) {\n if (cause instanceof l.LexValidationError) {\n const message = `Invalid ${schema.nsid} params: ${cause.issues\n .map((issue) => issue.message)\n .join(', ')}`\n throw new InvalidRequestError(message, undefined, { cause })\n }\n throw cause\n }\n }\n}\n\nexport function createLexiconInputVerifier<I extends Input = Input>(\n nsid: string,\n def: LexXrpcProcedure | LexXrpcQuery,\n options: RouteOptions,\n lexicons: Lexicons,\n): InputVerifierInternal<I> {\n if (def.type === 'query' || !def.input) {\n return async (req) => {\n // @NOTE We allow (and ignore) \"empty\" bodies\n if (getBodyPresence(req) === 'present') {\n throw new InvalidRequestError(\n `A request body was provided when none was expected`,\n )\n }\n\n return undefined as I\n }\n }\n\n // Lexicon definition expects a request body\n\n const { input } = def\n const { blobLimit } = options\n\n const allowedEncodings = parseDefEncoding(input)\n const checkEncoding = allowedEncodings.includes(ENCODING_ANY)\n ? undefined // No need to check\n : (encoding: string) => allowedEncodings.includes(encoding)\n\n const bodyParser = createBodyParser(input.encoding, options)\n\n return async (req, res) => {\n if (getBodyPresence(req) === 'missing') {\n throw new InvalidRequestError(\n `A request body is expected but none was provided`,\n )\n }\n\n const reqEncoding = parseReqEncoding(req)\n if (checkEncoding && !checkEncoding(reqEncoding)) {\n throw new InvalidRequestError(\n `Wrong request encoding (Content-Type): ${reqEncoding}`,\n )\n }\n\n if (bodyParser) {\n await bodyParser(req, res)\n }\n\n if (input.schema) {\n try {\n const lexBody = req.body ? jsonToLexWithBlobRef(req.body) : req.body\n req.body = lexicons.assertValidXrpcInput(nsid, lexBody)\n } catch (cause) {\n throw new InvalidRequestError(\n cause instanceof Error ? cause.message : String(cause),\n undefined,\n { cause },\n )\n }\n }\n\n // if middleware already got the body, we pass that along as input\n // otherwise, we pass along a decoded readable stream\n const body = req.readableEnded ? req.body : decodeBodyStream(req, blobLimit)\n\n return { encoding: reqEncoding, body } as I\n }\n}\n\nexport function createSchemaInputVerifier<M extends l.Procedure | l.Query>(\n ns: l.Main<M>,\n options: RouteOptions,\n): InputVerifierInternal<LexMethodInput<M>> {\n const schema = l.getMain(ns)\n const { blobLimit } = options\n\n const input: l.Payload | undefined =\n 'input' in schema ? schema.input : undefined\n\n if (!input?.encoding) {\n //\n return async (req) => {\n if (getBodyPresence(req) === 'present') {\n // @NOTE we *could* also discard the body here instead of throwing an error\n throw new InvalidRequestError(\n `A request body was provided when none was expected`,\n )\n }\n\n return undefined as LexMethodInput<M>\n }\n }\n\n const bodyParser = createBodyParser(input.encoding, options)\n\n return async (req, res) => {\n if (getBodyPresence(req) === 'missing') {\n throw new InvalidRequestError(\n `A request body is expected but none was provided`,\n )\n }\n\n const reqEncoding = parseReqEncoding(req)\n if (!input.matchesEncoding(reqEncoding)) {\n throw new InvalidRequestError(\n `Wrong request encoding (Content-Type): ${reqEncoding}`,\n )\n }\n\n if (bodyParser) {\n await bodyParser(req, res)\n }\n\n if (input.schema) {\n try {\n const lexBody = req.body ? jsonToLex(req.body) : req.body\n req.body = input.schema.parse(lexBody)\n } catch (cause) {\n throw new InvalidRequestError(\n cause instanceof Error ? cause.message : String(cause),\n undefined,\n { cause },\n )\n }\n }\n\n // if middleware already got the body, we pass that along as input\n // otherwise, we pass along a decoded readable stream\n const body = req.readableEnded ? req.body : decodeBodyStream(req, blobLimit)\n\n return { encoding: reqEncoding, body } as LexMethodInput<M>\n }\n}\n\nexport function createLexiconOutputVerifier<O extends Output = Output>(\n nsid: string,\n def: LexXrpcProcedure | LexXrpcQuery,\n lexicons: Lexicons,\n): OutputVerifierInternal<O> {\n const outputDef = def.output\n\n // Expects no output\n if (!outputDef) {\n return (handlerOutput) => {\n if (handlerOutput !== undefined) {\n throw new InternalServerError(\n `A response body was provided when none was expected`,\n )\n }\n }\n }\n\n // An output is expected\n return (handlerOutput) => {\n if (handlerOutput === undefined) {\n throw new InternalServerError(\n `A response body is expected but none was provided`,\n )\n }\n\n if (!('encoding' in handlerOutput)) {\n // Ensure handlerOutput is valid ErrorResult\n if ('status' in handlerOutput && handlerOutput.status >= 400) {\n return\n }\n\n throw new InternalServerError(`Invalid handler output: missing encoding`)\n }\n\n if (!('body' in handlerOutput)) {\n // Ensure handlerOutput is valid HandlerPipeThrough\n if ('stream' in handlerOutput || 'buffer' in handlerOutput) {\n return // Validation is ignored for pipe-through outputs\n }\n\n throw new InternalServerError(`Invalid handler output: missing body`)\n }\n\n // Fool-proofing (should not be necessary due to type system)\n const result = handlerSuccess.safeParse(handlerOutput)\n if (!result.success) {\n throw new InternalServerError(`Invalid handler output`, undefined, {\n cause: result.reason,\n })\n }\n\n // output mime\n const { encoding } = handlerOutput\n if (!isValidEncoding(outputDef, encoding)) {\n throw new InternalServerError(`Invalid response encoding: ${encoding}`)\n }\n\n // output schema\n try {\n lexicons.assertValidXrpcOutput(nsid, handlerOutput.body)\n // @TODO Since the output verifier is typically enabled in dev/tests and\n // disabled in production, we don't want to assign the (altered) output\n // back to the handlerOutput object, as this would cause different\n // behaviors between environments. Instead, we should compare the value\n // returned by assertValidXrpcOutput with the original output and throw if\n // they differ (indicating that the output was mutated during validation,\n // e.g. due to default values being applied).\n } catch (cause) {\n const message =\n cause instanceof Error ? cause.message : 'Output body validation failed'\n throw new InternalServerError(message, undefined, { cause })\n }\n }\n}\n\nexport function createSchemaOutputVerifier<M extends l.Procedure | l.Query>(\n ns: l.Main<M>,\n): OutputVerifierInternal<LexMethodOutput<M>> {\n const outputSchema = l.getMain(ns).output\n return (handlerOutput) => {\n // @NOTE If the user of the lib wants to return an output that doesn't\n // conform to the schema, they can use HandlerPipeThrough return types\n if (!outputSchema.matchesEncoding(handlerOutput?.encoding)) {\n throw new InternalServerError('Output encoding mismatch')\n }\n if (outputSchema.schema) {\n const result = outputSchema.schema.safeValidate(handlerOutput?.body)\n if (!result.success) {\n throw new InternalServerError(result.reason.message, undefined, {\n cause: result.reason,\n })\n }\n } else if (!outputSchema.encoding && handlerOutput?.body !== undefined) {\n throw new InternalServerError('Output body not expected')\n }\n }\n}\n\nexport function parseReqEncoding(req: IncomingMessage): string {\n const encoding = normalizeMime(req.headers['content-type'])\n if (encoding) return encoding\n throw new InvalidRequestError(\n `Request encoding (Content-Type) required but not provided`,\n )\n}\n\nfunction normalizeMime(v?: string): string | null {\n if (!v) return null\n const fullType = contentType(v)\n if (!fullType) return null\n const shortType = fullType.split(';')[0]\n if (!shortType) return null\n return shortType\n}\n\nconst ENCODING_ANY = '*/*'\n\nfunction parseDefEncoding({ encoding }: LexXrpcBody) {\n return encoding.split(',').map(trimString)\n}\n\nfunction trimString(str: string): string {\n return str.trim()\n}\n\nfunction isValidEncoding(output: LexXrpcBody, encoding?: string) {\n if (!encoding) return false\n\n const normalized = normalizeMime(encoding)\n if (!normalized) return false\n\n const allowed = parseDefEncoding(output)\n if (!allowed.length) return false\n\n if (allowed.includes(ENCODING_ANY)) return true\n if (allowed.includes(normalized)) return true\n\n // Check for wildcard matches (e.g. normalized=application/json, allowed=application/*)\n for (const allowedEnc of allowed) {\n if (\n allowedEnc.endsWith('/*') &&\n normalized.startsWith(allowedEnc.slice(0, -1))\n ) {\n return true\n }\n }\n\n return false\n}\n\ntype BodyPresence = 'missing' | 'empty' | 'present'\n\nfunction getBodyPresence(req: IncomingMessage): BodyPresence {\n if (req.headers['transfer-encoding'] != null) return 'present'\n if (req.headers['content-length'] === '0') return 'empty'\n if (req.headers['content-length'] != null) return 'present'\n return 'missing'\n}\n\nfunction createBodyParser(inputEncoding: string, options: RouteOptions) {\n if (inputEncoding === ENCODING_ANY) {\n // When the lexicon's input encoding is */*, the handler will determine how to process it\n return\n }\n const { jsonLimit, textLimit } = options\n const jsonParser = json({ limit: jsonLimit })\n const textParser = text({ limit: textLimit })\n // Transform json and text parser middlewares into a single function\n return (req: ExpressRequest, res: ExpressResponse) => {\n return new Promise<void>((resolve, reject) => {\n jsonParser(req, res, (err) => {\n if (err) return reject(XRPCError.fromError(err))\n textParser(req, res, (err) => {\n if (err) return reject(XRPCError.fromError(err))\n resolve()\n })\n })\n })\n }\n}\n\nfunction decodeBodyStream(\n req: IncomingMessage,\n maxSize: number | undefined,\n): Readable {\n const contentEncoding = req.headers['content-encoding']\n const contentLength = req.headers['content-length']\n\n const contentLengthParsed = contentLength\n ? parseInt(contentLength, 10)\n : undefined\n\n if (Number.isNaN(contentLengthParsed)) {\n throw new XRPCError(ResponseType.InvalidRequest, 'invalid content-length')\n }\n\n if (\n maxSize !== undefined &&\n contentLengthParsed !== undefined &&\n contentLengthParsed > maxSize\n ) {\n throw new XRPCError(\n ResponseType.PayloadTooLarge,\n 'request entity too large',\n )\n }\n\n let transforms: Duplex[]\n try {\n transforms = createDecoders(contentEncoding)\n } catch (cause) {\n throw new XRPCError(\n ResponseType.UnsupportedMediaType,\n 'unsupported content-encoding',\n undefined,\n { cause },\n )\n }\n\n if (maxSize !== undefined) {\n const maxSizeChecker = new MaxSizeChecker(\n maxSize,\n () =>\n new XRPCError(ResponseType.PayloadTooLarge, 'request entity too large'),\n )\n transforms.push(maxSizeChecker)\n }\n\n return transforms.length > 0\n ? (pipeline([req, ...transforms], () => {}) as Duplex)\n : req\n}\n\nexport function serverTimingHeader(timings: ServerTiming[]) {\n return timings\n .map((timing) => {\n let header = timing.name\n if (timing.duration) header += `;dur=${timing.duration}`\n if (timing.description) header += `;desc=\"${timing.description}\"`\n return header\n })\n .join(', ')\n}\n\nexport class ServerTimer implements ServerTiming {\n public duration?: number\n private startMs?: number\n constructor(\n public name: string,\n public description?: string,\n ) {}\n start() {\n this.startMs = Date.now()\n return this\n }\n stop() {\n assert(this.startMs, \"timer hasn't been started\")\n this.duration = Date.now() - this.startMs\n return this\n }\n}\n\nexport interface ServerTiming {\n name: string\n duration?: number\n description?: string\n}\n\nexport const parseReqNsid = (req: ExpressRequest | IncomingMessage) =>\n parseUrlNsid('originalUrl' in req ? req.originalUrl : req.url || '/')\n\n/**\n * Validates and extracts the nsid from an xrpc path\n */\nexport const parseUrlNsid = (url: string): string => {\n const nsid = extractUrlNsid(url)\n if (nsid) return nsid\n throw new InvalidRequestError('invalid xrpc path')\n}\n\nexport const extractUrlNsid = (url: string): string | undefined => {\n // /!\\ Hot path\n\n if (\n // Ordered by likelihood of failure\n url.length <= 6 ||\n url[5] !== '/' ||\n url[4] !== 'c' ||\n url[3] !== 'p' ||\n url[2] !== 'r' ||\n url[1] !== 'x' ||\n url[0] !== '/'\n ) {\n return undefined\n }\n\n const startOfNsid = 6\n\n let curr = startOfNsid\n let char: number\n let alphaNumRequired = true\n for (; curr < url.length; curr++) {\n char = url.charCodeAt(curr)\n if (\n (char >= 48 && char <= 57) || // 0-9\n (char >= 65 && char <= 90) || // A-Z\n (char >= 97 && char <= 122) // a-z\n ) {\n alphaNumRequired = false\n } else if (char === 45 /* \"-\" */ || char === 46 /* \".\" */) {\n if (alphaNumRequired) {\n return undefined\n }\n alphaNumRequired = true\n } else if (char === 47 /* \"/\" */) {\n // Allow trailing slash (next char is either EOS or \"?\")\n if (curr === url.length - 1 || url.charCodeAt(curr + 1) === 63) {\n break\n }\n return undefined\n } else if (char === 63 /* \"?\"\" */) {\n break\n } else {\n return undefined\n }\n }\n\n // last char was one of: '-', '.', '/'\n if (alphaNumRequired) {\n return undefined\n }\n\n // A domain name consists of minimum two characters\n if (curr - startOfNsid < 2) {\n return undefined\n }\n\n // @TODO check max length of nsid\n\n return url.slice(startOfNsid, curr)\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/xrpc-server",
3
- "version": "0.11.1",
3
+ "version": "0.11.2",
4
4
  "license": "MIT",
5
5
  "description": "atproto HTTP API (XRPC) server library",
6
6
  "keywords": [
@@ -22,16 +22,16 @@
22
22
  "mime-types": "^2.1.35",
23
23
  "rate-limiter-flexible": "^2.4.1",
24
24
  "ws": "^8.12.0",
25
- "@atproto/common": "^0.6.1",
26
- "@atproto/crypto": "^0.5.0",
27
- "@atproto/lex-data": "^0.1.1",
28
- "@atproto/lex-cbor": "^0.1.0",
29
- "@atproto/lex-client": "^0.1.2",
30
- "@atproto/lex-json": "^0.1.0",
31
- "@atproto/lex-schema": "^0.1.1",
32
- "@atproto/lexicon": "^0.7.1",
33
- "@atproto/ws-client": "^0.1.0",
34
- "@atproto/xrpc": "^0.8.0"
25
+ "@atproto/crypto": "^0.5.1",
26
+ "@atproto/lex-data": "^0.1.2",
27
+ "@atproto/common": "^0.6.3",
28
+ "@atproto/lex-cbor": "^0.1.1",
29
+ "@atproto/lex-json": "^0.1.1",
30
+ "@atproto/lex-client": "^0.1.4",
31
+ "@atproto/lexicon": "^0.7.2",
32
+ "@atproto/xrpc": "^0.8.1",
33
+ "@atproto/lex-schema": "^0.1.4",
34
+ "@atproto/ws-client": "^0.1.1"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@jest/globals": "^30.0.0",
@@ -45,10 +45,9 @@
45
45
  "jose": "^5.0.1",
46
46
  "key-encoder": "^2.0.3",
47
47
  "multiformats": "^13.0.0",
48
- "typescript": "^6.0.3",
49
- "@atproto/crypto": "^0.5.0",
50
- "@atproto/lex": "^0.1.2",
51
- "@atproto/lex-document": "^0.1.0"
48
+ "@atproto/crypto": "^0.5.1",
49
+ "@atproto/lex": "^0.1.4",
50
+ "@atproto/lex-document": "^0.1.1"
52
51
  },
53
52
  "type": "module",
54
53
  "exports": {
@@ -59,6 +58,6 @@
59
58
  },
60
59
  "scripts": {
61
60
  "test": "NODE_OPTIONS=--experimental-vm-modules jest",
62
- "build": "tsc --build tsconfig.build.json"
61
+ "build": "tsgo --build tsconfig.build.json"
63
62
  }
64
63
  }
@@ -2,7 +2,7 @@
2
2
  "extends": "../../tsconfig/node.json",
3
3
  "compilerOptions": {
4
4
  "rootDir": "./src",
5
- "outDir": "./dist"
5
+ "outDir": "./dist",
6
6
  },
7
- "include": ["./src"]
7
+ "include": ["./src"],
8
8
  }
@@ -1 +1 @@
1
- {"root":["./src/auth.ts","./src/errors.ts","./src/index.ts","./src/logger.ts","./src/rate-limiter-http.ts","./src/rate-limiter.ts","./src/server.ts","./src/types.ts","./src/util.ts","./src/stream/frames.ts","./src/stream/index.ts","./src/stream/logger.ts","./src/stream/server.ts","./src/stream/stream.ts","./src/stream/subscription.ts","./src/stream/types.ts"],"version":"6.0.3"}
1
+ {"version":"7.0.0-dev.20260614.1","root":["./src/auth.ts","./src/errors.ts","./src/index.ts","./src/logger.ts","./src/rate-limiter-http.ts","./src/rate-limiter.ts","./src/server.ts","./src/types.ts","./src/util.ts","./src/stream/frames.ts","./src/stream/index.ts","./src/stream/logger.ts","./src/stream/server.ts","./src/stream/stream.ts","./src/stream/subscription.ts","./src/stream/types.ts"]}
package/tsconfig.json CHANGED
@@ -2,6 +2,6 @@
2
2
  "include": [],
3
3
  "references": [
4
4
  { "path": "./tsconfig.build.json" },
5
- { "path": "./tsconfig.tests.json" }
6
- ]
5
+ { "path": "./tsconfig.tests.json" },
6
+ ],
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "extends": "../../tsconfig/tests.json",
3
3
  "compilerOptions": {
4
- "rootDir": "."
4
+ "rootDir": ".",
5
5
  },
6
- "include": ["./tests"]
6
+ "include": ["./tests"],
7
7
  }