@obul.ai/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/adapters/cloudflare.d.ts +6 -0
  2. package/dist/adapters/cloudflare.d.ts.map +1 -0
  3. package/dist/adapters/cloudflare.js +12 -0
  4. package/dist/adapters/cloudflare.js.map +1 -0
  5. package/dist/adapters/express.d.ts +3 -0
  6. package/dist/adapters/express.d.ts.map +1 -0
  7. package/dist/adapters/express.js +22 -0
  8. package/dist/adapters/express.js.map +1 -0
  9. package/dist/adapters/hono.d.ts +4 -0
  10. package/dist/adapters/hono.d.ts.map +1 -0
  11. package/dist/adapters/hono.js +19 -0
  12. package/dist/adapters/hono.js.map +1 -0
  13. package/dist/adapters/next.d.ts +6 -0
  14. package/dist/adapters/next.d.ts.map +1 -0
  15. package/dist/adapters/next.js +15 -0
  16. package/dist/adapters/next.js.map +1 -0
  17. package/dist/adapters/node.d.ts +21 -0
  18. package/dist/adapters/node.d.ts.map +1 -0
  19. package/dist/adapters/node.js +108 -0
  20. package/dist/adapters/node.js.map +1 -0
  21. package/dist/browser/index.d.ts +52 -0
  22. package/dist/browser/index.d.ts.map +1 -0
  23. package/dist/browser/index.js +202 -0
  24. package/dist/browser/index.js.map +1 -0
  25. package/dist/core/cookies.d.ts +4 -0
  26. package/dist/core/cookies.d.ts.map +1 -0
  27. package/dist/core/cookies.js +44 -0
  28. package/dist/core/cookies.js.map +1 -0
  29. package/dist/core/crypto.d.ts +10 -0
  30. package/dist/core/crypto.d.ts.map +1 -0
  31. package/dist/core/crypto.js +68 -0
  32. package/dist/core/crypto.js.map +1 -0
  33. package/dist/core/index.d.ts +7 -0
  34. package/dist/core/index.d.ts.map +1 -0
  35. package/dist/core/index.js +6 -0
  36. package/dist/core/index.js.map +1 -0
  37. package/dist/core/jwt.d.ts +8 -0
  38. package/dist/core/jwt.d.ts.map +1 -0
  39. package/dist/core/jwt.js +15 -0
  40. package/dist/core/jwt.js.map +1 -0
  41. package/dist/core/oauth.d.ts +39 -0
  42. package/dist/core/oauth.d.ts.map +1 -0
  43. package/dist/core/oauth.js +86 -0
  44. package/dist/core/oauth.js.map +1 -0
  45. package/dist/core/stores.d.ts +18 -0
  46. package/dist/core/stores.d.ts.map +1 -0
  47. package/dist/core/stores.js +39 -0
  48. package/dist/core/stores.js.map +1 -0
  49. package/dist/core/types.d.ts +84 -0
  50. package/dist/core/types.d.ts.map +1 -0
  51. package/dist/core/types.js +2 -0
  52. package/dist/core/types.js.map +1 -0
  53. package/dist/index.d.ts +2 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +2 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/server/index.d.ts +31 -0
  58. package/dist/server/index.d.ts.map +1 -0
  59. package/dist/server/index.js +368 -0
  60. package/dist/server/index.js.map +1 -0
  61. package/package.json +68 -0
@@ -0,0 +1,68 @@
1
+ function bytesToBase64(bytes) {
2
+ if (typeof Buffer !== "undefined") {
3
+ return Buffer.from(bytes).toString("base64");
4
+ }
5
+ let binary = "";
6
+ for (const byte of bytes) {
7
+ binary += String.fromCharCode(byte);
8
+ }
9
+ if (typeof btoa === "function") {
10
+ return btoa(binary);
11
+ }
12
+ throw new Error("No base64 encoder available");
13
+ }
14
+ function base64ToBytes(base64) {
15
+ if (typeof Buffer !== "undefined") {
16
+ return new Uint8Array(Buffer.from(base64, "base64"));
17
+ }
18
+ if (typeof atob === "function") {
19
+ const binary = atob(base64);
20
+ const bytes = new Uint8Array(binary.length);
21
+ for (let i = 0; i < binary.length; i += 1) {
22
+ bytes[i] = binary.charCodeAt(i);
23
+ }
24
+ return bytes;
25
+ }
26
+ throw new Error("No base64 decoder available");
27
+ }
28
+ export function base64UrlEncode(input) {
29
+ return bytesToBase64(input)
30
+ .replace(/=/g, "")
31
+ .replace(/\+/g, "-")
32
+ .replace(/\//g, "_");
33
+ }
34
+ export function base64UrlDecode(input) {
35
+ const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
36
+ const padding = (4 - (normalized.length % 4)) % 4;
37
+ const padded = normalized + "=".repeat(padding);
38
+ return base64ToBytes(padded);
39
+ }
40
+ export function createDefaultCrypto() {
41
+ const cryptoObj = globalThis.crypto;
42
+ if (!cryptoObj?.getRandomValues || !cryptoObj?.subtle) {
43
+ throw new Error("Web Crypto is required; provide config.crypto in non-web runtimes");
44
+ }
45
+ return {
46
+ randomBytes: (length) => {
47
+ const bytes = new Uint8Array(length);
48
+ cryptoObj.getRandomValues(bytes);
49
+ return bytes;
50
+ },
51
+ sha256: async (input) => {
52
+ const copy = new Uint8Array(input.byteLength);
53
+ copy.set(input);
54
+ const digest = await cryptoObj.subtle.digest("SHA-256", copy.buffer);
55
+ return new Uint8Array(digest);
56
+ }
57
+ };
58
+ }
59
+ export async function generatePkcePair(crypto) {
60
+ const codeVerifier = base64UrlEncode(crypto.randomBytes(32));
61
+ const digest = await crypto.sha256(new TextEncoder().encode(codeVerifier));
62
+ const codeChallenge = base64UrlEncode(digest);
63
+ return { codeVerifier, codeChallenge };
64
+ }
65
+ export function randomId(crypto, bytes = 32) {
66
+ return base64UrlEncode(crypto.randomBytes(bytes));
67
+ }
68
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/core/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type { Clock, CookieOptions, CryptoLike, FetchLike, Logger, ObulServerConfig, ObulSession, SessionRecord, SessionStore, StateRecord, TokenRecord, TokenStore } from "./types";
2
+ export { MemorySessionStore, MemoryTokenStore } from "./stores";
3
+ export { createDefaultCrypto, generatePkcePair, randomId } from "./crypto";
4
+ export { decodeJwtPayload } from "./jwt";
5
+ export { parseCookies, serializeCookie } from "./cookies";
6
+ export { createObulOAuthClient } from "./oauth";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,KAAK,EACL,aAAa,EACb,UAAU,EACV,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACX,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,6 @@
1
+ export { MemorySessionStore, MemoryTokenStore } from "./stores";
2
+ export { createDefaultCrypto, generatePkcePair, randomId } from "./crypto";
3
+ export { decodeJwtPayload } from "./jwt";
4
+ export { parseCookies, serializeCookie } from "./cookies";
5
+ export { createObulOAuthClient } from "./oauth";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,8 @@
1
+ export type JwtClaims = {
2
+ exp?: number;
3
+ allowed_hosts?: string[];
4
+ max_price_per_request?: number;
5
+ [key: string]: unknown;
6
+ };
7
+ export declare function decodeJwtPayload(token: string): JwtClaims | null;
8
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/core/jwt.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAUhE"}
@@ -0,0 +1,15 @@
1
+ import { base64UrlDecode } from "./crypto";
2
+ export function decodeJwtPayload(token) {
3
+ const parts = token.split(".");
4
+ if (parts.length < 2)
5
+ return null;
6
+ try {
7
+ const payloadBytes = base64UrlDecode(parts[1]);
8
+ const json = new TextDecoder().decode(payloadBytes);
9
+ return JSON.parse(json);
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ //# sourceMappingURL=jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/core/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAS1C,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACjC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9C,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { FetchLike, Logger } from "./types";
2
+ export type ObulOAuthClientConfig = {
3
+ issuerUrl: string;
4
+ authEndpoint: string;
5
+ tokenEndpoint: string;
6
+ revocationEndpoint?: string;
7
+ clientId: string;
8
+ clientSecret?: string;
9
+ redirectUri: string;
10
+ scopes: string[];
11
+ };
12
+ export type TokenResponse = {
13
+ access_token: string;
14
+ refresh_token?: string;
15
+ expires_in?: number;
16
+ token_type?: string;
17
+ scope?: string;
18
+ };
19
+ export declare function createObulOAuthClient(config: ObulOAuthClientConfig, options: {
20
+ fetch: FetchLike;
21
+ logger?: Logger;
22
+ }): {
23
+ getAuthUrl: (params: {
24
+ state: string;
25
+ codeChallenge: string;
26
+ }) => string;
27
+ exchangeCode: (params: {
28
+ code: string;
29
+ codeVerifier: string;
30
+ }) => Promise<TokenResponse>;
31
+ refresh: (params: {
32
+ refreshToken: string;
33
+ }) => Promise<TokenResponse>;
34
+ revoke: (params: {
35
+ token: string;
36
+ tokenTypeHint?: "access_token" | "refresh_token";
37
+ }) => Promise<void>;
38
+ };
39
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/core/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhD,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;yBAKlB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;2BAYhC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;sBA2B3C;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE;qBAyBzB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,cAAc,GAAG,eAAe,CAAA;KAAE;EAwBlG"}
@@ -0,0 +1,86 @@
1
+ export function createObulOAuthClient(config, options) {
2
+ const fetcher = options.fetch;
3
+ const logger = options.logger;
4
+ const getAuthUrl = (params) => {
5
+ const url = new URL(config.authEndpoint, config.issuerUrl);
6
+ url.searchParams.set("client_id", config.clientId);
7
+ url.searchParams.set("redirect_uri", config.redirectUri);
8
+ url.searchParams.set("response_type", "code");
9
+ url.searchParams.set("scope", config.scopes.join(" "));
10
+ url.searchParams.set("code_challenge", params.codeChallenge);
11
+ url.searchParams.set("code_challenge_method", "S256");
12
+ url.searchParams.set("state", params.state);
13
+ return url.toString();
14
+ };
15
+ const exchangeCode = async (params) => {
16
+ const body = new URLSearchParams();
17
+ body.set("grant_type", "authorization_code");
18
+ body.set("code", params.code);
19
+ body.set("redirect_uri", config.redirectUri);
20
+ body.set("client_id", config.clientId);
21
+ body.set("code_verifier", params.codeVerifier);
22
+ if (config.clientSecret)
23
+ body.set("client_secret", config.clientSecret);
24
+ const res = await fetcher(new URL(config.tokenEndpoint, config.issuerUrl), {
25
+ method: "POST",
26
+ headers: {
27
+ "Content-Type": "application/x-www-form-urlencoded",
28
+ Accept: "application/json"
29
+ },
30
+ body
31
+ });
32
+ if (!res.ok) {
33
+ const text = await res.text();
34
+ logger?.warn?.("Token exchange failed", { status: res.status, text });
35
+ throw new Error(`Token exchange failed (${res.status})`);
36
+ }
37
+ return (await res.json());
38
+ };
39
+ const refresh = async (params) => {
40
+ const body = new URLSearchParams();
41
+ body.set("grant_type", "refresh_token");
42
+ body.set("refresh_token", params.refreshToken);
43
+ body.set("client_id", config.clientId);
44
+ if (config.clientSecret)
45
+ body.set("client_secret", config.clientSecret);
46
+ const res = await fetcher(new URL(config.tokenEndpoint, config.issuerUrl), {
47
+ method: "POST",
48
+ headers: {
49
+ "Content-Type": "application/x-www-form-urlencoded",
50
+ Accept: "application/json"
51
+ },
52
+ body
53
+ });
54
+ if (!res.ok) {
55
+ const text = await res.text();
56
+ logger?.warn?.("Token refresh failed", { status: res.status, text });
57
+ throw new Error(`Token refresh failed (${res.status})`);
58
+ }
59
+ return (await res.json());
60
+ };
61
+ const revoke = async (params) => {
62
+ if (!config.revocationEndpoint)
63
+ return;
64
+ const body = new URLSearchParams();
65
+ body.set("token", params.token);
66
+ if (params.tokenTypeHint)
67
+ body.set("token_type_hint", params.tokenTypeHint);
68
+ body.set("client_id", config.clientId);
69
+ if (config.clientSecret)
70
+ body.set("client_secret", config.clientSecret);
71
+ const res = await fetcher(new URL(config.revocationEndpoint, config.issuerUrl), {
72
+ method: "POST",
73
+ headers: {
74
+ "Content-Type": "application/x-www-form-urlencoded",
75
+ Accept: "application/json"
76
+ },
77
+ body
78
+ });
79
+ if (!res.ok) {
80
+ const text = await res.text();
81
+ logger?.warn?.("Token revocation failed", { status: res.status, text });
82
+ }
83
+ };
84
+ return { getAuthUrl, exchangeCode, refresh, revoke };
85
+ }
86
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/core/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { SessionRecord, SessionStore, StateRecord, TokenRecord, TokenStore } from "./types";
2
+ export declare class MemoryTokenStore implements TokenStore {
3
+ private store;
4
+ get(id: string): Promise<TokenRecord | undefined>;
5
+ set(id: string, record: TokenRecord): Promise<void>;
6
+ delete(id: string): Promise<void>;
7
+ }
8
+ export declare class MemorySessionStore implements SessionStore {
9
+ private sessions;
10
+ private states;
11
+ getSession(id: string): Promise<SessionRecord | undefined>;
12
+ setSession(id: string, record: SessionRecord): Promise<void>;
13
+ deleteSession(id: string): Promise<void>;
14
+ getState(id: string): Promise<StateRecord | undefined>;
15
+ setState(id: string, record: StateRecord): Promise<void>;
16
+ deleteState(id: string): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=stores.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stores.d.ts","sourceRoot":"","sources":["../../src/core/stores.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEhG,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,KAAK,CAAiC;IAExC,GAAG,CAAC,EAAE,EAAE,MAAM;IAId,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;IAInC,MAAM,CAAC,EAAE,EAAE,MAAM;CAGxB;AAED,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,MAAM,CAAiC;IAEzC,UAAU,CAAC,EAAE,EAAE,MAAM;IAIrB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa;IAI5C,aAAa,CAAC,EAAE,EAAE,MAAM;IAIxB,QAAQ,CAAC,EAAE,EAAE,MAAM;IAInB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;IAIxC,WAAW,CAAC,EAAE,EAAE,MAAM;CAG7B"}
@@ -0,0 +1,39 @@
1
+ export class MemoryTokenStore {
2
+ constructor() {
3
+ this.store = new Map();
4
+ }
5
+ async get(id) {
6
+ return this.store.get(id);
7
+ }
8
+ async set(id, record) {
9
+ this.store.set(id, record);
10
+ }
11
+ async delete(id) {
12
+ this.store.delete(id);
13
+ }
14
+ }
15
+ export class MemorySessionStore {
16
+ constructor() {
17
+ this.sessions = new Map();
18
+ this.states = new Map();
19
+ }
20
+ async getSession(id) {
21
+ return this.sessions.get(id);
22
+ }
23
+ async setSession(id, record) {
24
+ this.sessions.set(id, record);
25
+ }
26
+ async deleteSession(id) {
27
+ this.sessions.delete(id);
28
+ }
29
+ async getState(id) {
30
+ return this.states.get(id);
31
+ }
32
+ async setState(id, record) {
33
+ this.states.set(id, record);
34
+ }
35
+ async deleteState(id) {
36
+ this.states.delete(id);
37
+ }
38
+ }
39
+ //# sourceMappingURL=stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stores.js","sourceRoot":"","sources":["../../src/core/stores.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAgB;IAA7B;QACU,UAAK,GAAG,IAAI,GAAG,EAAuB,CAAA;IAahD,CAAC;IAXC,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU,EAAE,MAAmB;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC;CACF;AAED,MAAM,OAAO,kBAAkB;IAA/B;QACU,aAAQ,GAAG,IAAI,GAAG,EAAyB,CAAA;QAC3C,WAAM,GAAG,IAAI,GAAG,EAAuB,CAAA;IAyBjD,CAAC;IAvBC,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,MAAqB;QAChD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU;QAC5B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,MAAmB;QAC5C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACxB,CAAC;CACF"}
@@ -0,0 +1,84 @@
1
+ export type ObulSession = {
2
+ authenticated: boolean;
3
+ expiresAt?: number;
4
+ limits?: {
5
+ allowed_hosts: string[];
6
+ max_price_per_request: number;
7
+ };
8
+ };
9
+ export type TokenRecord = {
10
+ accessToken: string;
11
+ refreshToken?: string;
12
+ expiresAt: number;
13
+ };
14
+ export type SessionRecord = {
15
+ id: string;
16
+ tokenId: string;
17
+ csrfToken: string;
18
+ expiresAt: number;
19
+ };
20
+ export type StateRecord = {
21
+ codeVerifier: string;
22
+ returnTo?: string;
23
+ createdAt: number;
24
+ };
25
+ export interface TokenStore {
26
+ get: (id: string) => Promise<TokenRecord | undefined>;
27
+ set: (id: string, record: TokenRecord) => Promise<void>;
28
+ delete: (id: string) => Promise<void>;
29
+ }
30
+ export interface SessionStore {
31
+ getSession: (id: string) => Promise<SessionRecord | undefined>;
32
+ setSession: (id: string, record: SessionRecord) => Promise<void>;
33
+ deleteSession: (id: string) => Promise<void>;
34
+ getState: (id: string) => Promise<StateRecord | undefined>;
35
+ setState: (id: string, record: StateRecord) => Promise<void>;
36
+ deleteState: (id: string) => Promise<void>;
37
+ }
38
+ export type Logger = {
39
+ debug?: (message: string, meta?: unknown) => void;
40
+ info?: (message: string, meta?: unknown) => void;
41
+ warn?: (message: string, meta?: unknown) => void;
42
+ error?: (message: string, meta?: unknown) => void;
43
+ };
44
+ export type CookieOptions = {
45
+ httpOnly?: boolean;
46
+ secure?: boolean;
47
+ sameSite?: "lax" | "strict" | "none";
48
+ path?: string;
49
+ domain?: string;
50
+ maxAge?: number;
51
+ };
52
+ export type ObulServerConfig = {
53
+ issuerUrl: string;
54
+ authEndpoint: string;
55
+ tokenEndpoint: string;
56
+ revocationEndpoint?: string;
57
+ apiBaseUrl?: string;
58
+ clientId: string;
59
+ clientSecret?: string;
60
+ redirectUri: string;
61
+ scopes: string[];
62
+ cookieName?: string;
63
+ cookieOptions?: CookieOptions;
64
+ stateTtlSeconds?: number;
65
+ sessionTtlSeconds?: number;
66
+ tokenStore?: TokenStore;
67
+ sessionStore?: SessionStore;
68
+ logger?: Logger;
69
+ postLoginRedirect?: string;
70
+ postLogoutRedirect?: string;
71
+ basePath?: string;
72
+ fetch?: FetchLike;
73
+ crypto?: CryptoLike;
74
+ clock?: Clock;
75
+ };
76
+ export type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
77
+ export type CryptoLike = {
78
+ randomBytes: (length: number) => Uint8Array;
79
+ sha256: (input: Uint8Array) => Promise<Uint8Array>;
80
+ };
81
+ export type Clock = {
82
+ now: () => number;
83
+ };
84
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,aAAa,EAAE,OAAO,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE;QACP,aAAa,EAAE,MAAM,EAAE,CAAA;QACvB,qBAAqB,EAAE,MAAM,CAAA;KAC9B,CAAA;CACF,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAA;IACrD,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACtC;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAA;IAC9D,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAChE,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5C,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAA;IAC1D,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IACjD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAChD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAChD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CAClD,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE3F,MAAM,MAAM,UAAU,GAAG;IACvB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,CAAA;IAC3C,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;CACnD,CAAA;AAED,MAAM,MAAM,KAAK,GAAG;IAClB,GAAG,EAAE,MAAM,MAAM,CAAA;CAClB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export * from "./core";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./core";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA"}
@@ -0,0 +1,31 @@
1
+ import type { ObulServerConfig, ObulSession } from "../core/types";
2
+ export type HandleCallbackResult = {
3
+ ok: boolean;
4
+ redirectTo?: string;
5
+ session?: ObulSession;
6
+ error?: {
7
+ code: string;
8
+ message: string;
9
+ };
10
+ };
11
+ export declare function createObulServer(config: ObulServerConfig): {
12
+ handle: (request: Request) => Promise<Response>;
13
+ obulClient: {
14
+ getAuthUrl: (params: {
15
+ state: string;
16
+ codeChallenge: string;
17
+ }) => string;
18
+ exchangeCode: (params: {
19
+ code: string;
20
+ codeVerifier: string;
21
+ }) => Promise<import("../core/oauth").TokenResponse>;
22
+ refresh: (params: {
23
+ refreshToken: string;
24
+ }) => Promise<import("../core/oauth").TokenResponse>;
25
+ revoke: (params: {
26
+ token: string;
27
+ tokenTypeHint?: "access_token" | "refresh_token";
28
+ }) => Promise<void>;
29
+ };
30
+ };
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAGV,gBAAgB,EAChB,WAAW,EAMZ,MAAM,eAAe,CAAA;AAQtB,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,OAAO,CAAA;IACX,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAC1C,CAAA;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB;sBAoXxB,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;yBA9S5C,CAAC;;;EAkUhB"}