@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,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"}
@@ -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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"}
@@ -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":"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"}
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"}
@@ -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
+ }