@atxp/common 0.2.10 → 0.2.12
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 +19 -14
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -3
- package/dist/index.js.map +1 -1
- package/dist/paymentRequiredError.js +1 -1
- package/dist/paymentRequiredError.js.map +1 -1
- package/dist/platform/index.d.ts +0 -16
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/index.js +0 -94
- package/dist/platform/index.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -5
- package/dist/oAuthDb.d.ts +0 -26
- package/dist/oAuthDb.d.ts.map +0 -1
- package/dist/oAuthDb.js +0 -145
- package/dist/oAuthDb.js.map +0 -1
- package/dist/oAuthDbFactory.d.ts +0 -30
- package/dist/oAuthDbFactory.d.ts.map +0 -1
- package/dist/oAuthDbFactory.js +0 -37
- package/dist/oAuthDbFactory.js.map +0 -1
- package/dist/redisOAuthDb.d.ts +0 -36
- package/dist/redisOAuthDb.d.ts.map +0 -1
- package/dist/redisOAuthDb.js +0 -160
- package/dist/redisOAuthDb.js.map +0 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ The ATXP Common package provides shared utilities, types, and core functionality
|
|
|
11
11
|
## Features
|
|
12
12
|
|
|
13
13
|
- 🔐 **JWT Token Management**: Secure token creation, validation, and parsing
|
|
14
|
-
- 🗄️ **OAuth Database**: Abstract database interface with memory
|
|
14
|
+
- 🗄️ **OAuth Database**: Abstract database interface with memory implementation
|
|
15
15
|
- 📡 **MCP JSON Utilities**: Type-safe MCP protocol message handling
|
|
16
16
|
- 💰 **Payment Error Handling**: Structured payment requirement error types
|
|
17
17
|
- 🛠️ **Platform Utilities**: Cross-platform compatibility helpers
|
|
@@ -99,19 +99,18 @@ throw new PaymentRequiredError({
|
|
|
99
99
|
### Platform Utilities
|
|
100
100
|
|
|
101
101
|
```typescript
|
|
102
|
-
import {
|
|
102
|
+
import { crypto, isNode, getIsReactNative } from '@atxp/common';
|
|
103
103
|
|
|
104
104
|
// Detect runtime environment
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
if (
|
|
108
|
-
//
|
|
109
|
-
} else if (platform.isExpo) {
|
|
110
|
-
// Expo/React Native specific code
|
|
105
|
+
if (isNode) {
|
|
106
|
+
// Node.js specific code - can use SQLite or Redis
|
|
107
|
+
} else if (getIsReactNative()) {
|
|
108
|
+
// React Native/Expo - use MemoryOAuthDb
|
|
111
109
|
}
|
|
112
110
|
|
|
113
|
-
//
|
|
114
|
-
const
|
|
111
|
+
// Use platform-specific crypto
|
|
112
|
+
const hash = await crypto.digest(new TextEncoder().encode('data'));
|
|
113
|
+
const uuid = crypto.randomUUID();
|
|
115
114
|
```
|
|
116
115
|
|
|
117
116
|
## Type Definitions
|
|
@@ -136,11 +135,17 @@ const db = new MemoryOAuthDb();
|
|
|
136
135
|
// Tokens stored in memory, cleared on process restart
|
|
137
136
|
```
|
|
138
137
|
|
|
139
|
-
###
|
|
138
|
+
### Additional Database Options
|
|
139
|
+
|
|
140
|
+
For production use cases requiring persistent storage, see separate database packages:
|
|
141
|
+
|
|
142
|
+
- **`@atxp/sqlite`**: SQLite implementation using `better-sqlite3` (Node.js only)
|
|
143
|
+
- **`@atxp/redis`**: Redis implementation using `ioredis` for distributed applications
|
|
140
144
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
145
|
+
```bash
|
|
146
|
+
npm install @atxp/sqlite # For SQLite storage
|
|
147
|
+
npm install @atxp/redis # For Redis storage
|
|
148
|
+
```
|
|
144
149
|
|
|
145
150
|
## Logging
|
|
146
151
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
export * from './jwt.js';
|
|
2
2
|
export * from './logger.js';
|
|
3
|
-
export * from './oAuthDb.js';
|
|
4
3
|
export * from './memoryOAuthDb.js';
|
|
5
|
-
export * from './oAuthDbFactory.js';
|
|
6
|
-
export * from './redisOAuthDb.js';
|
|
7
4
|
export * from './oAuthResource.js';
|
|
8
5
|
export * from './paymentRequiredError.js';
|
|
9
6
|
export * from './servers.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
export * from './jwt.js';
|
|
2
2
|
export * from './logger.js';
|
|
3
|
-
export * from './oAuthDb.js';
|
|
4
3
|
export * from './memoryOAuthDb.js';
|
|
5
|
-
export * from './oAuthDbFactory.js';
|
|
6
|
-
export * from './redisOAuthDb.js';
|
|
7
4
|
export * from './oAuthResource.js';
|
|
8
5
|
export * from './paymentRequiredError.js';
|
|
9
6
|
export * from './servers.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC"}
|
|
@@ -9,6 +9,6 @@ export function paymentRequiredError(server, paymentRequestId, chargeAmount) {
|
|
|
9
9
|
const paymentRequestUrl = `${server}/payment-request/${paymentRequestId}`;
|
|
10
10
|
const data = { paymentRequestId, paymentRequestUrl, chargeAmount };
|
|
11
11
|
const amountText = chargeAmount ? ` You will be charged ${chargeAmount.toString()}.` : '';
|
|
12
|
-
return new McpError(PAYMENT_REQUIRED_ERROR_CODE, `${PAYMENT_REQUIRED_PREAMBLE}${amountText} Please pay at: ${paymentRequestUrl}
|
|
12
|
+
return new McpError(PAYMENT_REQUIRED_ERROR_CODE, `${PAYMENT_REQUIRED_PREAMBLE}${amountText} Please pay at: ${paymentRequestUrl} and then try again.`, data);
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=paymentRequiredError.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paymentRequiredError.js","sourceRoot":"","sources":["../src/paymentRequiredError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAI9D,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,KAAK,CAAC,CAAC,mBAAmB;AACtE,+FAA+F;AAC/F,iEAAiE;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,gCAAgC,CAAC;AAE1E,MAAM,UAAU,oBAAoB,CAAC,MAA8B,EAAE,gBAAwB,EAAE,YAAwB;IACrH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,GAAG,SAAS,CAAC,MAAgC,CAAC;IAEpD,MAAM,iBAAiB,GAAG,GAAG,MAAM,oBAAoB,gBAAgB,EAAE,CAAC;IAC1E,MAAM,IAAI,GAAG,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;IACnE,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,wBAAwB,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,OAAO,IAAI,QAAQ,CAAC,2BAA2B,EAAE,GAAG,yBAAyB,GAAG,UAAU,mBAAmB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"paymentRequiredError.js","sourceRoot":"","sources":["../src/paymentRequiredError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAI9D,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,KAAK,CAAC,CAAC,mBAAmB;AACtE,+FAA+F;AAC/F,iEAAiE;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,gCAAgC,CAAC;AAE1E,MAAM,UAAU,oBAAoB,CAAC,MAA8B,EAAE,gBAAwB,EAAE,YAAwB;IACrH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,GAAG,SAAS,CAAC,MAAgC,CAAC;IAEpD,MAAM,iBAAiB,GAAG,GAAG,MAAM,oBAAoB,gBAAgB,EAAE,CAAC;IAC1E,MAAM,IAAI,GAAG,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;IACnE,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,wBAAwB,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,OAAO,IAAI,QAAQ,CAAC,2BAA2B,EAAE,GAAG,yBAAyB,GAAG,UAAU,mBAAmB,iBAAiB,sBAAsB,EAAE,IAAI,CAAC,CAAC;AAC9J,CAAC"}
|
package/dist/platform/index.d.ts
CHANGED
|
@@ -4,21 +4,6 @@ export interface PlatformCrypto {
|
|
|
4
4
|
randomUUID: () => string;
|
|
5
5
|
toHex: (data: Uint8Array) => string;
|
|
6
6
|
}
|
|
7
|
-
export interface PlatformSQLite {
|
|
8
|
-
openDatabase: (name: string) => SQLiteDatabase;
|
|
9
|
-
}
|
|
10
|
-
export interface SQLiteDatabase {
|
|
11
|
-
execAsync: (sql: string) => Promise<void>;
|
|
12
|
-
prepareAsync: (sql: string) => Promise<SQLiteStatement>;
|
|
13
|
-
closeAsync: () => Promise<void>;
|
|
14
|
-
}
|
|
15
|
-
export interface SQLiteStatement {
|
|
16
|
-
executeAsync: <T = any>(...params: any[]) => Promise<SQLiteResult<T>>;
|
|
17
|
-
finalizeAsync: () => Promise<void>;
|
|
18
|
-
}
|
|
19
|
-
export interface SQLiteResult<T> {
|
|
20
|
-
getFirstAsync: () => Promise<T | null>;
|
|
21
|
-
}
|
|
22
7
|
export declare function getIsReactNative(): boolean;
|
|
23
8
|
export declare const isNode: boolean;
|
|
24
9
|
export declare const isBrowser: boolean;
|
|
@@ -26,5 +11,4 @@ export declare const isNextJS: boolean;
|
|
|
26
11
|
export declare const isWebEnvironment: boolean;
|
|
27
12
|
export declare const createReactNativeSafeFetch: (originalFetch: FetchLike) => FetchLike;
|
|
28
13
|
export declare let crypto: PlatformCrypto;
|
|
29
|
-
export declare let sqlite: PlatformSQLite;
|
|
30
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAClD,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,KAAK,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,MAAM,CAAC;CACrC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAClD,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,KAAK,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,MAAM,CAAC;CACrC;AAID,wBAAgB,gBAAgB,YAG/B;AACD,eAAO,MAAM,MAAM,SAA6D,CAAC;AACjF,eAAO,MAAM,SAAS,SAAmE,CAAC;AAC1F,eAAO,MAAM,QAAQ,SAA2E,CAAC;AACjG,eAAO,MAAM,gBAAgB,SAAwB,CAAC;AAkCtD,eAAO,MAAM,0BAA0B,GAAI,eAAe,SAAS,KAAG,SA4BrE,CAAC;AA6EF,eAAO,IAAI,MAAM,EAAE,cAAc,CAAC"}
|
package/dist/platform/index.js
CHANGED
|
@@ -86,19 +86,6 @@ function createReactNativeCrypto() {
|
|
|
86
86
|
toHex: (data) => Array.from(data).map(b => b.toString(16).padStart(2, '0')).join(''),
|
|
87
87
|
};
|
|
88
88
|
}
|
|
89
|
-
function createReactNativeSQLite() {
|
|
90
|
-
let expoSqlite;
|
|
91
|
-
try {
|
|
92
|
-
expoSqlite = loadModule('expo-sqlite');
|
|
93
|
-
}
|
|
94
|
-
catch {
|
|
95
|
-
throw new Error('React Native detected but expo-sqlite package is required. ' +
|
|
96
|
-
'Please install it: npm install expo-sqlite');
|
|
97
|
-
}
|
|
98
|
-
return {
|
|
99
|
-
openDatabase: (name) => expoSqlite.openDatabaseSync(name),
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
89
|
function createBrowserCrypto() {
|
|
103
90
|
return {
|
|
104
91
|
digest: async (data) => {
|
|
@@ -144,96 +131,15 @@ function createNodeCrypto() {
|
|
|
144
131
|
toHex: (data) => Buffer.from(data).toString('hex'),
|
|
145
132
|
};
|
|
146
133
|
}
|
|
147
|
-
function createNodeSQLite() {
|
|
148
|
-
return {
|
|
149
|
-
openDatabase: (name) => {
|
|
150
|
-
let db = null;
|
|
151
|
-
let dbPromise = null;
|
|
152
|
-
const getDbAsync = async () => {
|
|
153
|
-
if (db)
|
|
154
|
-
return db;
|
|
155
|
-
if (!dbPromise) {
|
|
156
|
-
dbPromise = (async () => {
|
|
157
|
-
try {
|
|
158
|
-
// Try synchronous loading first (works in CJS)
|
|
159
|
-
const Database = loadModule('better-sqlite3');
|
|
160
|
-
db = new Database(name);
|
|
161
|
-
}
|
|
162
|
-
catch {
|
|
163
|
-
// Fall back to async loading for ESM
|
|
164
|
-
const module = await import('better-sqlite3');
|
|
165
|
-
const Database = module.default || module;
|
|
166
|
-
db = new Database(name);
|
|
167
|
-
}
|
|
168
|
-
return db;
|
|
169
|
-
})();
|
|
170
|
-
}
|
|
171
|
-
return dbPromise;
|
|
172
|
-
};
|
|
173
|
-
return {
|
|
174
|
-
execAsync: async (sql) => {
|
|
175
|
-
const database = await getDbAsync();
|
|
176
|
-
database.exec(sql);
|
|
177
|
-
},
|
|
178
|
-
prepareAsync: async (sql) => {
|
|
179
|
-
const database = await getDbAsync();
|
|
180
|
-
const stmt = database.prepare(sql);
|
|
181
|
-
return {
|
|
182
|
-
executeAsync: async (...params) => {
|
|
183
|
-
// Use .all() for SELECT, .run() for others
|
|
184
|
-
const isSelect = /^\s*select/i.test(sql);
|
|
185
|
-
let resultRows = [];
|
|
186
|
-
if (isSelect) {
|
|
187
|
-
resultRows = stmt.all(...params);
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
stmt.run(...params);
|
|
191
|
-
}
|
|
192
|
-
return {
|
|
193
|
-
getFirstAsync: async () => {
|
|
194
|
-
if (isSelect) {
|
|
195
|
-
return resultRows[0] || null;
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
return null;
|
|
199
|
-
}
|
|
200
|
-
},
|
|
201
|
-
// Optionally, you could expose runResult for non-SELECTs if needed
|
|
202
|
-
};
|
|
203
|
-
},
|
|
204
|
-
finalizeAsync: async () => {
|
|
205
|
-
// better-sqlite3 statements are automatically finalized when they go out of scope
|
|
206
|
-
},
|
|
207
|
-
};
|
|
208
|
-
},
|
|
209
|
-
closeAsync: async () => {
|
|
210
|
-
if (db) {
|
|
211
|
-
db.close();
|
|
212
|
-
db = null;
|
|
213
|
-
}
|
|
214
|
-
},
|
|
215
|
-
};
|
|
216
|
-
},
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
134
|
// Export platform-specific implementations
|
|
220
135
|
export let crypto;
|
|
221
|
-
export let sqlite;
|
|
222
136
|
if (getIsReactNative()) {
|
|
223
137
|
crypto = createReactNativeCrypto();
|
|
224
|
-
sqlite = createReactNativeSQLite();
|
|
225
138
|
}
|
|
226
139
|
else if (isWebEnvironment) {
|
|
227
140
|
crypto = createBrowserCrypto();
|
|
228
|
-
// Browser SQLite will need to use IndexedDB or similar - for now throw error
|
|
229
|
-
sqlite = {
|
|
230
|
-
openDatabase: () => {
|
|
231
|
-
throw new Error('SQLite not available in browser environment. Use MemoryOAuthDb instead.');
|
|
232
|
-
}
|
|
233
|
-
};
|
|
234
141
|
}
|
|
235
142
|
else {
|
|
236
143
|
crypto = createNodeCrypto();
|
|
237
|
-
sqlite = createNodeSQLite();
|
|
238
144
|
}
|
|
239
145
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atxp/common",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.12",
|
|
4
4
|
"description": "ATXP Core - Shared utilities and types for Authorization Token Exchange Protocol",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -19,13 +19,10 @@
|
|
|
19
19
|
"typecheck": "tsc --noEmit",
|
|
20
20
|
"lint": "eslint . --ext .ts",
|
|
21
21
|
"lint:fix": "eslint . --ext .ts --fix",
|
|
22
|
-
"test": "vitest run"
|
|
23
|
-
"test:integration": "vitest run src/redisOAuthDb.integration.test.ts --reporter=verbose"
|
|
22
|
+
"test": "vitest run"
|
|
24
23
|
},
|
|
25
24
|
"dependencies": {
|
|
26
|
-
"better-sqlite3": "^12.2.0",
|
|
27
25
|
"bignumber.js": "^9.3.0",
|
|
28
|
-
"ioredis": "^5.7.0",
|
|
29
26
|
"jose": "^6.0.11",
|
|
30
27
|
"oauth4webapi": "^3.5.0",
|
|
31
28
|
"tweetnacl": "^1.0.3",
|
package/dist/oAuthDb.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
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
|
package/dist/oAuthDb.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/oAuthDb.js
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
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
|
package/dist/oAuthDb.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oAuthDb.js","sourceRoot":"","sources":["../src/oAuthDb.ts"],"names":[],"mappings":"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"}
|
package/dist/oAuthDbFactory.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/oAuthDbFactory.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/redisOAuthDb.d.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { AccessToken, ClientCredentials, Logger, OAuthDb, PKCEValues } from './types.js';
|
|
2
|
-
export interface RedisClient {
|
|
3
|
-
get(key: string): Promise<string | null>;
|
|
4
|
-
set(key: string, value: string): Promise<unknown>;
|
|
5
|
-
setex(key: string, seconds: number, value: string): Promise<unknown>;
|
|
6
|
-
del(key: string): Promise<number>;
|
|
7
|
-
quit(): Promise<unknown>;
|
|
8
|
-
}
|
|
9
|
-
export interface RedisOAuthDbConfig {
|
|
10
|
-
redis: RedisClient | string;
|
|
11
|
-
encrypt?: (data: string) => string;
|
|
12
|
-
decrypt?: (data: string) => string;
|
|
13
|
-
logger?: Logger;
|
|
14
|
-
keyPrefix?: string;
|
|
15
|
-
ttl?: number;
|
|
16
|
-
}
|
|
17
|
-
export declare class RedisOAuthDb implements OAuthDb {
|
|
18
|
-
private redis;
|
|
19
|
-
private encrypt;
|
|
20
|
-
private decrypt;
|
|
21
|
-
private logger;
|
|
22
|
-
private keyPrefix;
|
|
23
|
-
private ttl?;
|
|
24
|
-
constructor({ redis, encrypt, decrypt, logger, keyPrefix, ttl }: RedisOAuthDbConfig);
|
|
25
|
-
private createRedisClient;
|
|
26
|
-
private getRedisClient;
|
|
27
|
-
private getKey;
|
|
28
|
-
getClientCredentials(resourceUrl: string): Promise<ClientCredentials | null>;
|
|
29
|
-
saveClientCredentials(resourceUrl: string, credentials: ClientCredentials): Promise<void>;
|
|
30
|
-
getPKCEValues(userId: string, state: string): Promise<PKCEValues | null>;
|
|
31
|
-
savePKCEValues(userId: string, state: string, values: PKCEValues): Promise<void>;
|
|
32
|
-
getAccessToken(userId: string, url: string): Promise<AccessToken | null>;
|
|
33
|
-
saveAccessToken(userId: string, url: string, token: AccessToken): Promise<void>;
|
|
34
|
-
close(): Promise<void>;
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=redisOAuthDb.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"redisOAuthDb.d.ts","sourceRoot":"","sources":["../src/redisOAuthDb.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9F,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC;IAC5B,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;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,YAAa,YAAW,OAAO;IAC1C,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,GAAG,CAAC,CAAS;gBAET,EACV,KAAK,EACL,OAAgC,EAChC,OAAgC,EAChC,MAA4B,EAC5B,SAAoB,EACpB,GAAG,EACJ,EAAE,kBAAkB;YAeP,iBAAiB;YAUjB,cAAc;IAO5B,OAAO,CAAC,MAAM;IAIR,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAoB5E,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzF,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqBxE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAehF,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAgCxE,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB/E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}
|
package/dist/redisOAuthDb.js
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import { ConsoleLogger } from './logger.js';
|
|
2
|
-
export class RedisOAuthDb {
|
|
3
|
-
constructor({ redis, encrypt = (data) => data, decrypt = (data) => data, logger = new ConsoleLogger(), keyPrefix = 'oauth:', ttl }) {
|
|
4
|
-
if (typeof redis === 'string') {
|
|
5
|
-
// Dynamic import to avoid bundling issues
|
|
6
|
-
this.redis = this.createRedisClient(redis);
|
|
7
|
-
}
|
|
8
|
-
else {
|
|
9
|
-
this.redis = redis;
|
|
10
|
-
}
|
|
11
|
-
this.encrypt = encrypt;
|
|
12
|
-
this.decrypt = decrypt;
|
|
13
|
-
this.logger = logger;
|
|
14
|
-
this.keyPrefix = keyPrefix;
|
|
15
|
-
this.ttl = ttl;
|
|
16
|
-
}
|
|
17
|
-
async createRedisClient(redisUrl) {
|
|
18
|
-
// Use dynamic import to avoid bundling issues with optional dependencies
|
|
19
|
-
try {
|
|
20
|
-
const { default: Redis } = await import('ioredis');
|
|
21
|
-
return new Redis(redisUrl);
|
|
22
|
-
}
|
|
23
|
-
catch (error) {
|
|
24
|
-
throw new Error(`Failed to create Redis client from URL "${redisUrl}". Make sure ioredis is installed: npm install ioredis. Error: ${error}`);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
async getRedisClient() {
|
|
28
|
-
if (this.redis instanceof Promise) {
|
|
29
|
-
this.redis = await this.redis; // Resolve once and cache
|
|
30
|
-
}
|
|
31
|
-
return this.redis;
|
|
32
|
-
}
|
|
33
|
-
getKey(type, ...parts) {
|
|
34
|
-
return `${this.keyPrefix}${type}:${parts.join(':')}`;
|
|
35
|
-
}
|
|
36
|
-
async getClientCredentials(resourceUrl) {
|
|
37
|
-
const redis = await this.getRedisClient();
|
|
38
|
-
const key = this.getKey('client_credentials', resourceUrl);
|
|
39
|
-
const data = await redis.get(key);
|
|
40
|
-
if (!data)
|
|
41
|
-
return null;
|
|
42
|
-
try {
|
|
43
|
-
const parsed = JSON.parse(data);
|
|
44
|
-
return {
|
|
45
|
-
clientId: this.decrypt(parsed.encrypted_client_id),
|
|
46
|
-
clientSecret: this.decrypt(parsed.encrypted_client_secret),
|
|
47
|
-
redirectUri: parsed.redirect_uri
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
this.logger.error(`Failed to parse client credentials for ${resourceUrl}: ${error}`);
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
async saveClientCredentials(resourceUrl, credentials) {
|
|
56
|
-
const redis = await this.getRedisClient();
|
|
57
|
-
const key = this.getKey('client_credentials', resourceUrl);
|
|
58
|
-
const data = JSON.stringify({
|
|
59
|
-
encrypted_client_id: this.encrypt(credentials.clientId),
|
|
60
|
-
encrypted_client_secret: this.encrypt(credentials.clientSecret),
|
|
61
|
-
redirect_uri: credentials.redirectUri
|
|
62
|
-
});
|
|
63
|
-
await redis.set(key, data);
|
|
64
|
-
}
|
|
65
|
-
async getPKCEValues(userId, state) {
|
|
66
|
-
const redis = await this.getRedisClient();
|
|
67
|
-
const key = this.getKey('pkce', userId, state);
|
|
68
|
-
const data = await redis.get(key);
|
|
69
|
-
if (!data)
|
|
70
|
-
return null;
|
|
71
|
-
try {
|
|
72
|
-
const parsed = JSON.parse(data);
|
|
73
|
-
return {
|
|
74
|
-
codeVerifier: this.decrypt(parsed.encrypted_code_verifier),
|
|
75
|
-
codeChallenge: this.decrypt(parsed.encrypted_code_challenge),
|
|
76
|
-
resourceUrl: parsed.resource_url,
|
|
77
|
-
url: parsed.url
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
catch (error) {
|
|
81
|
-
this.logger.error(`Failed to parse PKCE values for ${userId}:${state}: ${error}`);
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
async savePKCEValues(userId, state, values) {
|
|
86
|
-
const key = this.getKey('pkce', userId, state);
|
|
87
|
-
const data = JSON.stringify({
|
|
88
|
-
encrypted_code_verifier: this.encrypt(values.codeVerifier),
|
|
89
|
-
encrypted_code_challenge: this.encrypt(values.codeChallenge),
|
|
90
|
-
resource_url: values.resourceUrl,
|
|
91
|
-
url: values.url
|
|
92
|
-
});
|
|
93
|
-
// PKCE values are short-lived, set a reasonable TTL (10 minutes)
|
|
94
|
-
const redis = await this.getRedisClient();
|
|
95
|
-
const pkceTtl = 600; // 10 minutes
|
|
96
|
-
await redis.setex(key, pkceTtl, data);
|
|
97
|
-
}
|
|
98
|
-
async getAccessToken(userId, url) {
|
|
99
|
-
const redis = await this.getRedisClient();
|
|
100
|
-
const key = this.getKey('access_token', userId, url);
|
|
101
|
-
const data = await redis.get(key);
|
|
102
|
-
if (!data)
|
|
103
|
-
return null;
|
|
104
|
-
try {
|
|
105
|
-
const parsed = JSON.parse(data);
|
|
106
|
-
// Check if token is expired
|
|
107
|
-
if (parsed.expires_at) {
|
|
108
|
-
const expiresAt = parseInt(parsed.expires_at);
|
|
109
|
-
if (Date.now() >= expiresAt * 1000) {
|
|
110
|
-
// Token is expired, remove it
|
|
111
|
-
await redis.del(key);
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return {
|
|
116
|
-
accessToken: this.decrypt(parsed.encrypted_access_token),
|
|
117
|
-
refreshToken: parsed.encrypted_refresh_token ? this.decrypt(parsed.encrypted_refresh_token) : undefined,
|
|
118
|
-
expiresAt: parsed.expires_at ? parseInt(parsed.expires_at) : undefined,
|
|
119
|
-
resourceUrl: parsed.resource_url
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
this.logger.error(`Failed to parse access token for ${userId}:${url}: ${error}`);
|
|
124
|
-
return null;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
async saveAccessToken(userId, url, token) {
|
|
128
|
-
const redis = await this.getRedisClient();
|
|
129
|
-
const key = this.getKey('access_token', userId, url);
|
|
130
|
-
const data = JSON.stringify({
|
|
131
|
-
resource_url: token.resourceUrl,
|
|
132
|
-
encrypted_access_token: this.encrypt(token.accessToken),
|
|
133
|
-
encrypted_refresh_token: token.refreshToken ? this.encrypt(token.refreshToken) : null,
|
|
134
|
-
expires_at: token.expiresAt?.toString() ?? null
|
|
135
|
-
});
|
|
136
|
-
if (this.ttl) {
|
|
137
|
-
// Use configured TTL
|
|
138
|
-
await redis.setex(key, this.ttl, data);
|
|
139
|
-
}
|
|
140
|
-
else if (token.expiresAt) {
|
|
141
|
-
// Use token's expiration time
|
|
142
|
-
const ttlSeconds = Math.max(1, token.expiresAt - Math.floor(Date.now() / 1000));
|
|
143
|
-
await redis.setex(key, ttlSeconds, data);
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
// No expiration, store indefinitely
|
|
147
|
-
await redis.set(key, data);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
async close() {
|
|
151
|
-
try {
|
|
152
|
-
const redis = await this.getRedisClient();
|
|
153
|
-
await redis.quit();
|
|
154
|
-
}
|
|
155
|
-
catch (error) {
|
|
156
|
-
this.logger.warn(`Error closing Redis connection: ${error}`);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
//# sourceMappingURL=redisOAuthDb.js.map
|
package/dist/redisOAuthDb.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"redisOAuthDb.js","sourceRoot":"","sources":["../src/redisOAuthDb.ts"],"names":[],"mappings":"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"}
|