@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.
- package/README.md +176 -0
- package/dist/commonTestHelpers.d.ts +83 -0
- package/dist/commonTestHelpers.d.ts.map +1 -0
- package/dist/commonTestHelpers.js +115 -0
- package/dist/commonTestHelpers.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt.d.ts +9 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +29 -0
- package/dist/jwt.js.map +1 -0
- package/dist/logger.d.ts +18 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +43 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcpJson.d.ts +9 -0
- package/dist/mcpJson.d.ts.map +1 -0
- package/dist/mcpJson.js +127 -0
- package/dist/mcpJson.js.map +1 -0
- package/dist/memoryOAuthDb.d.ts +25 -0
- package/dist/memoryOAuthDb.d.ts.map +1 -0
- package/dist/memoryOAuthDb.js +97 -0
- package/dist/memoryOAuthDb.js.map +1 -0
- package/dist/oAuthDb.d.ts +26 -0
- package/dist/oAuthDb.d.ts.map +1 -0
- package/dist/oAuthDb.js +145 -0
- package/dist/oAuthDb.js.map +1 -0
- package/dist/oAuthDbFactory.d.ts +30 -0
- package/dist/oAuthDbFactory.d.ts.map +1 -0
- package/dist/oAuthDbFactory.js +37 -0
- package/dist/oAuthDbFactory.js.map +1 -0
- package/dist/oAuthResource.d.ts +35 -0
- package/dist/oAuthResource.d.ts.map +1 -0
- package/dist/oAuthResource.js +241 -0
- package/dist/oAuthResource.js.map +1 -0
- package/dist/paymentRequiredError.d.ts +6 -0
- package/dist/paymentRequiredError.d.ts.map +1 -0
- package/dist/paymentRequiredError.js +14 -0
- package/dist/paymentRequiredError.js.map +1 -0
- package/dist/platform/index.d.ts +27 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +204 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/redisOAuthDb.d.ts +36 -0
- package/dist/redisOAuthDb.d.ts.map +1 -0
- package/dist/redisOAuthDb.js +160 -0
- package/dist/redisOAuthDb.js.map +1 -0
- package/dist/servers.d.ts +14 -0
- package/dist/servers.d.ts.map +1 -0
- package/dist/servers.js +14 -0
- package/dist/servers.js.map +1 -0
- package/dist/sseParser.d.ts +27 -0
- package/dist/sseParser.d.ts.map +1 -0
- package/dist/sseParser.js +100 -0
- package/dist/sseParser.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +19 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +24 -0
- package/dist/utils.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,160 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redisOAuthDb.js","sourceRoot":"","sources":["../src/redisOAuthDb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const Servers: {
|
|
2
|
+
readonly browse: "https://browse.mcp.novellum.ai";
|
|
3
|
+
readonly filestore: "https://filestore.mcp.novellum.ai";
|
|
4
|
+
readonly database: "https://database.mcp.novellum.ai";
|
|
5
|
+
readonly code: "https://code.mcp.novellum.ai";
|
|
6
|
+
readonly search: "https://search.mcp.novellum.ai";
|
|
7
|
+
readonly crawl: "https://crawl.mcp.novellum.ai";
|
|
8
|
+
readonly video: "https://video.mcp.novellum.ai";
|
|
9
|
+
readonly image: "https://image.mcp.novellum.ai";
|
|
10
|
+
readonly music: "https://music.mcp.novellum.ai";
|
|
11
|
+
readonly research: "https://research.mcp.novellum.ai";
|
|
12
|
+
readonly shop: "https://shop.mcp.novellum.ai";
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=servers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"servers.d.ts","sourceRoot":"","sources":["../src/servers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO;;;;;;;;;;;;CAYV,CAAC"}
|
package/dist/servers.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const Servers = {
|
|
2
|
+
browse: 'https://browse.mcp.novellum.ai',
|
|
3
|
+
filestore: 'https://filestore.mcp.novellum.ai',
|
|
4
|
+
database: 'https://database.mcp.novellum.ai',
|
|
5
|
+
code: 'https://code.mcp.novellum.ai',
|
|
6
|
+
search: 'https://search.mcp.novellum.ai',
|
|
7
|
+
crawl: 'https://crawl.mcp.novellum.ai',
|
|
8
|
+
video: 'https://video.mcp.novellum.ai',
|
|
9
|
+
image: 'https://image.mcp.novellum.ai',
|
|
10
|
+
music: 'https://music.mcp.novellum.ai',
|
|
11
|
+
research: 'https://research.mcp.novellum.ai',
|
|
12
|
+
shop: 'https://shop.mcp.novellum.ai'
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=servers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"servers.js","sourceRoot":"","sources":["../src/servers.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,MAAM,EAAE,gCAAgC;IACxC,SAAS,EAAE,mCAAmC;IAC9C,QAAQ,EAAE,kCAAkC;IAC5C,IAAI,EAAE,8BAA8B;IACpC,MAAM,EAAE,gCAAgC;IACxC,KAAK,EAAE,+BAA+B;IACtC,KAAK,EAAE,+BAA+B;IACtC,KAAK,EAAE,+BAA+B;IACtC,KAAK,EAAE,+BAA+B;IACtC,QAAQ,EAAE,kCAAkC;IAC5C,IAAI,EAAE,8BAA8B;CAC5B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Logger } from './types.js';
|
|
2
|
+
export interface SSEMessage {
|
|
3
|
+
event?: string;
|
|
4
|
+
data: string;
|
|
5
|
+
id?: string;
|
|
6
|
+
retry?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Parses SSE (Server-Sent Events) formatted text into individual messages
|
|
10
|
+
* @param sseText - The raw SSE text to parse
|
|
11
|
+
* @returns Array of parsed SSE messages
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseSSEMessages(sseText: string): SSEMessage[];
|
|
14
|
+
/**
|
|
15
|
+
* Extracts JSON-RPC messages from SSE data fields
|
|
16
|
+
* @param sseMessages - Array of SSE messages
|
|
17
|
+
* @param logger - Optional logger for debugging
|
|
18
|
+
* @returns Array of parsed JSON objects from SSE data fields
|
|
19
|
+
*/
|
|
20
|
+
export declare function extractJSONFromSSE(sseMessages: SSEMessage[], logger?: Logger): unknown[];
|
|
21
|
+
/**
|
|
22
|
+
* Determines if a response body appears to be SSE formatted
|
|
23
|
+
* @param body - The response body to check
|
|
24
|
+
* @returns true if the body appears to be SSE formatted
|
|
25
|
+
*/
|
|
26
|
+
export declare function isSSEResponse(body: unknown): boolean;
|
|
27
|
+
//# sourceMappingURL=sseParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sseParser.d.ts","sourceRoot":"","sources":["../src/sseParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAsD9D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAgBxF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAqBpD"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses SSE (Server-Sent Events) formatted text into individual messages
|
|
3
|
+
* @param sseText - The raw SSE text to parse
|
|
4
|
+
* @returns Array of parsed SSE messages
|
|
5
|
+
*/
|
|
6
|
+
export function parseSSEMessages(sseText) {
|
|
7
|
+
const messages = [];
|
|
8
|
+
const lines = sseText.split('\n');
|
|
9
|
+
let currentMessage = {};
|
|
10
|
+
for (const line of lines) {
|
|
11
|
+
const trimmedLine = line.trim();
|
|
12
|
+
// Empty line indicates end of message
|
|
13
|
+
if (trimmedLine === '') {
|
|
14
|
+
if (currentMessage.data !== undefined) {
|
|
15
|
+
messages.push(currentMessage);
|
|
16
|
+
currentMessage = {};
|
|
17
|
+
}
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
// Parse field: value format
|
|
21
|
+
const colonIndex = trimmedLine.indexOf(':');
|
|
22
|
+
if (colonIndex === -1) {
|
|
23
|
+
continue; // Skip malformed lines
|
|
24
|
+
}
|
|
25
|
+
const field = trimmedLine.substring(0, colonIndex);
|
|
26
|
+
const value = trimmedLine.substring(colonIndex + 1);
|
|
27
|
+
let retryValue;
|
|
28
|
+
switch (field) {
|
|
29
|
+
case 'event':
|
|
30
|
+
currentMessage.event = value;
|
|
31
|
+
break;
|
|
32
|
+
case 'data':
|
|
33
|
+
// SSE spec allows multiple data fields to be concatenated
|
|
34
|
+
currentMessage.data = currentMessage.data ? currentMessage.data + '\n' + value : value;
|
|
35
|
+
break;
|
|
36
|
+
case 'id':
|
|
37
|
+
currentMessage.id = value;
|
|
38
|
+
break;
|
|
39
|
+
case 'retry':
|
|
40
|
+
retryValue = parseInt(value, 10);
|
|
41
|
+
if (!isNaN(retryValue)) {
|
|
42
|
+
currentMessage.retry = retryValue;
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Don't forget the last message if it doesn't end with an empty line
|
|
48
|
+
if (currentMessage.data !== undefined) {
|
|
49
|
+
messages.push(currentMessage);
|
|
50
|
+
}
|
|
51
|
+
return messages;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Extracts JSON-RPC messages from SSE data fields
|
|
55
|
+
* @param sseMessages - Array of SSE messages
|
|
56
|
+
* @param logger - Optional logger for debugging
|
|
57
|
+
* @returns Array of parsed JSON objects from SSE data fields
|
|
58
|
+
*/
|
|
59
|
+
export function extractJSONFromSSE(sseMessages, logger) {
|
|
60
|
+
const jsonMessages = [];
|
|
61
|
+
for (const sseMessage of sseMessages) {
|
|
62
|
+
try {
|
|
63
|
+
if (sseMessage.data) {
|
|
64
|
+
const parsed = JSON.parse(sseMessage.data);
|
|
65
|
+
jsonMessages.push(parsed);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
logger?.warn(`Failed to parse SSE data as JSON: ${sseMessage.data}`);
|
|
70
|
+
logger?.debug(`Parse error: ${error}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return jsonMessages;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Determines if a response body appears to be SSE formatted
|
|
77
|
+
* @param body - The response body to check
|
|
78
|
+
* @returns true if the body appears to be SSE formatted
|
|
79
|
+
*/
|
|
80
|
+
export function isSSEResponse(body) {
|
|
81
|
+
if (typeof body !== 'string') {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
const lines = body.split('\n');
|
|
85
|
+
for (const line of lines) {
|
|
86
|
+
const trimmedLine = line.trim();
|
|
87
|
+
if (trimmedLine === '')
|
|
88
|
+
continue;
|
|
89
|
+
// Check for SSE field format (field: value)
|
|
90
|
+
const colonIndex = trimmedLine.indexOf(':');
|
|
91
|
+
if (colonIndex === -1)
|
|
92
|
+
continue;
|
|
93
|
+
const field = trimmedLine.substring(0, colonIndex);
|
|
94
|
+
if (['event', 'data', 'id', 'retry'].includes(field)) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=sseParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sseParser.js","sourceRoot":"","sources":["../src/sseParser.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export declare const DEFAULT_AUTHORIZATION_SERVER = "https://auth.atxp.ai";
|
|
2
|
+
export declare enum LogLevel {
|
|
3
|
+
DEBUG = 0,
|
|
4
|
+
INFO = 1,
|
|
5
|
+
WARN = 2,
|
|
6
|
+
ERROR = 3
|
|
7
|
+
}
|
|
8
|
+
export type Logger = {
|
|
9
|
+
debug: (message: string) => void;
|
|
10
|
+
info: (message: string) => void;
|
|
11
|
+
warn: (message: string) => void;
|
|
12
|
+
error: (message: string) => void;
|
|
13
|
+
};
|
|
14
|
+
export type UrlString = `http://${string}` | `https://${string}`;
|
|
15
|
+
export type AuthorizationServerUrl = UrlString;
|
|
16
|
+
export type Currency = 'USDC';
|
|
17
|
+
export type Network = 'solana' | 'base';
|
|
18
|
+
export type PaymentRequestData = {
|
|
19
|
+
amount: BigNumber;
|
|
20
|
+
currency: Currency;
|
|
21
|
+
network: Network;
|
|
22
|
+
destination: string;
|
|
23
|
+
source: string;
|
|
24
|
+
resource: URL;
|
|
25
|
+
resourceName: string;
|
|
26
|
+
iss: string;
|
|
27
|
+
};
|
|
28
|
+
export type CustomJWTPayload = {
|
|
29
|
+
code_challenge?: string;
|
|
30
|
+
payment_request_id?: string;
|
|
31
|
+
};
|
|
32
|
+
export type ClientCredentials = {
|
|
33
|
+
clientId: string;
|
|
34
|
+
clientSecret: string;
|
|
35
|
+
redirectUri: string;
|
|
36
|
+
};
|
|
37
|
+
export type PKCEValues = {
|
|
38
|
+
codeVerifier: string;
|
|
39
|
+
codeChallenge: string;
|
|
40
|
+
resourceUrl: string;
|
|
41
|
+
url: string;
|
|
42
|
+
};
|
|
43
|
+
export type AccessToken = {
|
|
44
|
+
accessToken: string;
|
|
45
|
+
refreshToken?: string;
|
|
46
|
+
expiresAt?: number;
|
|
47
|
+
resourceUrl: string;
|
|
48
|
+
};
|
|
49
|
+
export interface OAuthResourceDb {
|
|
50
|
+
getClientCredentials(serverUrl: string): Promise<ClientCredentials | null>;
|
|
51
|
+
saveClientCredentials(serverUrl: string, credentials: ClientCredentials): Promise<void>;
|
|
52
|
+
close(): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
export interface OAuthDb extends OAuthResourceDb {
|
|
55
|
+
getPKCEValues(userId: string, state: string): Promise<PKCEValues | null>;
|
|
56
|
+
savePKCEValues(userId: string, state: string, values: PKCEValues): Promise<void>;
|
|
57
|
+
getAccessToken(userId: string, url: string): Promise<AccessToken | null>;
|
|
58
|
+
saveAccessToken(userId: string, url: string, token: AccessToken): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
export type TokenData = {
|
|
61
|
+
active: boolean;
|
|
62
|
+
scope?: string;
|
|
63
|
+
sub?: string;
|
|
64
|
+
aud?: string | string[];
|
|
65
|
+
};
|
|
66
|
+
export type FetchLike = (url: string | URL, init?: RequestInit) => Promise<Response>;
|
|
67
|
+
export type RequirePaymentConfig = {
|
|
68
|
+
price: BigNumber;
|
|
69
|
+
getExistingPaymentId?: () => Promise<string | null>;
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,4BAA4B,yBAAyB,CAAC;AAEnE,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,MAAM,EAAE,GAAG,WAAW,MAAM,EAAE,CAAC;AACjE,MAAM,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAE/C,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC9B,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAExC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAA;CACZ,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC3E,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,OAAQ,SAAQ,eAAe;IAC9C,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACzE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACzE,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjF;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAC,MAAM,EAAE,CAAC;CACvB,CAAA;AAGD,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAErF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACrD,CAAA"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const DEFAULT_AUTHORIZATION_SERVER = 'https://auth.atxp.ai';
|
|
2
|
+
export var LogLevel;
|
|
3
|
+
(function (LogLevel) {
|
|
4
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
5
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
6
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
7
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
8
|
+
})(LogLevel || (LogLevel = {}));
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,4BAA4B,GAAG,sBAAsB,CAAC;AAEnE,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACX,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exhaustiveness check for switch statements.
|
|
3
|
+
* This function should never be called at runtime.
|
|
4
|
+
* It's used to ensure all cases of a union type or enum are handled.
|
|
5
|
+
*
|
|
6
|
+
* @param value - The value that should have been handled by all cases
|
|
7
|
+
* @param message - Optional error message
|
|
8
|
+
* @throws {Error} Always throws an error indicating unhandled case
|
|
9
|
+
*/
|
|
10
|
+
export declare function assertNever(value: never, message?: string): never;
|
|
11
|
+
/**
|
|
12
|
+
* Type-safe way to check if a value is one of the enum values.
|
|
13
|
+
*
|
|
14
|
+
* @param enumObj - The enum object
|
|
15
|
+
* @param value - The value to check
|
|
16
|
+
* @returns True if the value is a valid enum value
|
|
17
|
+
*/
|
|
18
|
+
export declare function isEnumValue<T extends Record<string, string | number>>(enumObj: T, value: unknown): value is T[keyof T];
|
|
19
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAGjE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EACnE,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAErB"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exhaustiveness check for switch statements.
|
|
3
|
+
* This function should never be called at runtime.
|
|
4
|
+
* It's used to ensure all cases of a union type or enum are handled.
|
|
5
|
+
*
|
|
6
|
+
* @param value - The value that should have been handled by all cases
|
|
7
|
+
* @param message - Optional error message
|
|
8
|
+
* @throws {Error} Always throws an error indicating unhandled case
|
|
9
|
+
*/
|
|
10
|
+
export function assertNever(value, message) {
|
|
11
|
+
const errorMessage = message || `Unhandled case: ${JSON.stringify(value)}`;
|
|
12
|
+
throw new Error(errorMessage);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Type-safe way to check if a value is one of the enum values.
|
|
16
|
+
*
|
|
17
|
+
* @param enumObj - The enum object
|
|
18
|
+
* @param value - The value to check
|
|
19
|
+
* @returns True if the value is a valid enum value
|
|
20
|
+
*/
|
|
21
|
+
export function isEnumValue(enumObj, value) {
|
|
22
|
+
return Object.values(enumObj).includes(value);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,OAAgB;IACxD,MAAM,YAAY,GAAG,OAAO,IAAI,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IAC3E,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,OAAU,EACV,KAAc;IAEd,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAmB,CAAC,CAAC;AAC9D,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@atxp/common",
|
|
3
|
+
"version": "0.2.5",
|
|
4
|
+
"description": "ATXP Core - Shared utilities and types for Authorization Token Exchange Protocol",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/novellum-ai/paymcp-client.git",
|
|
9
|
+
"directory": "packages/atxp-common"
|
|
10
|
+
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"typecheck": "tsc --noEmit",
|
|
20
|
+
"lint": "eslint . --ext .ts",
|
|
21
|
+
"lint:fix": "eslint . --ext .ts --fix",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:integration": "vitest run src/redisOAuthDb.integration.test.ts --reporter=verbose"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"better-sqlite3": "^12.2.0",
|
|
27
|
+
"bignumber.js": "^9.3.0",
|
|
28
|
+
"ioredis": "^5.7.0",
|
|
29
|
+
"jose": "^6.0.11",
|
|
30
|
+
"oauth4webapi": "^3.5.0",
|
|
31
|
+
"tweetnacl": "^1.0.3",
|
|
32
|
+
"tweetnacl-util": "^0.15.1"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^22.13.0",
|
|
36
|
+
"@typescript-eslint/eslint-plugin": "^8.38.0",
|
|
37
|
+
"@typescript-eslint/parser": "^8.38.0",
|
|
38
|
+
"eslint": "^9.32.0",
|
|
39
|
+
"jsdom": "^25.0.1",
|
|
40
|
+
"typescript": "^5.7.3",
|
|
41
|
+
"vitest": "^3.0.9"
|
|
42
|
+
}
|
|
43
|
+
}
|