@addon-pass/sdk 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +147 -0
  3. package/dist/contract.d.ts +9 -0
  4. package/dist/contract.d.ts.map +1 -0
  5. package/dist/contract.js +111 -0
  6. package/dist/contract.js.map +1 -0
  7. package/dist/errors.d.ts +22 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +43 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/express.d.ts +12 -0
  12. package/dist/express.d.ts.map +1 -0
  13. package/dist/express.js +64 -0
  14. package/dist/express.js.map +1 -0
  15. package/dist/fastify.d.ts +14 -0
  16. package/dist/fastify.d.ts.map +1 -0
  17. package/dist/fastify.js +63 -0
  18. package/dist/fastify.js.map +1 -0
  19. package/dist/fetch.d.ts +11 -0
  20. package/dist/fetch.d.ts.map +1 -0
  21. package/dist/fetch.js +48 -0
  22. package/dist/fetch.js.map +1 -0
  23. package/dist/index.d.ts +9 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +9 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/node.d.ts +4 -0
  28. package/dist/node.d.ts.map +1 -0
  29. package/dist/node.js +59 -0
  30. package/dist/node.js.map +1 -0
  31. package/dist/stremio.d.ts +28 -0
  32. package/dist/stremio.d.ts.map +1 -0
  33. package/dist/stremio.js +226 -0
  34. package/dist/stremio.js.map +1 -0
  35. package/dist/token.d.ts +4 -0
  36. package/dist/token.d.ts.map +1 -0
  37. package/dist/token.js +24 -0
  38. package/dist/token.js.map +1 -0
  39. package/dist/types.d.ts +32 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +53 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/verifier.d.ts +20 -0
  44. package/dist/verifier.d.ts.map +1 -0
  45. package/dist/verifier.js +255 -0
  46. package/dist/verifier.js.map +1 -0
  47. package/package.json +72 -0
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export * from "./contract.js";
2
+ export * from "./errors.js";
3
+ export * from "./fetch.js";
4
+ export * from "./node.js";
5
+ export * from "./stremio.js";
6
+ export * from "./token.js";
7
+ export * from "./types.js";
8
+ export * from "./verifier.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
package/dist/node.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import { type FetchStremioHandlerOptions } from "./fetch.js";
3
+ export declare function createNodeStremioHandler(options: FetchStremioHandlerOptions): (request: IncomingMessage, response: ServerResponse) => Promise<void>;
4
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,YAAY,CAAC;AAqCpB,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,0BAA0B,GAClC,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAuBvE"}
package/dist/node.js ADDED
@@ -0,0 +1,59 @@
1
+ import { once } from "node:events";
2
+ import { createFetchStremioHandler, } from "./fetch.js";
3
+ function requestHeaders(request) {
4
+ const headers = new Headers();
5
+ for (const [name, value] of Object.entries(request.headers)) {
6
+ if (value === undefined)
7
+ continue;
8
+ if (Array.isArray(value)) {
9
+ for (const item of value)
10
+ headers.append(name, item);
11
+ }
12
+ else {
13
+ headers.set(name, value);
14
+ }
15
+ }
16
+ return headers;
17
+ }
18
+ async function writeResponse(request, target, response) {
19
+ target.statusCode = response.status;
20
+ response.headers.forEach((value, name) => {
21
+ target.setHeader(name, value);
22
+ });
23
+ if (request.method === "HEAD" || response.body === null) {
24
+ target.end();
25
+ return;
26
+ }
27
+ const reader = response.body.getReader();
28
+ let chunk = await reader.read();
29
+ while (!chunk.done) {
30
+ if (!target.write(Buffer.from(chunk.value)))
31
+ await once(target, "drain");
32
+ chunk = await reader.read();
33
+ }
34
+ target.end();
35
+ }
36
+ export function createNodeStremioHandler(options) {
37
+ const handle = createFetchStremioHandler(options);
38
+ return async (request, response) => {
39
+ try {
40
+ const result = await handle(new Request(new URL(request.url ?? "/", "http://addonpass.local"), {
41
+ headers: requestHeaders(request),
42
+ method: request.method ?? "GET",
43
+ }));
44
+ await writeResponse(request, response, result);
45
+ }
46
+ catch {
47
+ if (response.headersSent) {
48
+ response.destroy();
49
+ return;
50
+ }
51
+ response.statusCode = 500;
52
+ response.setHeader("access-control-allow-origin", "*");
53
+ response.setHeader("cache-control", "no-store");
54
+ response.setHeader("content-type", "application/json; charset=utf-8");
55
+ response.end('{"error":"addon_unavailable"}');
56
+ }
57
+ };
58
+ }
59
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { AddonPassVerifier } from "./verifier.js";
2
+ import type { EntitlementDecision } from "./types.js";
3
+ export type StremioResource = "catalog" | "manifest" | "meta" | "stream";
4
+ export interface StremioRoute {
5
+ readonly id: string | null;
6
+ readonly resource: StremioResource;
7
+ readonly type: string | null;
8
+ readonly upstreamPath: string;
9
+ }
10
+ export interface AuthorizedStremioRequest {
11
+ readonly decision: EntitlementDecision;
12
+ readonly route: StremioRoute;
13
+ }
14
+ export interface StremioAccessConfiguration {
15
+ readonly addonId: string;
16
+ readonly addonName: string;
17
+ readonly managementUrl: string;
18
+ }
19
+ export interface StremioAccessResponder {
20
+ denied(authorization: AuthorizedStremioRequest): Response;
21
+ invalid(): Response;
22
+ methodNotAllowed(): Response;
23
+ options(): Response;
24
+ unavailable(route?: StremioRoute): Response;
25
+ }
26
+ export declare function authorizeStremioRequest(verifier: Pick<AddonPassVerifier, "verifyToken">, url: URL, mountPath?: string): Promise<AuthorizedStremioRequest>;
27
+ export declare function createStremioAccessResponder(config: StremioAccessConfiguration): StremioAccessResponder;
28
+ //# sourceMappingURL=stremio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stremio.d.ts","sourceRoot":"","sources":["../src/stremio.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAOtD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,aAAa,EAAE,wBAAwB,GAAG,QAAQ,CAAC;IAC1D,OAAO,IAAI,QAAQ,CAAC;IACpB,gBAAgB,IAAI,QAAQ,CAAC;IAC7B,OAAO,IAAI,QAAQ,CAAC;IACpB,WAAW,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;CAC7C;AAmGD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,EAChD,GAAG,EAAE,GAAG,EACR,SAAS,SAAe,GACvB,OAAO,CAAC,wBAAwB,CAAC,CAInC;AAuFD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,0BAA0B,GACjC,sBAAsB,CAqExB"}
@@ -0,0 +1,226 @@
1
+ import { AddonPassConfigurationError, UnsupportedStremioRouteError, } from "./errors.js";
2
+ const TOKEN_PATTERN = /^[A-Za-z0-9_-]{43}$/;
3
+ const ADDON_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{2,99}$/;
4
+ const RESOURCE_NAMES = new Set(["catalog", "meta", "stream"]);
5
+ const MAX_PATH_LENGTH = 4_096;
6
+ function normalizeMountPath(value) {
7
+ if (value === "/")
8
+ return "";
9
+ if (!value.startsWith("/") ||
10
+ value.endsWith("/") ||
11
+ value.includes("//") ||
12
+ value.includes("\\") ||
13
+ value.includes("%")) {
14
+ throw new AddonPassConfigurationError();
15
+ }
16
+ const segments = value.slice(1).split("/");
17
+ if (segments.some((segment) => segment === "." || segment === ".." || segment === "")) {
18
+ throw new AddonPassConfigurationError();
19
+ }
20
+ return value;
21
+ }
22
+ function safeSegment(value) {
23
+ if (value === "" || value.length > 1_024 || /%2f|%5c/i.test(value))
24
+ return false;
25
+ try {
26
+ const decoded = decodeURIComponent(value);
27
+ return (decoded !== "." &&
28
+ decoded !== ".." &&
29
+ !decoded.includes("/") &&
30
+ !decoded.includes("\\"));
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ function parseRoute(pathname, mountPath) {
37
+ if (pathname.length > MAX_PATH_LENGTH)
38
+ throw new UnsupportedStremioRouteError();
39
+ const prefix = `${mountPath}/`;
40
+ if (!pathname.startsWith(prefix))
41
+ throw new UnsupportedStremioRouteError();
42
+ const protectedPath = pathname.slice(prefix.length);
43
+ const separator = protectedPath.indexOf("/");
44
+ if (separator === -1)
45
+ throw new UnsupportedStremioRouteError();
46
+ const token = protectedPath.slice(0, separator);
47
+ if (!TOKEN_PATTERN.test(token))
48
+ throw new UnsupportedStremioRouteError();
49
+ const upstreamPath = protectedPath.slice(separator);
50
+ if (upstreamPath === "/manifest.json") {
51
+ return {
52
+ route: {
53
+ id: null,
54
+ resource: "manifest",
55
+ type: null,
56
+ upstreamPath,
57
+ },
58
+ token,
59
+ };
60
+ }
61
+ const segments = upstreamPath.slice(1).split("/");
62
+ if (segments.length < 3 || segments.length > 4) {
63
+ throw new UnsupportedStremioRouteError();
64
+ }
65
+ const [resource, type, id, extra] = segments;
66
+ if (resource === undefined ||
67
+ !RESOURCE_NAMES.has(resource) ||
68
+ type === undefined ||
69
+ id === undefined ||
70
+ !safeSegment(type) ||
71
+ !safeSegment(id) ||
72
+ (extra !== undefined && !safeSegment(extra))) {
73
+ throw new UnsupportedStremioRouteError();
74
+ }
75
+ const finalSegment = extra ?? id;
76
+ if (!finalSegment.endsWith(".json") || finalSegment === ".json") {
77
+ throw new UnsupportedStremioRouteError();
78
+ }
79
+ return {
80
+ route: {
81
+ id: id.endsWith(".json") ? id.slice(0, -5) : id,
82
+ resource: resource,
83
+ type,
84
+ upstreamPath,
85
+ },
86
+ token,
87
+ };
88
+ }
89
+ export async function authorizeStremioRequest(verifier, url, mountPath = "/addonpass") {
90
+ const parsed = parseRoute(url.pathname, normalizeMountPath(mountPath));
91
+ const decision = await verifier.verifyToken(parsed.token);
92
+ return { decision, route: parsed.route };
93
+ }
94
+ function jsonResponse(body, status) {
95
+ return new Response(JSON.stringify(body), {
96
+ headers: {
97
+ "access-control-allow-origin": "*",
98
+ "cache-control": "no-store",
99
+ "content-type": "application/json; charset=utf-8",
100
+ },
101
+ status,
102
+ });
103
+ }
104
+ function responseBody(route, config, message) {
105
+ const type = route.type ?? "movie";
106
+ const id = route.id ?? "addonpass-access";
107
+ if (route.resource === "manifest") {
108
+ return {
109
+ catalogs: [{ id: "addonpass-access", name: "Access", type: "movie" }],
110
+ description: message,
111
+ id: `${config.addonId}.access`,
112
+ name: `${config.addonName} access`,
113
+ resources: ["catalog", "meta", "stream"],
114
+ types: ["movie"],
115
+ version: "1.0.0",
116
+ };
117
+ }
118
+ if (route.resource === "catalog") {
119
+ return {
120
+ metas: [
121
+ {
122
+ description: message,
123
+ id: "addonpass:access",
124
+ name: "Manage access",
125
+ type,
126
+ },
127
+ ],
128
+ };
129
+ }
130
+ if (route.resource === "meta") {
131
+ return {
132
+ meta: {
133
+ description: message,
134
+ id,
135
+ links: [
136
+ {
137
+ category: "addonpass",
138
+ name: "Manage access",
139
+ url: config.managementUrl,
140
+ },
141
+ ],
142
+ name: "Manage access",
143
+ type,
144
+ },
145
+ };
146
+ }
147
+ return {
148
+ streams: [
149
+ {
150
+ description: message,
151
+ externalUrl: config.managementUrl,
152
+ name: "Manage access",
153
+ },
154
+ ],
155
+ };
156
+ }
157
+ function denialMessage(decision) {
158
+ switch (decision.status) {
159
+ case "authorization_ended":
160
+ return "This subscription has used its authorized charges. Resume it to continue.";
161
+ case "cancelled":
162
+ return "This subscription is cancelled and its paid access has ended.";
163
+ case "expired":
164
+ return "Payment access has expired. Manage the subscription to continue.";
165
+ case "not_found":
166
+ return "This installation link is invalid or no longer active.";
167
+ case "active":
168
+ case "grace":
169
+ return "Access is available.";
170
+ }
171
+ }
172
+ export function createStremioAccessResponder(config) {
173
+ let managementUrl;
174
+ try {
175
+ managementUrl = new URL(config.managementUrl);
176
+ }
177
+ catch {
178
+ throw new AddonPassConfigurationError();
179
+ }
180
+ const localHttp = managementUrl.protocol === "http:" &&
181
+ (managementUrl.hostname === "localhost" ||
182
+ managementUrl.hostname === "127.0.0.1");
183
+ if (!ADDON_ID_PATTERN.test(config.addonId) ||
184
+ config.addonName.trim() === "" ||
185
+ config.addonName.length > 100 ||
186
+ (managementUrl.protocol !== "https:" && !localHttp) ||
187
+ managementUrl.username !== "" ||
188
+ managementUrl.password !== "") {
189
+ throw new AddonPassConfigurationError();
190
+ }
191
+ const normalized = {
192
+ addonId: config.addonId,
193
+ addonName: config.addonName.trim(),
194
+ managementUrl: managementUrl.toString(),
195
+ };
196
+ return {
197
+ denied(authorization) {
198
+ return jsonResponse(responseBody(authorization.route, normalized, denialMessage(authorization.decision)), authorization.decision.status === "not_found" ? 404 : 200);
199
+ },
200
+ invalid() {
201
+ return jsonResponse({ error: "access_denied" }, 404);
202
+ },
203
+ methodNotAllowed() {
204
+ const response = jsonResponse({ error: "method_not_allowed" }, 405);
205
+ response.headers.set("allow", "GET, HEAD, OPTIONS");
206
+ return response;
207
+ },
208
+ options() {
209
+ return new Response(null, {
210
+ headers: {
211
+ "access-control-allow-headers": "content-type",
212
+ "access-control-allow-methods": "GET, HEAD, OPTIONS",
213
+ "access-control-allow-origin": "*",
214
+ "cache-control": "no-store",
215
+ },
216
+ status: 204,
217
+ });
218
+ },
219
+ unavailable(route) {
220
+ return route === undefined
221
+ ? jsonResponse({ error: "verification_unavailable" }, 503)
222
+ : jsonResponse(responseBody(route, normalized, "Access could not be checked. Try again shortly."), 503);
223
+ },
224
+ };
225
+ }
226
+ //# sourceMappingURL=stremio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stremio.js","sourceRoot":"","sources":["../src/stremio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type Hex } from "viem";
2
+ export declare function decodeEntitlementToken(rawToken: string): Uint8Array;
3
+ export declare function hashEntitlementToken(rawToken: string): Hex;
4
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAM3C,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAUnE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAO1D"}
package/dist/token.js ADDED
@@ -0,0 +1,24 @@
1
+ import { keccak256 } from "viem";
2
+ import { InvalidEntitlementTokenError } from "./errors.js";
3
+ const ENTITLEMENT_TOKEN_PATTERN = /^[A-Za-z0-9_-]{43}$/;
4
+ export function decodeEntitlementToken(rawToken) {
5
+ if (!ENTITLEMENT_TOKEN_PATTERN.test(rawToken)) {
6
+ throw new InvalidEntitlementTokenError();
7
+ }
8
+ const decoded = Buffer.from(rawToken, "base64url");
9
+ if (decoded.length !== 32 || decoded.toString("base64url") !== rawToken) {
10
+ decoded.fill(0);
11
+ throw new InvalidEntitlementTokenError();
12
+ }
13
+ return decoded;
14
+ }
15
+ export function hashEntitlementToken(rawToken) {
16
+ const decoded = decodeEntitlementToken(rawToken);
17
+ try {
18
+ return keccak256(decoded);
19
+ }
20
+ finally {
21
+ decoded.fill(0);
22
+ }
23
+ }
24
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,MAAM,MAAM,CAAC;AAE3C,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAExD,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,4BAA4B,EAAE,CAAC;IAC3C,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,QAAQ,EAAE,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,IAAI,4BAA4B,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,MAAM,OAAO,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ export declare const entitlementResponseSchema: z.ZodObject<{
3
+ entitled: z.ZodBoolean;
4
+ finality: z.ZodNullable<z.ZodEnum<{
5
+ provisional: "provisional";
6
+ safe: "safe";
7
+ finalized: "finalized";
8
+ }>>;
9
+ graceEnds: z.ZodNullable<z.ZodISODateTime>;
10
+ paidThrough: z.ZodNullable<z.ZodISODateTime>;
11
+ planId: z.ZodNullable<z.ZodString>;
12
+ sourceBlock: z.ZodNullable<z.ZodString>;
13
+ sourceBlockHash: z.ZodNullable<z.ZodString>;
14
+ status: z.ZodEnum<{
15
+ active: "active";
16
+ authorization_ended: "authorization_ended";
17
+ cancelled: "cancelled";
18
+ expired: "expired";
19
+ grace: "grace";
20
+ not_found: "not_found";
21
+ }>;
22
+ subscriptionId: z.ZodNullable<z.ZodString>;
23
+ }, z.core.$strict>;
24
+ export type EntitlementResponse = z.infer<typeof entitlementResponseSchema>;
25
+ export interface EntitlementDecision extends EntitlementResponse {
26
+ readonly cached: boolean;
27
+ readonly source: "api" | "contract";
28
+ }
29
+ export interface EntitlementFallback {
30
+ verify(tokenHash: `0x${string}`): Promise<EntitlementResponse>;
31
+ }
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;kBAmDlC,CAAC;AAEL,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB;IAC9D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,UAAU,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,SAAS,EAAE,KAAK,MAAM,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAChE"}
package/dist/types.js ADDED
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ const decimalSchema = z.string().regex(/^(0|[1-9][0-9]*)$/);
3
+ const positiveDecimalSchema = z.string().regex(/^[1-9][0-9]*$/);
4
+ const bytes32Schema = z.string().regex(/^0x[0-9a-fA-F]{64}$/);
5
+ export const entitlementResponseSchema = z
6
+ .object({
7
+ entitled: z.boolean(),
8
+ finality: z.enum(["provisional", "safe", "finalized"]).nullable(),
9
+ graceEnds: z.iso.datetime().nullable(),
10
+ paidThrough: z.iso.datetime().nullable(),
11
+ planId: positiveDecimalSchema.nullable(),
12
+ sourceBlock: decimalSchema.nullable(),
13
+ sourceBlockHash: bytes32Schema.nullable(),
14
+ status: z.enum([
15
+ "active",
16
+ "authorization_ended",
17
+ "cancelled",
18
+ "expired",
19
+ "grace",
20
+ "not_found",
21
+ ]),
22
+ subscriptionId: positiveDecimalSchema.nullable(),
23
+ })
24
+ .strict()
25
+ .superRefine((value, context) => {
26
+ const entitledStatus = value.status === "active" || value.status === "grace";
27
+ if (value.entitled !== entitledStatus) {
28
+ context.addIssue({
29
+ code: "custom",
30
+ message: "inconsistent entitlement state",
31
+ });
32
+ }
33
+ // planId is omitted from completeness: AddonPass reports no plan for a
34
+ // hidden integration-test subscription so plan allowlists never block it.
35
+ const sourceValues = [
36
+ value.finality,
37
+ value.graceEnds,
38
+ value.paidThrough,
39
+ value.sourceBlock,
40
+ value.sourceBlockHash,
41
+ value.subscriptionId,
42
+ ];
43
+ const complete = sourceValues.every((item) => item !== null);
44
+ const empty = value.planId === null && sourceValues.every((item) => item === null);
45
+ if ((value.status === "not_found" && !empty) ||
46
+ (value.status !== "not_found" && !complete)) {
47
+ context.addIssue({
48
+ code: "custom",
49
+ message: "incomplete entitlement source",
50
+ });
51
+ }
52
+ });
53
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAC5D,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAChE,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACtC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACxC,MAAM,EAAE,qBAAqB,CAAC,QAAQ,EAAE;IACxC,WAAW,EAAE,aAAa,CAAC,QAAQ,EAAE;IACrC,eAAe,EAAE,aAAa,CAAC,QAAQ,EAAE;IACzC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;QACb,QAAQ;QACR,qBAAqB;QACrB,WAAW;QACX,SAAS;QACT,OAAO;QACP,WAAW;KACZ,CAAC;IACF,cAAc,EAAE,qBAAqB,CAAC,QAAQ,EAAE;CACjD,CAAC;KACD,MAAM,EAAE;KACR,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAC9B,MAAM,cAAc,GAClB,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC;IACxD,IAAI,KAAK,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;QACtC,OAAO,CAAC,QAAQ,CAAC;YACf,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,gCAAgC;SAC1C,CAAC,CAAC;IACL,CAAC;IACD,uEAAuE;IACvE,0EAA0E;IAC1E,MAAM,YAAY,GAAG;QACnB,KAAK,CAAC,QAAQ;QACd,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,WAAW;QACjB,KAAK,CAAC,WAAW;QACjB,KAAK,CAAC,eAAe;QACrB,KAAK,CAAC,cAAc;KACrB,CAAC;IACF,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC7D,MAAM,KAAK,GACT,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACvE,IACE,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC;QACxC,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,EAC3C,CAAC;QACD,OAAO,CAAC,QAAQ,CAAC;YACf,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,+BAA+B;SACzC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type EntitlementDecision, type EntitlementFallback } from "./types.js";
2
+ export interface AddonPassVerifierOptions {
3
+ readonly allowedPlanIds: readonly (bigint | string)[];
4
+ readonly apiBaseUrl: string;
5
+ readonly cacheTtlMs?: number;
6
+ readonly fallback?: EntitlementFallback;
7
+ readonly fetch?: typeof globalThis.fetch;
8
+ readonly integrationCredential: string;
9
+ readonly maxCacheEntries?: number;
10
+ readonly now?: () => Date;
11
+ readonly requestTimeoutMs?: number;
12
+ }
13
+ export declare class AddonPassVerifier {
14
+ #private;
15
+ constructor(options: AddonPassVerifierOptions);
16
+ clear(): void;
17
+ invalidate(rawToken: string): void;
18
+ verifyToken(rawToken: string): Promise<EntitlementDecision>;
19
+ }
20
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../src/verifier.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EAEzB,MAAM,YAAY,CAAC;AAsGpB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACtD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IACzC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,qBAAa,iBAAiB;;gBAahB,OAAO,EAAE,wBAAwB;IAuC7C,KAAK,IAAI,IAAI;IAIb,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI5B,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAiJlE"}