@pymthouse/builder-sdk 0.3.1 → 0.4.1-rc.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/README.md +54 -28
- package/dist/{client-BHfjDvIe.d.ts → client-CauCfGa7.d.ts} +1 -1
- package/dist/{client-CvhJEhjV.d.cts → client-D1Xz-xlx.d.cts} +1 -1
- package/dist/config.cjs +0 -21
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +1 -5
- package/dist/config.d.ts +1 -5
- package/dist/config.js +1 -20
- package/dist/config.js.map +1 -1
- package/dist/device-initiate.cjs.map +1 -1
- package/dist/device-initiate.js.map +1 -1
- package/dist/device.cjs.map +1 -1
- package/dist/device.d.cts +1 -1
- package/dist/device.d.ts +1 -1
- package/dist/device.js.map +1 -1
- package/dist/env.cjs +13 -4
- package/dist/env.cjs.map +1 -1
- package/dist/env.d.cts +2 -2
- package/dist/env.d.ts +2 -2
- package/dist/env.js +13 -4
- package/dist/env.js.map +1 -1
- package/dist/index-B0ryx942.d.cts +66 -0
- package/dist/index-CvV5syf_.d.ts +66 -0
- package/dist/index.cjs +13 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +29 -5
- package/dist/index.d.ts +29 -5
- package/dist/index.js +13 -4
- package/dist/index.js.map +1 -1
- package/dist/{ingest-DoKJTWU9.d.ts → proxy-JrT6raU_.d.cts} +5 -42
- package/dist/{ingest-B3Yi8Tb1.d.cts → proxy-U32DFNuj.d.ts} +5 -42
- package/dist/signer/server.cjs +799 -895
- package/dist/signer/server.cjs.map +1 -1
- package/dist/signer/server.d.cts +11 -15
- package/dist/signer/server.d.ts +11 -15
- package/dist/signer/server.js +799 -893
- package/dist/signer/server.js.map +1 -1
- package/dist/signer/webhook/adapters/api-key.cjs +82 -0
- package/dist/signer/webhook/adapters/api-key.cjs.map +1 -0
- package/dist/signer/webhook/adapters/api-key.d.cts +18 -0
- package/dist/signer/webhook/adapters/api-key.d.ts +18 -0
- package/dist/signer/webhook/adapters/api-key.js +80 -0
- package/dist/signer/webhook/adapters/api-key.js.map +1 -0
- package/dist/signer/webhook/adapters/composite.cjs +60 -0
- package/dist/signer/webhook/adapters/composite.cjs.map +1 -0
- package/dist/signer/webhook/adapters/composite.d.cts +5 -0
- package/dist/signer/webhook/adapters/composite.d.ts +5 -0
- package/dist/signer/webhook/adapters/composite.js +58 -0
- package/dist/signer/webhook/adapters/composite.js.map +1 -0
- package/dist/signer/webhook/adapters/oauth1.cjs +18 -0
- package/dist/signer/webhook/adapters/oauth1.cjs.map +1 -0
- package/dist/signer/webhook/adapters/oauth1.d.cts +19 -0
- package/dist/signer/webhook/adapters/oauth1.d.ts +19 -0
- package/dist/signer/webhook/adapters/oauth1.js +16 -0
- package/dist/signer/webhook/adapters/oauth1.js.map +1 -0
- package/dist/signer/webhook/adapters/oidc.cjs +533 -0
- package/dist/signer/webhook/adapters/oidc.cjs.map +1 -0
- package/dist/signer/webhook/adapters/oidc.d.cts +4 -0
- package/dist/signer/webhook/adapters/oidc.d.ts +4 -0
- package/dist/signer/webhook/adapters/oidc.js +526 -0
- package/dist/signer/webhook/adapters/oidc.js.map +1 -0
- package/dist/signer/webhook/adapters/trusted-headers.cjs +110 -0
- package/dist/signer/webhook/adapters/trusted-headers.cjs.map +1 -0
- package/dist/signer/webhook/adapters/trusted-headers.d.cts +18 -0
- package/dist/signer/webhook/adapters/trusted-headers.d.ts +18 -0
- package/dist/signer/webhook/adapters/trusted-headers.js +106 -0
- package/dist/signer/webhook/adapters/trusted-headers.js.map +1 -0
- package/dist/signer/webhook.cjs +759 -0
- package/dist/signer/webhook.cjs.map +1 -0
- package/dist/signer/webhook.d.cts +26 -0
- package/dist/signer/webhook.d.ts +26 -0
- package/dist/signer/webhook.js +732 -0
- package/dist/signer/webhook.js.map +1 -0
- package/dist/tokens.d.cts +1 -1
- package/dist/tokens.d.ts +1 -1
- package/dist/{types-_R1AwEZp.d.cts → types-BORaHW_x.d.cts} +5 -5
- package/dist/{types-_R1AwEZp.d.ts → types-BORaHW_x.d.ts} +5 -5
- package/dist/verifier-B-WFDMz6.d.cts +48 -0
- package/dist/verifier-B-WFDMz6.d.ts +48 -0
- package/dist/verify.cjs.map +1 -1
- package/dist/verify.d.cts +1 -1
- package/dist/verify.d.ts +1 -1
- package/dist/verify.js.map +1 -1
- package/package.json +30 -30
- package/dist/gateway/client/index.cjs +0 -492
- package/dist/gateway/client/index.cjs.map +0 -1
- package/dist/gateway/client/index.d.cts +0 -63
- package/dist/gateway/client/index.d.ts +0 -63
- package/dist/gateway/client/index.js +0 -489
- package/dist/gateway/client/index.js.map +0 -1
- package/dist/gateway/index.cjs +0 -16
- package/dist/gateway/index.cjs.map +0 -1
- package/dist/gateway/index.d.cts +0 -52
- package/dist/gateway/index.d.ts +0 -52
- package/dist/gateway/index.js +0 -10
- package/dist/gateway/index.js.map +0 -1
- package/dist/gateway/server/index.cjs +0 -1248
- package/dist/gateway/server/index.cjs.map +0 -1
- package/dist/gateway/server/index.d.cts +0 -31
- package/dist/gateway/server/index.d.ts +0 -31
- package/dist/gateway/server/index.js +0 -1233
- package/dist/gateway/server/index.js.map +0 -1
- package/gateway/proto/lp_rpc.proto +0 -542
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/errors.ts
|
|
4
|
+
var PmtHouseError = class extends Error {
|
|
5
|
+
status;
|
|
6
|
+
code;
|
|
7
|
+
details;
|
|
8
|
+
constructor(message, {
|
|
9
|
+
status = 500,
|
|
10
|
+
code = "pymthouse_error",
|
|
11
|
+
details
|
|
12
|
+
} = {}) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "PmtHouseError";
|
|
15
|
+
this.status = status;
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.details = details;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// src/signer/webhook/bearer.ts
|
|
22
|
+
var BEARER_PREFIX = "Bearer ";
|
|
23
|
+
function optionalBearerToken(authorization) {
|
|
24
|
+
const trimmed = authorization.trim();
|
|
25
|
+
if (!trimmed.startsWith(BEARER_PREFIX)) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const token = trimmed.slice(BEARER_PREFIX.length).trim();
|
|
29
|
+
return token || null;
|
|
30
|
+
}
|
|
31
|
+
function bearerTokenFromAuthorization(authorization) {
|
|
32
|
+
const token = optionalBearerToken(authorization);
|
|
33
|
+
if (token) {
|
|
34
|
+
return token;
|
|
35
|
+
}
|
|
36
|
+
if (!authorization.trim()) {
|
|
37
|
+
throw new Error("missing authorization");
|
|
38
|
+
}
|
|
39
|
+
throw new Error("authorization must be Bearer token");
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// src/signer/webhook/adapters/api-key/verifier.ts
|
|
43
|
+
function createApiKeyEndUserVerifier(config) {
|
|
44
|
+
const prefix = config.apiKeyPrefix ?? "sk_";
|
|
45
|
+
const defaultClientId = config.defaultClientId ?? "daydream-scope";
|
|
46
|
+
const defaultUsageSubjectType = config.defaultUsageSubjectType ?? "clerk_user_id";
|
|
47
|
+
const ttl = config.expiryTtlSeconds ?? 60;
|
|
48
|
+
return {
|
|
49
|
+
kind: "custom",
|
|
50
|
+
verify: async ({ authorization }) => {
|
|
51
|
+
const token = bearerTokenFromAuthorization(authorization);
|
|
52
|
+
if (prefix && !token.startsWith(prefix)) {
|
|
53
|
+
throw new PmtHouseError("invalid api key", {
|
|
54
|
+
status: 401,
|
|
55
|
+
code: "invalid_api_key"
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
const resolved = await config.resolveApiKey(token);
|
|
59
|
+
if (!resolved?.userId) {
|
|
60
|
+
throw new PmtHouseError("invalid api key", {
|
|
61
|
+
status: 401,
|
|
62
|
+
code: "invalid_api_key"
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const identity = {
|
|
66
|
+
issuer: config.issuer,
|
|
67
|
+
client_id: resolved.clientId ?? defaultClientId,
|
|
68
|
+
usage_subject: resolved.userId,
|
|
69
|
+
usage_subject_type: resolved.usageSubjectType ?? defaultUsageSubjectType
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
identity,
|
|
73
|
+
expiry: Math.trunc(Date.now() / 1e3) + ttl,
|
|
74
|
+
raw: resolved
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
exports.createApiKeyEndUserVerifier = createApiKeyEndUserVerifier;
|
|
81
|
+
//# sourceMappingURL=api-key.cjs.map
|
|
82
|
+
//# sourceMappingURL=api-key.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/errors.ts","../../../../src/signer/webhook/bearer.ts","../../../../src/signer/webhook/adapters/api-key/verifier.ts"],"names":[],"mappings":";;;AAAO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EAC9B,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YACE,OAAA,EACA;AAAA,IACE,MAAA,GAAS,GAAA;AAAA,IACT,IAAA,GAAO,iBAAA;AAAA,IACP;AAAA,GACF,GAII,EAAC,EACL;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF,CAAA;;;ACvBA,IAAM,aAAA,GAAgB,SAAA;AAGf,SAAS,oBAAoB,aAAA,EAAsC;AACxE,EAAA,MAAM,OAAA,GAAU,cAAc,IAAA,EAAK;AACnC,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,aAAa,CAAA,EAAG;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,aAAA,CAAc,MAAM,EAAE,IAAA,EAAK;AACvD,EAAA,OAAO,KAAA,IAAS,IAAA;AAClB;AAEO,SAAS,6BAA6B,aAAA,EAA+B;AAC1E,EAAA,MAAM,KAAA,GAAQ,oBAAoB,aAAa,CAAA;AAC/C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,aAAA,CAAc,IAAA,EAAK,EAAG;AACzB,IAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,EACzC;AACA,EAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AACtD;;;ACDO,SAAS,4BACd,MAAA,EACqB;AACrB,EAAA,MAAM,MAAA,GAAS,OAAO,YAAA,IAAgB,KAAA;AACtC,EAAA,MAAM,eAAA,GAAkB,OAAO,eAAA,IAAmB,gBAAA;AAClD,EAAA,MAAM,uBAAA,GACJ,OAAO,uBAAA,IAA2B,eAAA;AACpC,EAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,EAAA;AAEvC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,OAAO,EAAE,aAAA,EAAc,KAAM;AACnC,MAAA,MAAM,KAAA,GAAQ,6BAA6B,aAAa,CAAA;AACxD,MAAA,IAAI,MAAA,IAAU,CAAC,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,EAAG;AACvC,QAAA,MAAM,IAAI,cAAc,iBAAA,EAAmB;AAAA,UACzC,MAAA,EAAQ,GAAA;AAAA,UACR,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,aAAA,CAAc,KAAK,CAAA;AACjD,MAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACrB,QAAA,MAAM,IAAI,cAAc,iBAAA,EAAmB;AAAA,UACzC,MAAA,EAAQ,GAAA;AAAA,UACR,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC9B,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,SAAA,EAAW,SAAS,QAAA,IAAY,eAAA;AAAA,QAChC,eAAe,QAAA,CAAS,MAAA;AAAA,QACxB,kBAAA,EACE,SAAS,gBAAA,IAAoB;AAAA,OACjC;AAEA,MAAA,OAAO;AAAA,QACL,QAAA;AAAA,QACA,QAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAA,GAAI,GAAA;AAAA,QACxC,GAAA,EAAK;AAAA,OACP;AAAA,IACF;AAAA,GACF;AACF","file":"api-key.cjs","sourcesContent":["export class PmtHouseError extends Error {\n readonly status: number;\n readonly code: string;\n readonly details?: unknown;\n\n constructor(\n message: string,\n {\n status = 500,\n code = \"pymthouse_error\",\n details,\n }: {\n status?: number;\n code?: string;\n details?: unknown;\n } = {},\n ) {\n super(message);\n this.name = \"PmtHouseError\";\n this.status = status;\n this.code = code;\n this.details = details;\n }\n}\n\nexport function toPmtHouseError(\n error: unknown,\n fallbackMessage: string,\n): PmtHouseError {\n if (error instanceof PmtHouseError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new PmtHouseError(error.message || fallbackMessage, {\n code: \"unexpected_error\",\n status: 500,\n });\n }\n\n return new PmtHouseError(fallbackMessage, {\n code: \"unexpected_error\",\n status: 500,\n });\n}\n","const BEARER_PREFIX = \"Bearer \";\n\n/** Returns the token after `Bearer `, or null when the header is missing or not Bearer. */\nexport function optionalBearerToken(authorization: string): string | null {\n const trimmed = authorization.trim();\n if (!trimmed.startsWith(BEARER_PREFIX)) {\n return null;\n }\n const token = trimmed.slice(BEARER_PREFIX.length).trim();\n return token || null;\n}\n\nexport function bearerTokenFromAuthorization(authorization: string): string {\n const token = optionalBearerToken(authorization);\n if (token) {\n return token;\n }\n if (!authorization.trim()) {\n throw new Error(\"missing authorization\");\n }\n throw new Error(\"authorization must be Bearer token\");\n}\n","import { PmtHouseError } from \"../../../../errors.js\";\nimport { bearerTokenFromAuthorization } from \"../../bearer.js\";\nimport type { UsageIdentity } from \"../../types.js\";\nimport type { EndUserAuthVerifier } from \"../../verifier.js\";\n\nexport type ApiKeyResolveResult = {\n userId: string;\n clientId?: string;\n usageSubjectType?: string;\n};\n\nexport type ApiKeyEndUserVerifierConfig = {\n issuer: string;\n resolveApiKey: (apiKey: string) => Promise<ApiKeyResolveResult | null>;\n expiryTtlSeconds?: number;\n apiKeyPrefix?: string;\n defaultClientId?: string;\n defaultUsageSubjectType?: string;\n};\n\nexport function createApiKeyEndUserVerifier(\n config: ApiKeyEndUserVerifierConfig,\n): EndUserAuthVerifier {\n const prefix = config.apiKeyPrefix ?? \"sk_\";\n const defaultClientId = config.defaultClientId ?? \"daydream-scope\";\n const defaultUsageSubjectType =\n config.defaultUsageSubjectType ?? \"clerk_user_id\";\n const ttl = config.expiryTtlSeconds ?? 60;\n\n return {\n kind: \"custom\",\n verify: async ({ authorization }) => {\n const token = bearerTokenFromAuthorization(authorization);\n if (prefix && !token.startsWith(prefix)) {\n throw new PmtHouseError(\"invalid api key\", {\n status: 401,\n code: \"invalid_api_key\",\n });\n }\n\n const resolved = await config.resolveApiKey(token);\n if (!resolved?.userId) {\n throw new PmtHouseError(\"invalid api key\", {\n status: 401,\n code: \"invalid_api_key\",\n });\n }\n\n const identity: UsageIdentity = {\n issuer: config.issuer,\n client_id: resolved.clientId ?? defaultClientId,\n usage_subject: resolved.userId,\n usage_subject_type:\n resolved.usageSubjectType ?? defaultUsageSubjectType,\n };\n\n return {\n identity,\n expiry: Math.trunc(Date.now() / 1000) + ttl,\n raw: resolved,\n };\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { E as EndUserAuthVerifier } from '../../../verifier-B-WFDMz6.cjs';
|
|
2
|
+
|
|
3
|
+
type ApiKeyResolveResult = {
|
|
4
|
+
userId: string;
|
|
5
|
+
clientId?: string;
|
|
6
|
+
usageSubjectType?: string;
|
|
7
|
+
};
|
|
8
|
+
type ApiKeyEndUserVerifierConfig = {
|
|
9
|
+
issuer: string;
|
|
10
|
+
resolveApiKey: (apiKey: string) => Promise<ApiKeyResolveResult | null>;
|
|
11
|
+
expiryTtlSeconds?: number;
|
|
12
|
+
apiKeyPrefix?: string;
|
|
13
|
+
defaultClientId?: string;
|
|
14
|
+
defaultUsageSubjectType?: string;
|
|
15
|
+
};
|
|
16
|
+
declare function createApiKeyEndUserVerifier(config: ApiKeyEndUserVerifierConfig): EndUserAuthVerifier;
|
|
17
|
+
|
|
18
|
+
export { type ApiKeyEndUserVerifierConfig, type ApiKeyResolveResult, createApiKeyEndUserVerifier };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { E as EndUserAuthVerifier } from '../../../verifier-B-WFDMz6.js';
|
|
2
|
+
|
|
3
|
+
type ApiKeyResolveResult = {
|
|
4
|
+
userId: string;
|
|
5
|
+
clientId?: string;
|
|
6
|
+
usageSubjectType?: string;
|
|
7
|
+
};
|
|
8
|
+
type ApiKeyEndUserVerifierConfig = {
|
|
9
|
+
issuer: string;
|
|
10
|
+
resolveApiKey: (apiKey: string) => Promise<ApiKeyResolveResult | null>;
|
|
11
|
+
expiryTtlSeconds?: number;
|
|
12
|
+
apiKeyPrefix?: string;
|
|
13
|
+
defaultClientId?: string;
|
|
14
|
+
defaultUsageSubjectType?: string;
|
|
15
|
+
};
|
|
16
|
+
declare function createApiKeyEndUserVerifier(config: ApiKeyEndUserVerifierConfig): EndUserAuthVerifier;
|
|
17
|
+
|
|
18
|
+
export { type ApiKeyEndUserVerifierConfig, type ApiKeyResolveResult, createApiKeyEndUserVerifier };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
var PmtHouseError = class extends Error {
|
|
3
|
+
status;
|
|
4
|
+
code;
|
|
5
|
+
details;
|
|
6
|
+
constructor(message, {
|
|
7
|
+
status = 500,
|
|
8
|
+
code = "pymthouse_error",
|
|
9
|
+
details
|
|
10
|
+
} = {}) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = "PmtHouseError";
|
|
13
|
+
this.status = status;
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.details = details;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// src/signer/webhook/bearer.ts
|
|
20
|
+
var BEARER_PREFIX = "Bearer ";
|
|
21
|
+
function optionalBearerToken(authorization) {
|
|
22
|
+
const trimmed = authorization.trim();
|
|
23
|
+
if (!trimmed.startsWith(BEARER_PREFIX)) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const token = trimmed.slice(BEARER_PREFIX.length).trim();
|
|
27
|
+
return token || null;
|
|
28
|
+
}
|
|
29
|
+
function bearerTokenFromAuthorization(authorization) {
|
|
30
|
+
const token = optionalBearerToken(authorization);
|
|
31
|
+
if (token) {
|
|
32
|
+
return token;
|
|
33
|
+
}
|
|
34
|
+
if (!authorization.trim()) {
|
|
35
|
+
throw new Error("missing authorization");
|
|
36
|
+
}
|
|
37
|
+
throw new Error("authorization must be Bearer token");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// src/signer/webhook/adapters/api-key/verifier.ts
|
|
41
|
+
function createApiKeyEndUserVerifier(config) {
|
|
42
|
+
const prefix = config.apiKeyPrefix ?? "sk_";
|
|
43
|
+
const defaultClientId = config.defaultClientId ?? "daydream-scope";
|
|
44
|
+
const defaultUsageSubjectType = config.defaultUsageSubjectType ?? "clerk_user_id";
|
|
45
|
+
const ttl = config.expiryTtlSeconds ?? 60;
|
|
46
|
+
return {
|
|
47
|
+
kind: "custom",
|
|
48
|
+
verify: async ({ authorization }) => {
|
|
49
|
+
const token = bearerTokenFromAuthorization(authorization);
|
|
50
|
+
if (prefix && !token.startsWith(prefix)) {
|
|
51
|
+
throw new PmtHouseError("invalid api key", {
|
|
52
|
+
status: 401,
|
|
53
|
+
code: "invalid_api_key"
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const resolved = await config.resolveApiKey(token);
|
|
57
|
+
if (!resolved?.userId) {
|
|
58
|
+
throw new PmtHouseError("invalid api key", {
|
|
59
|
+
status: 401,
|
|
60
|
+
code: "invalid_api_key"
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const identity = {
|
|
64
|
+
issuer: config.issuer,
|
|
65
|
+
client_id: resolved.clientId ?? defaultClientId,
|
|
66
|
+
usage_subject: resolved.userId,
|
|
67
|
+
usage_subject_type: resolved.usageSubjectType ?? defaultUsageSubjectType
|
|
68
|
+
};
|
|
69
|
+
return {
|
|
70
|
+
identity,
|
|
71
|
+
expiry: Math.trunc(Date.now() / 1e3) + ttl,
|
|
72
|
+
raw: resolved
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { createApiKeyEndUserVerifier };
|
|
79
|
+
//# sourceMappingURL=api-key.js.map
|
|
80
|
+
//# sourceMappingURL=api-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/errors.ts","../../../../src/signer/webhook/bearer.ts","../../../../src/signer/webhook/adapters/api-key/verifier.ts"],"names":[],"mappings":";AAAO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EAC9B,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YACE,OAAA,EACA;AAAA,IACE,MAAA,GAAS,GAAA;AAAA,IACT,IAAA,GAAO,iBAAA;AAAA,IACP;AAAA,GACF,GAII,EAAC,EACL;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF,CAAA;;;ACvBA,IAAM,aAAA,GAAgB,SAAA;AAGf,SAAS,oBAAoB,aAAA,EAAsC;AACxE,EAAA,MAAM,OAAA,GAAU,cAAc,IAAA,EAAK;AACnC,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,aAAa,CAAA,EAAG;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,aAAA,CAAc,MAAM,EAAE,IAAA,EAAK;AACvD,EAAA,OAAO,KAAA,IAAS,IAAA;AAClB;AAEO,SAAS,6BAA6B,aAAA,EAA+B;AAC1E,EAAA,MAAM,KAAA,GAAQ,oBAAoB,aAAa,CAAA;AAC/C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,aAAA,CAAc,IAAA,EAAK,EAAG;AACzB,IAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,EACzC;AACA,EAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AACtD;;;ACDO,SAAS,4BACd,MAAA,EACqB;AACrB,EAAA,MAAM,MAAA,GAAS,OAAO,YAAA,IAAgB,KAAA;AACtC,EAAA,MAAM,eAAA,GAAkB,OAAO,eAAA,IAAmB,gBAAA;AAClD,EAAA,MAAM,uBAAA,GACJ,OAAO,uBAAA,IAA2B,eAAA;AACpC,EAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,EAAA;AAEvC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,OAAO,EAAE,aAAA,EAAc,KAAM;AACnC,MAAA,MAAM,KAAA,GAAQ,6BAA6B,aAAa,CAAA;AACxD,MAAA,IAAI,MAAA,IAAU,CAAC,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,EAAG;AACvC,QAAA,MAAM,IAAI,cAAc,iBAAA,EAAmB;AAAA,UACzC,MAAA,EAAQ,GAAA;AAAA,UACR,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,aAAA,CAAc,KAAK,CAAA;AACjD,MAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACrB,QAAA,MAAM,IAAI,cAAc,iBAAA,EAAmB;AAAA,UACzC,MAAA,EAAQ,GAAA;AAAA,UACR,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC9B,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,SAAA,EAAW,SAAS,QAAA,IAAY,eAAA;AAAA,QAChC,eAAe,QAAA,CAAS,MAAA;AAAA,QACxB,kBAAA,EACE,SAAS,gBAAA,IAAoB;AAAA,OACjC;AAEA,MAAA,OAAO;AAAA,QACL,QAAA;AAAA,QACA,QAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAA,GAAI,GAAA;AAAA,QACxC,GAAA,EAAK;AAAA,OACP;AAAA,IACF;AAAA,GACF;AACF","file":"api-key.js","sourcesContent":["export class PmtHouseError extends Error {\n readonly status: number;\n readonly code: string;\n readonly details?: unknown;\n\n constructor(\n message: string,\n {\n status = 500,\n code = \"pymthouse_error\",\n details,\n }: {\n status?: number;\n code?: string;\n details?: unknown;\n } = {},\n ) {\n super(message);\n this.name = \"PmtHouseError\";\n this.status = status;\n this.code = code;\n this.details = details;\n }\n}\n\nexport function toPmtHouseError(\n error: unknown,\n fallbackMessage: string,\n): PmtHouseError {\n if (error instanceof PmtHouseError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new PmtHouseError(error.message || fallbackMessage, {\n code: \"unexpected_error\",\n status: 500,\n });\n }\n\n return new PmtHouseError(fallbackMessage, {\n code: \"unexpected_error\",\n status: 500,\n });\n}\n","const BEARER_PREFIX = \"Bearer \";\n\n/** Returns the token after `Bearer `, or null when the header is missing or not Bearer. */\nexport function optionalBearerToken(authorization: string): string | null {\n const trimmed = authorization.trim();\n if (!trimmed.startsWith(BEARER_PREFIX)) {\n return null;\n }\n const token = trimmed.slice(BEARER_PREFIX.length).trim();\n return token || null;\n}\n\nexport function bearerTokenFromAuthorization(authorization: string): string {\n const token = optionalBearerToken(authorization);\n if (token) {\n return token;\n }\n if (!authorization.trim()) {\n throw new Error(\"missing authorization\");\n }\n throw new Error(\"authorization must be Bearer token\");\n}\n","import { PmtHouseError } from \"../../../../errors.js\";\nimport { bearerTokenFromAuthorization } from \"../../bearer.js\";\nimport type { UsageIdentity } from \"../../types.js\";\nimport type { EndUserAuthVerifier } from \"../../verifier.js\";\n\nexport type ApiKeyResolveResult = {\n userId: string;\n clientId?: string;\n usageSubjectType?: string;\n};\n\nexport type ApiKeyEndUserVerifierConfig = {\n issuer: string;\n resolveApiKey: (apiKey: string) => Promise<ApiKeyResolveResult | null>;\n expiryTtlSeconds?: number;\n apiKeyPrefix?: string;\n defaultClientId?: string;\n defaultUsageSubjectType?: string;\n};\n\nexport function createApiKeyEndUserVerifier(\n config: ApiKeyEndUserVerifierConfig,\n): EndUserAuthVerifier {\n const prefix = config.apiKeyPrefix ?? \"sk_\";\n const defaultClientId = config.defaultClientId ?? \"daydream-scope\";\n const defaultUsageSubjectType =\n config.defaultUsageSubjectType ?? \"clerk_user_id\";\n const ttl = config.expiryTtlSeconds ?? 60;\n\n return {\n kind: \"custom\",\n verify: async ({ authorization }) => {\n const token = bearerTokenFromAuthorization(authorization);\n if (prefix && !token.startsWith(prefix)) {\n throw new PmtHouseError(\"invalid api key\", {\n status: 401,\n code: \"invalid_api_key\",\n });\n }\n\n const resolved = await config.resolveApiKey(token);\n if (!resolved?.userId) {\n throw new PmtHouseError(\"invalid api key\", {\n status: 401,\n code: \"invalid_api_key\",\n });\n }\n\n const identity: UsageIdentity = {\n issuer: config.issuer,\n client_id: resolved.clientId ?? defaultClientId,\n usage_subject: resolved.userId,\n usage_subject_type:\n resolved.usageSubjectType ?? defaultUsageSubjectType,\n };\n\n return {\n identity,\n expiry: Math.trunc(Date.now() / 1000) + ttl,\n raw: resolved,\n };\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/errors.ts
|
|
4
|
+
var PmtHouseError = class extends Error {
|
|
5
|
+
status;
|
|
6
|
+
code;
|
|
7
|
+
details;
|
|
8
|
+
constructor(message, {
|
|
9
|
+
status = 500,
|
|
10
|
+
code = "pymthouse_error",
|
|
11
|
+
details
|
|
12
|
+
} = {}) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "PmtHouseError";
|
|
15
|
+
this.status = status;
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.details = details;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// src/signer/webhook/adapters/composite/verifier.ts
|
|
22
|
+
function createFirstMatchEndUserVerifier(verifiers) {
|
|
23
|
+
if (verifiers.length === 0) {
|
|
24
|
+
throw new PmtHouseError("at least one verifier is required", {
|
|
25
|
+
status: 500,
|
|
26
|
+
code: "invalid_verifier_config"
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
kind: "custom",
|
|
31
|
+
verify: async (context) => {
|
|
32
|
+
let lastError;
|
|
33
|
+
for (const verifier of verifiers) {
|
|
34
|
+
try {
|
|
35
|
+
return await verifier.verify(context);
|
|
36
|
+
} catch (err) {
|
|
37
|
+
lastError = err;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (lastError instanceof PmtHouseError) {
|
|
41
|
+
throw lastError;
|
|
42
|
+
}
|
|
43
|
+
if (lastError instanceof Error) {
|
|
44
|
+
throw new PmtHouseError(lastError.message, {
|
|
45
|
+
status: 401,
|
|
46
|
+
code: "invalid_credentials"
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
throw new PmtHouseError("invalid credentials", {
|
|
50
|
+
status: 401,
|
|
51
|
+
code: "invalid_credentials"
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
adminRoutes: verifiers.flatMap((verifier) => verifier.adminRoutes ?? [])
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
exports.createFirstMatchEndUserVerifier = createFirstMatchEndUserVerifier;
|
|
59
|
+
//# sourceMappingURL=composite.cjs.map
|
|
60
|
+
//# sourceMappingURL=composite.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/errors.ts","../../../../src/signer/webhook/adapters/composite/verifier.ts"],"names":[],"mappings":";;;AAAO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EAC9B,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YACE,OAAA,EACA;AAAA,IACE,MAAA,GAAS,GAAA;AAAA,IACT,IAAA,GAAO,iBAAA;AAAA,IACP;AAAA,GACF,GAII,EAAC,EACL;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF,CAAA;;;ACpBO,SAAS,gCACd,SAAA,EACqB;AACrB,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,cAAc,mCAAA,EAAqC;AAAA,MAC3D,MAAA,EAAQ,GAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,OAAO,OAAA,KAAY;AACzB,MAAA,IAAI,SAAA;AACJ,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA;AAAA,QACtC,SAAS,GAAA,EAAK;AACZ,UAAA,SAAA,GAAY,GAAA;AAAA,QACd;AAAA,MACF;AAEA,MAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,QAAA,MAAM,SAAA;AAAA,MACR;AACA,MAAA,IAAI,qBAAqB,KAAA,EAAO;AAC9B,QAAA,MAAM,IAAI,aAAA,CAAc,SAAA,CAAU,OAAA,EAAS;AAAA,UACzC,MAAA,EAAQ,GAAA;AAAA,UACR,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AACA,MAAA,MAAM,IAAI,cAAc,qBAAA,EAAuB;AAAA,QAC7C,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IACA,WAAA,EAAa,UAAU,OAAA,CAAQ,CAAC,aAAa,QAAA,CAAS,WAAA,IAAe,EAAE;AAAA,GACzE;AACF","file":"composite.cjs","sourcesContent":["export class PmtHouseError extends Error {\n readonly status: number;\n readonly code: string;\n readonly details?: unknown;\n\n constructor(\n message: string,\n {\n status = 500,\n code = \"pymthouse_error\",\n details,\n }: {\n status?: number;\n code?: string;\n details?: unknown;\n } = {},\n ) {\n super(message);\n this.name = \"PmtHouseError\";\n this.status = status;\n this.code = code;\n this.details = details;\n }\n}\n\nexport function toPmtHouseError(\n error: unknown,\n fallbackMessage: string,\n): PmtHouseError {\n if (error instanceof PmtHouseError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new PmtHouseError(error.message || fallbackMessage, {\n code: \"unexpected_error\",\n status: 500,\n });\n }\n\n return new PmtHouseError(fallbackMessage, {\n code: \"unexpected_error\",\n status: 500,\n });\n}\n","import { PmtHouseError } from \"../../../../errors.js\";\nimport type { EndUserAuthVerifier } from \"../../verifier.js\";\n\nexport function createFirstMatchEndUserVerifier(\n verifiers: EndUserAuthVerifier[],\n): EndUserAuthVerifier {\n if (verifiers.length === 0) {\n throw new PmtHouseError(\"at least one verifier is required\", {\n status: 500,\n code: \"invalid_verifier_config\",\n });\n }\n\n return {\n kind: \"custom\",\n verify: async (context) => {\n let lastError: unknown;\n for (const verifier of verifiers) {\n try {\n return await verifier.verify(context);\n } catch (err) {\n lastError = err;\n }\n }\n\n if (lastError instanceof PmtHouseError) {\n throw lastError;\n }\n if (lastError instanceof Error) {\n throw new PmtHouseError(lastError.message, {\n status: 401,\n code: \"invalid_credentials\",\n });\n }\n throw new PmtHouseError(\"invalid credentials\", {\n status: 401,\n code: \"invalid_credentials\",\n });\n },\n adminRoutes: verifiers.flatMap((verifier) => verifier.adminRoutes ?? []),\n };\n}\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
var PmtHouseError = class extends Error {
|
|
3
|
+
status;
|
|
4
|
+
code;
|
|
5
|
+
details;
|
|
6
|
+
constructor(message, {
|
|
7
|
+
status = 500,
|
|
8
|
+
code = "pymthouse_error",
|
|
9
|
+
details
|
|
10
|
+
} = {}) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = "PmtHouseError";
|
|
13
|
+
this.status = status;
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.details = details;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// src/signer/webhook/adapters/composite/verifier.ts
|
|
20
|
+
function createFirstMatchEndUserVerifier(verifiers) {
|
|
21
|
+
if (verifiers.length === 0) {
|
|
22
|
+
throw new PmtHouseError("at least one verifier is required", {
|
|
23
|
+
status: 500,
|
|
24
|
+
code: "invalid_verifier_config"
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
kind: "custom",
|
|
29
|
+
verify: async (context) => {
|
|
30
|
+
let lastError;
|
|
31
|
+
for (const verifier of verifiers) {
|
|
32
|
+
try {
|
|
33
|
+
return await verifier.verify(context);
|
|
34
|
+
} catch (err) {
|
|
35
|
+
lastError = err;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (lastError instanceof PmtHouseError) {
|
|
39
|
+
throw lastError;
|
|
40
|
+
}
|
|
41
|
+
if (lastError instanceof Error) {
|
|
42
|
+
throw new PmtHouseError(lastError.message, {
|
|
43
|
+
status: 401,
|
|
44
|
+
code: "invalid_credentials"
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
throw new PmtHouseError("invalid credentials", {
|
|
48
|
+
status: 401,
|
|
49
|
+
code: "invalid_credentials"
|
|
50
|
+
});
|
|
51
|
+
},
|
|
52
|
+
adminRoutes: verifiers.flatMap((verifier) => verifier.adminRoutes ?? [])
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { createFirstMatchEndUserVerifier };
|
|
57
|
+
//# sourceMappingURL=composite.js.map
|
|
58
|
+
//# sourceMappingURL=composite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/errors.ts","../../../../src/signer/webhook/adapters/composite/verifier.ts"],"names":[],"mappings":";AAAO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EAC9B,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YACE,OAAA,EACA;AAAA,IACE,MAAA,GAAS,GAAA;AAAA,IACT,IAAA,GAAO,iBAAA;AAAA,IACP;AAAA,GACF,GAII,EAAC,EACL;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF,CAAA;;;ACpBO,SAAS,gCACd,SAAA,EACqB;AACrB,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,cAAc,mCAAA,EAAqC;AAAA,MAC3D,MAAA,EAAQ,GAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,OAAO,OAAA,KAAY;AACzB,MAAA,IAAI,SAAA;AACJ,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA;AAAA,QACtC,SAAS,GAAA,EAAK;AACZ,UAAA,SAAA,GAAY,GAAA;AAAA,QACd;AAAA,MACF;AAEA,MAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,QAAA,MAAM,SAAA;AAAA,MACR;AACA,MAAA,IAAI,qBAAqB,KAAA,EAAO;AAC9B,QAAA,MAAM,IAAI,aAAA,CAAc,SAAA,CAAU,OAAA,EAAS;AAAA,UACzC,MAAA,EAAQ,GAAA;AAAA,UACR,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AACA,MAAA,MAAM,IAAI,cAAc,qBAAA,EAAuB;AAAA,QAC7C,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IACA,WAAA,EAAa,UAAU,OAAA,CAAQ,CAAC,aAAa,QAAA,CAAS,WAAA,IAAe,EAAE;AAAA,GACzE;AACF","file":"composite.js","sourcesContent":["export class PmtHouseError extends Error {\n readonly status: number;\n readonly code: string;\n readonly details?: unknown;\n\n constructor(\n message: string,\n {\n status = 500,\n code = \"pymthouse_error\",\n details,\n }: {\n status?: number;\n code?: string;\n details?: unknown;\n } = {},\n ) {\n super(message);\n this.name = \"PmtHouseError\";\n this.status = status;\n this.code = code;\n this.details = details;\n }\n}\n\nexport function toPmtHouseError(\n error: unknown,\n fallbackMessage: string,\n): PmtHouseError {\n if (error instanceof PmtHouseError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new PmtHouseError(error.message || fallbackMessage, {\n code: \"unexpected_error\",\n status: 500,\n });\n }\n\n return new PmtHouseError(fallbackMessage, {\n code: \"unexpected_error\",\n status: 500,\n });\n}\n","import { PmtHouseError } from \"../../../../errors.js\";\nimport type { EndUserAuthVerifier } from \"../../verifier.js\";\n\nexport function createFirstMatchEndUserVerifier(\n verifiers: EndUserAuthVerifier[],\n): EndUserAuthVerifier {\n if (verifiers.length === 0) {\n throw new PmtHouseError(\"at least one verifier is required\", {\n status: 500,\n code: \"invalid_verifier_config\",\n });\n }\n\n return {\n kind: \"custom\",\n verify: async (context) => {\n let lastError: unknown;\n for (const verifier of verifiers) {\n try {\n return await verifier.verify(context);\n } catch (err) {\n lastError = err;\n }\n }\n\n if (lastError instanceof PmtHouseError) {\n throw lastError;\n }\n if (lastError instanceof Error) {\n throw new PmtHouseError(lastError.message, {\n status: 401,\n code: \"invalid_credentials\",\n });\n }\n throw new PmtHouseError(\"invalid credentials\", {\n status: 401,\n code: \"invalid_credentials\",\n });\n },\n adminRoutes: verifiers.flatMap((verifier) => verifier.adminRoutes ?? []),\n };\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/signer/webhook/adapters/oauth1/verifier.ts
|
|
4
|
+
function createOAuth1EndUserVerifier(config) {
|
|
5
|
+
return {
|
|
6
|
+
kind: "oauth1",
|
|
7
|
+
verify: async () => {
|
|
8
|
+
if (!config.consumerKey.trim() || !config.consumerSecret.trim()) {
|
|
9
|
+
throw new Error("OAuth 1.0 consumer credentials are required");
|
|
10
|
+
}
|
|
11
|
+
throw new Error("OAuth 1.0 webhook verification is not implemented yet");
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
exports.createOAuth1EndUserVerifier = createOAuth1EndUserVerifier;
|
|
17
|
+
//# sourceMappingURL=oauth1.cjs.map
|
|
18
|
+
//# sourceMappingURL=oauth1.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/signer/webhook/adapters/oauth1/verifier.ts"],"names":[],"mappings":";;;AAkBO,SAAS,4BACd,MAAA,EACqB;AACrB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,QAAQ,YAAY;AAClB,MAAA,IAAI,CAAC,OAAO,WAAA,CAAY,IAAA,MAAU,CAAC,MAAA,CAAO,cAAA,CAAe,IAAA,EAAK,EAAG;AAC/D,QAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,MAC/D;AACA,MAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,IACzE;AAAA,GACF;AACF","file":"oauth1.cjs","sourcesContent":["import type { UsageIdentity } from \"../../types.js\";\nimport type { EndUserAuthVerifier } from \"../../verifier.js\";\n\nexport type OAuth1EndUserAuthConfig = {\n consumerKey: string;\n consumerSecret: string;\n /** Resolve oauth_token → UsageIdentity (platform-owned store). */\n resolveIdentity: (oauthToken: string) => Promise<UsageIdentity>;\n tokenSecretLookup?: (oauthToken: string) => Promise<string | undefined>;\n};\n\n/**\n * OAuth 1.0a end-user auth verifier (stub).\n *\n * A full implementation will parse `Authorization: OAuth …` from\n * `context.authorization`, validate the signature using `context.payload.headers`\n * and the request URL, then call `resolveIdentity`.\n */\nexport function createOAuth1EndUserVerifier(\n config: OAuth1EndUserAuthConfig,\n): EndUserAuthVerifier {\n return {\n kind: \"oauth1\",\n verify: async () => {\n if (!config.consumerKey.trim() || !config.consumerSecret.trim()) {\n throw new Error(\"OAuth 1.0 consumer credentials are required\");\n }\n throw new Error(\"OAuth 1.0 webhook verification is not implemented yet\");\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { U as UsageIdentity, E as EndUserAuthVerifier } from '../../../verifier-B-WFDMz6.cjs';
|
|
2
|
+
|
|
3
|
+
type OAuth1EndUserAuthConfig = {
|
|
4
|
+
consumerKey: string;
|
|
5
|
+
consumerSecret: string;
|
|
6
|
+
/** Resolve oauth_token → UsageIdentity (platform-owned store). */
|
|
7
|
+
resolveIdentity: (oauthToken: string) => Promise<UsageIdentity>;
|
|
8
|
+
tokenSecretLookup?: (oauthToken: string) => Promise<string | undefined>;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* OAuth 1.0a end-user auth verifier (stub).
|
|
12
|
+
*
|
|
13
|
+
* A full implementation will parse `Authorization: OAuth …` from
|
|
14
|
+
* `context.authorization`, validate the signature using `context.payload.headers`
|
|
15
|
+
* and the request URL, then call `resolveIdentity`.
|
|
16
|
+
*/
|
|
17
|
+
declare function createOAuth1EndUserVerifier(config: OAuth1EndUserAuthConfig): EndUserAuthVerifier;
|
|
18
|
+
|
|
19
|
+
export { type OAuth1EndUserAuthConfig, createOAuth1EndUserVerifier };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { U as UsageIdentity, E as EndUserAuthVerifier } from '../../../verifier-B-WFDMz6.js';
|
|
2
|
+
|
|
3
|
+
type OAuth1EndUserAuthConfig = {
|
|
4
|
+
consumerKey: string;
|
|
5
|
+
consumerSecret: string;
|
|
6
|
+
/** Resolve oauth_token → UsageIdentity (platform-owned store). */
|
|
7
|
+
resolveIdentity: (oauthToken: string) => Promise<UsageIdentity>;
|
|
8
|
+
tokenSecretLookup?: (oauthToken: string) => Promise<string | undefined>;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* OAuth 1.0a end-user auth verifier (stub).
|
|
12
|
+
*
|
|
13
|
+
* A full implementation will parse `Authorization: OAuth …` from
|
|
14
|
+
* `context.authorization`, validate the signature using `context.payload.headers`
|
|
15
|
+
* and the request URL, then call `resolveIdentity`.
|
|
16
|
+
*/
|
|
17
|
+
declare function createOAuth1EndUserVerifier(config: OAuth1EndUserAuthConfig): EndUserAuthVerifier;
|
|
18
|
+
|
|
19
|
+
export { type OAuth1EndUserAuthConfig, createOAuth1EndUserVerifier };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// src/signer/webhook/adapters/oauth1/verifier.ts
|
|
2
|
+
function createOAuth1EndUserVerifier(config) {
|
|
3
|
+
return {
|
|
4
|
+
kind: "oauth1",
|
|
5
|
+
verify: async () => {
|
|
6
|
+
if (!config.consumerKey.trim() || !config.consumerSecret.trim()) {
|
|
7
|
+
throw new Error("OAuth 1.0 consumer credentials are required");
|
|
8
|
+
}
|
|
9
|
+
throw new Error("OAuth 1.0 webhook verification is not implemented yet");
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { createOAuth1EndUserVerifier };
|
|
15
|
+
//# sourceMappingURL=oauth1.js.map
|
|
16
|
+
//# sourceMappingURL=oauth1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/signer/webhook/adapters/oauth1/verifier.ts"],"names":[],"mappings":";AAkBO,SAAS,4BACd,MAAA,EACqB;AACrB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,QAAQ,YAAY;AAClB,MAAA,IAAI,CAAC,OAAO,WAAA,CAAY,IAAA,MAAU,CAAC,MAAA,CAAO,cAAA,CAAe,IAAA,EAAK,EAAG;AAC/D,QAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,MAC/D;AACA,MAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,IACzE;AAAA,GACF;AACF","file":"oauth1.js","sourcesContent":["import type { UsageIdentity } from \"../../types.js\";\nimport type { EndUserAuthVerifier } from \"../../verifier.js\";\n\nexport type OAuth1EndUserAuthConfig = {\n consumerKey: string;\n consumerSecret: string;\n /** Resolve oauth_token → UsageIdentity (platform-owned store). */\n resolveIdentity: (oauthToken: string) => Promise<UsageIdentity>;\n tokenSecretLookup?: (oauthToken: string) => Promise<string | undefined>;\n};\n\n/**\n * OAuth 1.0a end-user auth verifier (stub).\n *\n * A full implementation will parse `Authorization: OAuth …` from\n * `context.authorization`, validate the signature using `context.payload.headers`\n * and the request URL, then call `resolveIdentity`.\n */\nexport function createOAuth1EndUserVerifier(\n config: OAuth1EndUserAuthConfig,\n): EndUserAuthVerifier {\n return {\n kind: \"oauth1\",\n verify: async () => {\n if (!config.consumerKey.trim() || !config.consumerSecret.trim()) {\n throw new Error(\"OAuth 1.0 consumer credentials are required\");\n }\n throw new Error(\"OAuth 1.0 webhook verification is not implemented yet\");\n },\n };\n}\n"]}
|