@atxp/common 0.2.5

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 (66) hide show
  1. package/README.md +176 -0
  2. package/dist/commonTestHelpers.d.ts +83 -0
  3. package/dist/commonTestHelpers.d.ts.map +1 -0
  4. package/dist/commonTestHelpers.js +115 -0
  5. package/dist/commonTestHelpers.js.map +1 -0
  6. package/dist/index.d.ts +15 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +15 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/jwt.d.ts +9 -0
  11. package/dist/jwt.d.ts.map +1 -0
  12. package/dist/jwt.js +29 -0
  13. package/dist/jwt.js.map +1 -0
  14. package/dist/logger.d.ts +18 -0
  15. package/dist/logger.d.ts.map +1 -0
  16. package/dist/logger.js +43 -0
  17. package/dist/logger.js.map +1 -0
  18. package/dist/mcpJson.d.ts +9 -0
  19. package/dist/mcpJson.d.ts.map +1 -0
  20. package/dist/mcpJson.js +127 -0
  21. package/dist/mcpJson.js.map +1 -0
  22. package/dist/memoryOAuthDb.d.ts +25 -0
  23. package/dist/memoryOAuthDb.d.ts.map +1 -0
  24. package/dist/memoryOAuthDb.js +97 -0
  25. package/dist/memoryOAuthDb.js.map +1 -0
  26. package/dist/oAuthDb.d.ts +26 -0
  27. package/dist/oAuthDb.d.ts.map +1 -0
  28. package/dist/oAuthDb.js +145 -0
  29. package/dist/oAuthDb.js.map +1 -0
  30. package/dist/oAuthDbFactory.d.ts +30 -0
  31. package/dist/oAuthDbFactory.d.ts.map +1 -0
  32. package/dist/oAuthDbFactory.js +37 -0
  33. package/dist/oAuthDbFactory.js.map +1 -0
  34. package/dist/oAuthResource.d.ts +35 -0
  35. package/dist/oAuthResource.d.ts.map +1 -0
  36. package/dist/oAuthResource.js +241 -0
  37. package/dist/oAuthResource.js.map +1 -0
  38. package/dist/paymentRequiredError.d.ts +6 -0
  39. package/dist/paymentRequiredError.d.ts.map +1 -0
  40. package/dist/paymentRequiredError.js +14 -0
  41. package/dist/paymentRequiredError.js.map +1 -0
  42. package/dist/platform/index.d.ts +27 -0
  43. package/dist/platform/index.d.ts.map +1 -0
  44. package/dist/platform/index.js +204 -0
  45. package/dist/platform/index.js.map +1 -0
  46. package/dist/redisOAuthDb.d.ts +36 -0
  47. package/dist/redisOAuthDb.d.ts.map +1 -0
  48. package/dist/redisOAuthDb.js +160 -0
  49. package/dist/redisOAuthDb.js.map +1 -0
  50. package/dist/servers.d.ts +14 -0
  51. package/dist/servers.d.ts.map +1 -0
  52. package/dist/servers.js +14 -0
  53. package/dist/servers.js.map +1 -0
  54. package/dist/sseParser.d.ts +27 -0
  55. package/dist/sseParser.d.ts.map +1 -0
  56. package/dist/sseParser.js +100 -0
  57. package/dist/sseParser.js.map +1 -0
  58. package/dist/types.d.ts +71 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +9 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/utils.d.ts +19 -0
  63. package/dist/utils.d.ts.map +1 -0
  64. package/dist/utils.js +24 -0
  65. package/dist/utils.js.map +1 -0
  66. package/package.json +43 -0
@@ -0,0 +1,127 @@
1
+ import { PAYMENT_REQUIRED_ERROR_CODE, PAYMENT_REQUIRED_PREAMBLE } from './paymentRequiredError.js';
2
+ import { isJSONRPCError, isJSONRPCResponse, JSONRPCMessageSchema } from '@modelcontextprotocol/sdk/types.js';
3
+ import { ZodError } from 'zod';
4
+ import { isSSEResponse, parseSSEMessages, extractJSONFromSSE } from './sseParser.js';
5
+ export function parsePaymentRequests(message) {
6
+ const res = [];
7
+ // Handle MCP protocol-level errors. These have an explicit error code that we can check for
8
+ if (isJSONRPCError(message)) {
9
+ // Explicitly throw payment required errors that result in MCP protocol-level errors
10
+ const rpcError = message;
11
+ if (rpcError.error.code === PAYMENT_REQUIRED_ERROR_CODE) {
12
+ const paymentRequestUrl = rpcError.error.data?.paymentRequestUrl;
13
+ const dataPr = _parsePaymentRequestFromString(paymentRequestUrl);
14
+ if (dataPr) {
15
+ res.push(dataPr);
16
+ }
17
+ else {
18
+ const pr = _parsePaymentRequestFromString(rpcError.error.message);
19
+ if (pr) {
20
+ res.push(pr);
21
+ }
22
+ }
23
+ }
24
+ // Elicitation - required errors
25
+ // Current draft of elicitation-required error code as per
26
+ // https://github.com/modelcontextprotocol/modelcontextprotocol/pull/887
27
+ if (rpcError.error.code === -32604) {
28
+ const elicitations = rpcError.error.data?.elicitations || [];
29
+ for (const elicitation of elicitations) {
30
+ if (elicitation?.mode === 'url') {
31
+ const pr = _parsePaymentRequestFromString(elicitation?.url);
32
+ if (pr) {
33
+ res.push(pr);
34
+ }
35
+ }
36
+ }
37
+ }
38
+ }
39
+ // TODO: Ensure that ATXP errors only come back as MCP protocol-level errors.
40
+ // Handle MCP tool application-level errors. For these, the error message is serialized into a normal
41
+ // tool response with the isError flag set
42
+ if (isJSONRPCResponse(message)) {
43
+ const toolResult = message.result;
44
+ if (toolResult.isError) {
45
+ for (const content of toolResult.content) {
46
+ if (content.type === 'text') {
47
+ const text = content.text;
48
+ if (text.includes(PAYMENT_REQUIRED_PREAMBLE) && text.includes(PAYMENT_REQUIRED_ERROR_CODE.toString())) {
49
+ const pr = _parsePaymentRequestFromString(text);
50
+ if (pr) {
51
+ res.push(pr);
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
57
+ }
58
+ return res;
59
+ }
60
+ function _parsePaymentRequestFromString(text) {
61
+ if (!text) {
62
+ return null;
63
+ }
64
+ const paymentRequestUrl = /(http[^ ]+)\/payment-request\/([^ ]+)/.exec(text);
65
+ if (paymentRequestUrl) {
66
+ const id = paymentRequestUrl[2];
67
+ const url = paymentRequestUrl[0];
68
+ return { url, id };
69
+ }
70
+ return null;
71
+ }
72
+ export async function parseMcpMessages(json, logger) {
73
+ let messages = [];
74
+ try {
75
+ // Check if the response is SSE formatted
76
+ if (typeof json === 'string' && isSSEResponse(json)) {
77
+ logger?.debug('Detected SSE-formatted response, parsing SSE messages');
78
+ const sseMessages = parseSSEMessages(json);
79
+ const jsonMessages = extractJSONFromSSE(sseMessages, logger);
80
+ // Process each JSON message from SSE
81
+ for (const jsonMsg of jsonMessages) {
82
+ try {
83
+ if (Array.isArray(jsonMsg)) {
84
+ // Handle batch messages from SSE
85
+ const batchMessages = jsonMsg.map(msg => JSONRPCMessageSchema.parse(msg));
86
+ messages.push(...batchMessages);
87
+ }
88
+ else {
89
+ // Handle single message from SSE
90
+ const message = JSONRPCMessageSchema.parse(jsonMsg);
91
+ messages.push(message);
92
+ }
93
+ }
94
+ catch (parseError) {
95
+ if (parseError instanceof ZodError) {
96
+ logger?.warn(`Invalid JSON-RPC message format in SSE data`);
97
+ logger?.debug(parseError.message);
98
+ }
99
+ else {
100
+ logger?.error(`Unexpected error parsing JSON-RPC message from SSE: ${parseError}`);
101
+ }
102
+ }
103
+ }
104
+ }
105
+ else {
106
+ // Handle regular JSON responses
107
+ if (Array.isArray(json)) {
108
+ messages = json.map(msg => JSONRPCMessageSchema.parse(msg));
109
+ }
110
+ else {
111
+ messages = [JSONRPCMessageSchema.parse(json)];
112
+ }
113
+ }
114
+ }
115
+ catch (error) {
116
+ // If Zod validation fails, log the error and return empty array
117
+ if (error instanceof ZodError) {
118
+ logger?.warn(`Invalid JSON-RPC message format`);
119
+ logger?.debug(error.message);
120
+ }
121
+ else {
122
+ logger?.error(`Unexpected error parsing JSON-RPC messages: ${error}`);
123
+ }
124
+ }
125
+ return messages;
126
+ }
127
+ //# sourceMappingURL=mcpJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpJson.js","sourceRoot":"","sources":["../src/mcpJson.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { OAuthDb, ClientCredentials, PKCEValues, AccessToken, Logger } from './types.js';
2
+ export interface MemoryOAuthDbConfig {
3
+ logger?: Logger;
4
+ }
5
+ export declare class MemoryOAuthDb implements OAuthDb {
6
+ private clientCredentials;
7
+ private pkceValues;
8
+ private accessTokens;
9
+ private logger;
10
+ constructor(config?: MemoryOAuthDbConfig);
11
+ getClientCredentials(serverUrl: string): Promise<ClientCredentials | null>;
12
+ saveClientCredentials(serverUrl: string, credentials: ClientCredentials): Promise<void>;
13
+ getPKCEValues(userId: string, state: string): Promise<PKCEValues | null>;
14
+ savePKCEValues(userId: string, state: string, values: PKCEValues): Promise<void>;
15
+ getAccessToken(userId: string, url: string): Promise<AccessToken | null>;
16
+ saveAccessToken(userId: string, url: string, token: AccessToken): Promise<void>;
17
+ close(): Promise<void>;
18
+ getStats(): {
19
+ clientCredentials: number;
20
+ pkceValues: number;
21
+ accessTokens: number;
22
+ };
23
+ cleanupExpiredTokens(): number;
24
+ }
25
+ //# sourceMappingURL=memoryOAuthDb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryOAuthDb.d.ts","sourceRoot":"","sources":["../src/memoryOAuthDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAY,MAAM,YAAY,CAAC;AAGnG,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAc,YAAW,OAAO;IAC3C,OAAO,CAAC,iBAAiB,CAAwC;IACjE,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,GAAE,mBAAwB;IAMtC,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAW1E,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvF,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAMxE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhF,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqBxE,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,QAAQ;;;;;IASR,oBAAoB,IAAI,MAAM;CAiB/B"}
@@ -0,0 +1,97 @@
1
+ import { LogLevel } from './types.js';
2
+ import { ConsoleLogger } from './logger.js';
3
+ export class MemoryOAuthDb {
4
+ constructor(config = {}) {
5
+ this.clientCredentials = new Map();
6
+ this.pkceValues = new Map(); // key: `${userId}:${state}`
7
+ this.accessTokens = new Map(); // key: `${userId}:${url}`
8
+ this.logger = config.logger || new ConsoleLogger({ prefix: '[memory-oauth-db]', level: LogLevel.INFO });
9
+ this.logger.info(`Initialized in-memory OAuth database (instance: ${Math.random().toString(36).substr(2, 9)})`);
10
+ }
11
+ // OAuthResourceDb methods
12
+ async getClientCredentials(serverUrl) {
13
+ const credentials = this.clientCredentials.get(serverUrl) || null;
14
+ if (credentials) {
15
+ this.logger.debug(`Getting client credentials for server: ${serverUrl} (cached)`);
16
+ }
17
+ else {
18
+ this.logger.info(`Getting client credentials for server: ${serverUrl} (not cached)`);
19
+ this.logger.debug(`Available keys in cache: ${Array.from(this.clientCredentials.keys()).join(', ')}`);
20
+ }
21
+ return credentials;
22
+ }
23
+ async saveClientCredentials(serverUrl, credentials) {
24
+ this.logger.info(`Saving client credentials for server: ${serverUrl}`);
25
+ this.logger.debug(`Client credentials: clientId=${credentials.clientId}`);
26
+ this.clientCredentials.set(serverUrl, credentials);
27
+ }
28
+ // OAuthDb methods
29
+ async getPKCEValues(userId, state) {
30
+ const key = `${userId}:${state}`;
31
+ this.logger.info(`Getting PKCE values for user: ${userId}, state: ${state}`);
32
+ return this.pkceValues.get(key) || null;
33
+ }
34
+ async savePKCEValues(userId, state, values) {
35
+ const key = `${userId}:${state}`;
36
+ this.logger.info(`Saving PKCE values for user: ${userId}, state: ${state}`);
37
+ this.pkceValues.set(key, values);
38
+ }
39
+ async getAccessToken(userId, url) {
40
+ const key = `${userId}:${url}`;
41
+ this.logger.info(`Getting access token for user: ${userId}, url: ${url}`);
42
+ const token = this.accessTokens.get(key);
43
+ if (!token) {
44
+ this.logger.debug(`No cached token found for key: ${key}`);
45
+ return null;
46
+ }
47
+ // Check if token has expired
48
+ if (token.expiresAt && token.expiresAt < Date.now()) {
49
+ this.logger.info(`Access token expired for user: ${userId}, url: ${url}`);
50
+ this.accessTokens.delete(key);
51
+ return null;
52
+ }
53
+ this.logger.debug(`Found valid cached token for user: ${userId}, url: ${url}`);
54
+ return token;
55
+ }
56
+ async saveAccessToken(userId, url, token) {
57
+ const key = `${userId}:${url}`;
58
+ const existingToken = this.accessTokens.get(key);
59
+ if (existingToken) {
60
+ this.logger.debug(`Updating access token for user: ${userId}, url: ${url}`);
61
+ }
62
+ else {
63
+ this.logger.info(`Saving new access token for user: ${userId}, url: ${url}`);
64
+ }
65
+ this.accessTokens.set(key, token);
66
+ }
67
+ async close() {
68
+ this.logger.info('Closing in-memory OAuth database');
69
+ this.clientCredentials.clear();
70
+ this.pkceValues.clear();
71
+ this.accessTokens.clear();
72
+ }
73
+ // Utility methods for debugging/monitoring
74
+ getStats() {
75
+ return {
76
+ clientCredentials: this.clientCredentials.size,
77
+ pkceValues: this.pkceValues.size,
78
+ accessTokens: this.accessTokens.size
79
+ };
80
+ }
81
+ // Clean up expired tokens periodically
82
+ cleanupExpiredTokens() {
83
+ const now = Date.now();
84
+ let cleaned = 0;
85
+ for (const [key, token] of this.accessTokens.entries()) {
86
+ if (token.expiresAt && token.expiresAt < now) {
87
+ this.accessTokens.delete(key);
88
+ cleaned++;
89
+ }
90
+ }
91
+ if (cleaned > 0) {
92
+ this.logger.info(`Cleaned up ${cleaned} expired access tokens`);
93
+ }
94
+ return cleaned;
95
+ }
96
+ }
97
+ //# sourceMappingURL=memoryOAuthDb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryOAuthDb.js","sourceRoot":"","sources":["../src/memoryOAuthDb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { SQLiteDatabase } from './platform/index.js';
2
+ import type { AccessToken, ClientCredentials, Logger, OAuthDb, PKCEValues } from './types.js';
3
+ export interface OAuthDbConfig {
4
+ db?: string | SQLiteDatabase;
5
+ encrypt?: (data: string) => string;
6
+ decrypt?: (data: string) => string;
7
+ logger?: Logger;
8
+ }
9
+ export declare class SqliteOAuthDb implements OAuthDb {
10
+ private db;
11
+ private initialized;
12
+ private encrypt;
13
+ private decrypt;
14
+ private logger;
15
+ static getDefaultDbPath(): string;
16
+ constructor({ db, encrypt, decrypt, logger }?: OAuthDbConfig);
17
+ ensureInitialized: () => Promise<void>;
18
+ getClientCredentials: (resourceUrl: string) => Promise<ClientCredentials | null>;
19
+ saveClientCredentials: (resourceUrl: string, credentials: ClientCredentials) => Promise<void>;
20
+ getPKCEValues: (userId: string, state: string) => Promise<PKCEValues | null>;
21
+ savePKCEValues: (userId: string, state: string, values: PKCEValues) => Promise<void>;
22
+ getAccessToken: (userId: string, url: string) => Promise<AccessToken | null>;
23
+ saveAccessToken: (userId: string, url: string, token: AccessToken) => Promise<void>;
24
+ close: () => Promise<void>;
25
+ }
26
+ //# sourceMappingURL=oAuthDb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oAuthDb.d.ts","sourceRoot":"","sources":["../src/oAuthDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9F,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAC7B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAc,YAAW,OAAO;IAC3C,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAAS;IAEvB,MAAM,CAAC,gBAAgB,IAAI,MAAM;gBAIrB,EACV,EAAqC,EACrC,OAAgC,EAChC,OAAgC,EAChC,MAA4B,EAC7B,GAAE,aAAkB;IAOrB,iBAAiB,QAAa,OAAO,CAAC,IAAI,CAAC,CAkC1C;IAED,oBAAoB,GAAU,aAAa,MAAM,KAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAgBpF;IAED,qBAAqB,GACnB,aAAa,MAAM,EACnB,aAAa,iBAAiB,KAC7B,OAAO,CAAC,IAAI,CAAC,CAef;IAED,aAAa,GAAU,QAAQ,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAkBhF;IAED,cAAc,GACZ,QAAQ,MAAM,EACd,OAAO,MAAM,EACb,QAAQ,UAAU,KACjB,OAAO,CAAC,IAAI,CAAC,CAiBf;IAED,cAAc,GAAU,QAAQ,MAAM,EAAE,KAAK,MAAM,KAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAoBhF;IAED,eAAe,GACb,QAAQ,MAAM,EACd,KAAK,MAAM,EACX,OAAO,WAAW,KACjB,OAAO,CAAC,IAAI,CAAC,CAiBf;IAED,KAAK,QAAa,OAAO,CAAC,IAAI,CAAC,CAW9B;CACF"}
@@ -0,0 +1,145 @@
1
+ import { sqlite } from './platform/index.js';
2
+ import { ConsoleLogger } from './logger.js';
3
+ export class SqliteOAuthDb {
4
+ static getDefaultDbPath() {
5
+ return 'oauthClient.db';
6
+ }
7
+ constructor({ db = SqliteOAuthDb.getDefaultDbPath(), encrypt = (data) => data, decrypt = (data) => data, logger = new ConsoleLogger() } = {}) {
8
+ this.initialized = false;
9
+ this.ensureInitialized = async () => {
10
+ if (this.initialized)
11
+ return;
12
+ // Create tables
13
+ await this.db.execAsync(`
14
+ CREATE TABLE IF NOT EXISTS oauth_client_credentials (
15
+ resource_url TEXT PRIMARY KEY,
16
+ encrypted_client_id TEXT NOT NULL,
17
+ encrypted_client_secret TEXT NOT NULL,
18
+ redirect_uri TEXT NOT NULL
19
+ );
20
+
21
+ CREATE TABLE IF NOT EXISTS oauth_pkce_values (
22
+ user_id TEXT NOT NULL,
23
+ state TEXT NOT NULL,
24
+ encrypted_code_verifier TEXT NOT NULL,
25
+ encrypted_code_challenge TEXT NOT NULL,
26
+ resource_url TEXT NOT NULL,
27
+ url TEXT NOT NULL,
28
+ PRIMARY KEY (user_id, state)
29
+ );
30
+
31
+ CREATE TABLE IF NOT EXISTS oauth_access_tokens (
32
+ user_id TEXT NOT NULL,
33
+ url TEXT NOT NULL,
34
+ resource_url TEXT NOT NULL,
35
+ encrypted_access_token TEXT NOT NULL,
36
+ encrypted_refresh_token TEXT,
37
+ expires_at TEXT,
38
+ PRIMARY KEY (user_id, url)
39
+ );
40
+ `);
41
+ this.initialized = true;
42
+ };
43
+ this.getClientCredentials = async (resourceUrl) => {
44
+ await this.ensureInitialized();
45
+ const preparedRow = await this.db.prepareAsync('SELECT encrypted_client_id, encrypted_client_secret, redirect_uri FROM oauth_client_credentials WHERE resource_url = ?');
46
+ try {
47
+ const rowIterator = await preparedRow.executeAsync(resourceUrl);
48
+ const row = await rowIterator.getFirstAsync();
49
+ return row ? {
50
+ clientId: this.decrypt(row.encrypted_client_id),
51
+ clientSecret: this.decrypt(row.encrypted_client_secret),
52
+ redirectUri: row.redirect_uri
53
+ } : null;
54
+ }
55
+ finally {
56
+ await preparedRow.finalizeAsync();
57
+ }
58
+ };
59
+ this.saveClientCredentials = async (resourceUrl, credentials) => {
60
+ await this.ensureInitialized();
61
+ const statement = await this.db.prepareAsync('INSERT OR REPLACE INTO oauth_client_credentials (resource_url, encrypted_client_id, encrypted_client_secret, redirect_uri) VALUES (?, ?, ?, ?)');
62
+ try {
63
+ await statement.executeAsync(resourceUrl, this.encrypt(credentials.clientId), this.encrypt(credentials.clientSecret), credentials.redirectUri);
64
+ }
65
+ finally {
66
+ await statement.finalizeAsync();
67
+ }
68
+ };
69
+ this.getPKCEValues = async (userId, state) => {
70
+ await this.ensureInitialized();
71
+ const statement = await this.db.prepareAsync('SELECT encrypted_code_verifier, encrypted_code_challenge, resource_url, url FROM oauth_pkce_values WHERE user_id = ? AND state = ?');
72
+ try {
73
+ const result = await statement.executeAsync(userId, state);
74
+ const row = await result.getFirstAsync();
75
+ return row ? {
76
+ codeVerifier: this.decrypt(row.encrypted_code_verifier),
77
+ codeChallenge: this.decrypt(row.encrypted_code_challenge),
78
+ resourceUrl: row.resource_url,
79
+ url: row.url
80
+ } : null;
81
+ }
82
+ finally {
83
+ await statement.finalizeAsync();
84
+ }
85
+ };
86
+ this.savePKCEValues = async (userId, state, values) => {
87
+ await this.ensureInitialized();
88
+ const statement = await this.db.prepareAsync('INSERT INTO oauth_pkce_values (user_id, state, encrypted_code_verifier, encrypted_code_challenge, resource_url, url) VALUES (?, ?, ?, ?, ?, ?)');
89
+ try {
90
+ await statement.executeAsync(userId, state, this.encrypt(values.codeVerifier), this.encrypt(values.codeChallenge), values.resourceUrl, values.url);
91
+ }
92
+ finally {
93
+ await statement.finalizeAsync();
94
+ }
95
+ };
96
+ this.getAccessToken = async (userId, url) => {
97
+ await this.ensureInitialized();
98
+ const statement = await this.db.prepareAsync('SELECT resource_url, encrypted_access_token, encrypted_refresh_token, expires_at FROM oauth_access_tokens WHERE user_id = ? AND url = ?');
99
+ try {
100
+ const result = await statement.executeAsync(userId, url);
101
+ const row = await result.getFirstAsync();
102
+ if (!row)
103
+ return null;
104
+ return {
105
+ accessToken: this.decrypt(row.encrypted_access_token),
106
+ refreshToken: row.encrypted_refresh_token ? this.decrypt(row.encrypted_refresh_token) : undefined,
107
+ expiresAt: row.expires_at ? parseInt(row.expires_at) : undefined,
108
+ resourceUrl: row.resource_url
109
+ };
110
+ }
111
+ finally {
112
+ await statement.finalizeAsync();
113
+ }
114
+ };
115
+ this.saveAccessToken = async (userId, url, token) => {
116
+ await this.ensureInitialized();
117
+ const statement = await this.db.prepareAsync('INSERT OR REPLACE INTO oauth_access_tokens (user_id, url, resource_url, encrypted_access_token, encrypted_refresh_token, expires_at) VALUES (?, ?, ?, ?, ?, ?)');
118
+ try {
119
+ await statement.executeAsync(userId, url, token.resourceUrl, this.encrypt(token.accessToken), token.refreshToken ? this.encrypt(token.refreshToken) : null, token.expiresAt?.toString() ?? null);
120
+ }
121
+ finally {
122
+ await statement.finalizeAsync();
123
+ }
124
+ };
125
+ this.close = async () => {
126
+ try {
127
+ await this.db.closeAsync();
128
+ }
129
+ catch (error) {
130
+ // If database is already closed, just log and continue
131
+ if (error && typeof error === 'object' && 'code' in error && error.code === 'SQLITE_MISUSE') {
132
+ this.logger.warn('Database already closed');
133
+ }
134
+ else {
135
+ throw error;
136
+ }
137
+ }
138
+ };
139
+ this.db = typeof db === 'string' ? sqlite.openDatabase(db) : db;
140
+ this.encrypt = encrypt;
141
+ this.decrypt = decrypt;
142
+ this.logger = logger;
143
+ }
144
+ }
145
+ //# sourceMappingURL=oAuthDb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oAuthDb.js","sourceRoot":"","sources":["../src/oAuthDb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { OAuthDb, Logger } from './types.js';
2
+ import { SqliteOAuthDb, OAuthDbConfig } from './oAuthDb.js';
3
+ import { MemoryOAuthDb, MemoryOAuthDbConfig } from './memoryOAuthDb.js';
4
+ import { RedisOAuthDb, RedisOAuthDbConfig } from './redisOAuthDb.js';
5
+ export interface OAuthDbFactoryConfig {
6
+ db?: string;
7
+ encrypt?: (data: string) => string;
8
+ decrypt?: (data: string) => string;
9
+ logger?: Logger;
10
+ }
11
+ /**
12
+ * Factory function that creates the appropriate OAuthDb implementation.
13
+ * Uses RedisOAuthDb when Redis client or URL is provided.
14
+ * Uses MemoryOAuthDb for ':memory:' databases to avoid SQLite dependency.
15
+ * Uses SqliteOAuthDb for persistent storage.
16
+ */
17
+ export declare function createOAuthDb(config?: OAuthDbFactoryConfig): OAuthDb;
18
+ /**
19
+ * Convenience function for creating an in-memory OAuth database
20
+ */
21
+ export declare function createMemoryOAuthDb(config?: MemoryOAuthDbConfig): MemoryOAuthDb;
22
+ /**
23
+ * Convenience function for creating a SQLite OAuth database
24
+ */
25
+ export declare function createSqliteOAuthDb(config?: OAuthDbConfig): SqliteOAuthDb;
26
+ /**
27
+ * Convenience function for creating a Redis OAuth database
28
+ */
29
+ export declare function createRedisOAuthDb(config: RedisOAuthDbConfig): RedisOAuthDb;
30
+ //# sourceMappingURL=oAuthDbFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oAuthDbFactory.d.ts","sourceRoot":"","sources":["../src/oAuthDbFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAErE,MAAM,WAAW,oBAAoB;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,oBAAyB,GAAG,OAAO,CAUxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,mBAAwB,GAAG,aAAa,CAEnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,aAAkB,GAAG,aAAa,CAE7E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAE3E"}
@@ -0,0 +1,37 @@
1
+ import { SqliteOAuthDb } from './oAuthDb.js';
2
+ import { MemoryOAuthDb } from './memoryOAuthDb.js';
3
+ import { RedisOAuthDb } from './redisOAuthDb.js';
4
+ /**
5
+ * Factory function that creates the appropriate OAuthDb implementation.
6
+ * Uses RedisOAuthDb when Redis client or URL is provided.
7
+ * Uses MemoryOAuthDb for ':memory:' databases to avoid SQLite dependency.
8
+ * Uses SqliteOAuthDb for persistent storage.
9
+ */
10
+ export function createOAuthDb(config = {}) {
11
+ const { db = SqliteOAuthDb.getDefaultDbPath(), ...otherConfig } = config;
12
+ // Use in-memory implementation for ':memory:' databases
13
+ if (db === ':memory:') {
14
+ return new MemoryOAuthDb({ logger: otherConfig.logger });
15
+ }
16
+ // Use SQLite implementation for persistent storage
17
+ return new SqliteOAuthDb({ db, ...otherConfig });
18
+ }
19
+ /**
20
+ * Convenience function for creating an in-memory OAuth database
21
+ */
22
+ export function createMemoryOAuthDb(config = {}) {
23
+ return new MemoryOAuthDb(config);
24
+ }
25
+ /**
26
+ * Convenience function for creating a SQLite OAuth database
27
+ */
28
+ export function createSqliteOAuthDb(config = {}) {
29
+ return new SqliteOAuthDb(config);
30
+ }
31
+ /**
32
+ * Convenience function for creating a Redis OAuth database
33
+ */
34
+ export function createRedisOAuthDb(config) {
35
+ return new RedisOAuthDb(config);
36
+ }
37
+ //# sourceMappingURL=oAuthDbFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oAuthDbFactory.js","sourceRoot":"","sources":["../src/oAuthDbFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAiB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAuB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAsB,MAAM,mBAAmB,CAAC;AASrE;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,SAA+B,EAAE;IAC7D,MAAM,EAAE,EAAE,GAAG,aAAa,CAAC,gBAAgB,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC;IAEzE,wDAAwD;IACxD,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;QACtB,OAAO,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,mDAAmD;IACnD,OAAO,IAAI,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAA8B,EAAE;IAClE,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAwB,EAAE;IAC5D,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC3D,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,35 @@
1
+ import * as oauth from 'oauth4webapi';
2
+ import { ClientCredentials, FetchLike, OAuthResourceDb, OAuthDb, TokenData, Logger } from './types.js';
3
+ export interface OAuthResourceClientConfig {
4
+ db: OAuthDb;
5
+ callbackUrl?: string;
6
+ isPublic?: boolean;
7
+ sideChannelFetch?: FetchLike;
8
+ strict?: boolean;
9
+ allowInsecureRequests?: boolean;
10
+ clientName?: string;
11
+ logger?: Logger;
12
+ }
13
+ export declare class OAuthResourceClient {
14
+ protected db: OAuthResourceDb;
15
+ protected allowInsecureRequests: boolean;
16
+ protected callbackUrl: string;
17
+ protected sideChannelFetch: FetchLike;
18
+ protected strict: boolean;
19
+ protected clientName: string;
20
+ protected isPublic: boolean;
21
+ protected logger: Logger;
22
+ private registrationLocks;
23
+ constructor({ db, callbackUrl, isPublic, sideChannelFetch, strict, allowInsecureRequests, clientName, logger }: OAuthResourceClientConfig);
24
+ static trimToPath: (url: string) => string;
25
+ static getParentPath: (url: string) => string | null;
26
+ introspectToken: (authorizationServerUrl: string, token: string, additionalParameters?: Record<string, string>) => Promise<TokenData>;
27
+ getAuthorizationServer: (resourceServerUrl: string) => Promise<oauth.AuthorizationServer>;
28
+ authorizationServerFromUrl: (authServerUrl: URL) => Promise<oauth.AuthorizationServer>;
29
+ protected normalizeResourceServerUrl: (resourceServerUrl: string) => string;
30
+ protected getRegistrationMetadata: () => Promise<Partial<oauth.OmitSymbolProperties<oauth.Client>>>;
31
+ protected registerClient: (authorizationServer: oauth.AuthorizationServer) => Promise<ClientCredentials>;
32
+ protected getClientCredentials: (authorizationServer: oauth.AuthorizationServer) => Promise<ClientCredentials>;
33
+ protected makeOAuthClientAndAuth: (credentials: ClientCredentials) => [oauth.Client, oauth.ClientAuth];
34
+ }
35
+ //# sourceMappingURL=oAuthResource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oAuthResource.d.ts","sourceRoot":"","sources":["../src/oAuthResource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGvG,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAK9B,SAAS,CAAC,EAAE,EAAE,eAAe,CAAC;IAC9B,SAAS,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACzC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC;IACtC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAG7B,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,iBAAiB,CAAiD;gBAE9D,EACV,EAAE,EACF,WAAkE,EAClE,QAAgB,EAChB,gBAAwB,EACxB,MAAc,EACd,qBAA8D,EAC9D,UAAyC,EACzC,MAA4B,EAC7B,EAAE,yBAAyB;IAa5B,MAAM,CAAC,UAAU,GAAI,KAAK,MAAM,KAAG,MAAM,CAWxC;IAED,MAAM,CAAC,aAAa,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,IAAI,CAKlD;IAED,eAAe,GAAU,wBAAwB,MAAM,EAAE,OAAO,MAAM,EAAE,uBAAuB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,OAAO,CAAC,SAAS,CAAC,CAkEzI;IAED,sBAAsB,GAAU,mBAAmB,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CA8C7F;IAED,0BAA0B,GAAU,eAAe,GAAG,KAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAmB1F;IAED,SAAS,CAAC,0BAA0B,GAAI,mBAAmB,MAAM,KAAG,MAAM,CAQzE;IAED,SAAS,CAAC,uBAAuB,QAAa,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAYvG;IAED,SAAS,CAAC,cAAc,GAAU,qBAAqB,KAAK,CAAC,mBAAmB,KAAG,OAAO,CAAC,iBAAiB,CAAC,CAyC5G;IAED,SAAS,CAAC,oBAAoB,GAAU,qBAAqB,KAAK,CAAC,mBAAmB,KAAG,OAAO,CAAC,iBAAiB,CAAC,CAyBlH;IAED,SAAS,CAAC,sBAAsB,GAC9B,aAAa,iBAAiB,KAC7B,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAkBlC;CACF"}