@atxp/client 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 +112 -0
- package/dist/atxpAccount.d.ts +13 -0
- package/dist/atxpAccount.d.ts.map +1 -0
- package/dist/atxpAccount.js +81 -0
- package/dist/atxpAccount.js.map +1 -0
- package/dist/atxpClient.d.ts +14 -0
- package/dist/atxpClient.d.ts.map +1 -0
- package/dist/atxpClient.js +67 -0
- package/dist/atxpClient.js.map +1 -0
- package/dist/atxpFetcher.d.ts +71 -0
- package/dist/atxpFetcher.d.ts.map +1 -0
- package/dist/atxpFetcher.js +347 -0
- package/dist/atxpFetcher.js.map +1 -0
- package/dist/clientTestHelpers.d.ts +6 -0
- package/dist/clientTestHelpers.d.ts.map +1 -0
- package/dist/clientTestHelpers.js +94 -0
- package/dist/clientTestHelpers.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/oAuth.d.ts +44 -0
- package/dist/oAuth.d.ts.map +1 -0
- package/dist/oAuth.js +274 -0
- package/dist/oAuth.js.map +1 -0
- package/dist/setup.expo.d.ts +2 -0
- package/dist/setup.expo.d.ts.map +1 -0
- package/dist/setup.expo.js +42 -0
- package/dist/setup.expo.js.map +1 -0
- package/dist/solanaAccount.d.ts +9 -0
- package/dist/solanaAccount.d.ts.map +1 -0
- package/dist/solanaAccount.js +19 -0
- package/dist/solanaAccount.js.map +1 -0
- package/dist/solanaPaymentMaker.d.ts +17 -0
- package/dist/solanaPaymentMaker.d.ts.map +1 -0
- package/dist/solanaPaymentMaker.js +62 -0
- package/dist/solanaPaymentMaker.js.map +1 -0
- package/dist/src/atxpClient.d.ts +14 -0
- package/dist/src/atxpClient.d.ts.map +1 -0
- package/dist/src/atxpClient.js +62 -0
- package/dist/src/atxpClient.js.map +1 -0
- package/dist/src/atxpFetcher.d.ts +71 -0
- package/dist/src/atxpFetcher.d.ts.map +1 -0
- package/dist/src/atxpFetcher.js +347 -0
- package/dist/src/atxpFetcher.js.map +1 -0
- package/dist/src/clientTestHelpers.d.ts +6 -0
- package/dist/src/clientTestHelpers.d.ts.map +1 -0
- package/dist/src/clientTestHelpers.js +94 -0
- package/dist/src/clientTestHelpers.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/oAuth.d.ts +44 -0
- package/dist/src/oAuth.d.ts.map +1 -0
- package/dist/src/oAuth.js +274 -0
- package/dist/src/oAuth.js.map +1 -0
- package/dist/src/setup.expo.d.ts +2 -0
- package/dist/src/setup.expo.d.ts.map +1 -0
- package/dist/src/setup.expo.js +42 -0
- package/dist/src/setup.expo.js.map +1 -0
- package/dist/src/solanaAccount.d.ts +9 -0
- package/dist/src/solanaAccount.d.ts.map +1 -0
- package/dist/src/solanaAccount.js +19 -0
- package/dist/src/solanaAccount.js.map +1 -0
- package/dist/src/solanaPaymentMaker.d.ts +17 -0
- package/dist/src/solanaPaymentMaker.d.ts.map +1 -0
- package/dist/src/solanaPaymentMaker.js +62 -0
- package/dist/src/solanaPaymentMaker.js.map +1 -0
- package/dist/src/types.d.ts +58 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import * as oauth from 'oauth4webapi';
|
|
2
|
+
import { OAuthResourceClient } from '@longrun/atxp-common';
|
|
3
|
+
import { crypto } from '@longrun/atxp-common';
|
|
4
|
+
import { ConsoleLogger } from '@longrun/atxp-common';
|
|
5
|
+
export class OAuthAuthenticationRequiredError extends Error {
|
|
6
|
+
constructor(url, resourceServerUrl,
|
|
7
|
+
// TODO: Remove OAuthError idempotencyKey - these errors shouldn't need to be
|
|
8
|
+
// de-duplicated anymore.
|
|
9
|
+
idempotencyKey) {
|
|
10
|
+
super(`OAuth authentication required. Resource server url: ${resourceServerUrl}`);
|
|
11
|
+
this.url = url;
|
|
12
|
+
this.resourceServerUrl = resourceServerUrl;
|
|
13
|
+
this.idempotencyKey = idempotencyKey;
|
|
14
|
+
this.name = 'OAuthAuthenticationRequiredError';
|
|
15
|
+
this.idempotencyKey = idempotencyKey;
|
|
16
|
+
}
|
|
17
|
+
static async create(url, resourceServerUrl, token) {
|
|
18
|
+
const baseUrl = OAuthClient.trimToPath(url);
|
|
19
|
+
const source = `${baseUrl}|${resourceServerUrl}|${token}`;
|
|
20
|
+
const hash = await crypto.digest(new TextEncoder().encode(source));
|
|
21
|
+
const idempotencyKey = crypto.toHex(hash);
|
|
22
|
+
return new OAuthAuthenticationRequiredError(url, resourceServerUrl, idempotencyKey);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const CHUNK_SIZE = 0x8000;
|
|
26
|
+
function encodeBase64Url(input) {
|
|
27
|
+
if (input instanceof ArrayBuffer) {
|
|
28
|
+
input = new Uint8Array(input);
|
|
29
|
+
}
|
|
30
|
+
const arr = [];
|
|
31
|
+
for (let i = 0; i < input.byteLength; i += CHUNK_SIZE) {
|
|
32
|
+
// @ts-expect-error - subarray is not defined on ArrayBuffer
|
|
33
|
+
arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));
|
|
34
|
+
}
|
|
35
|
+
return btoa(arr.join('')).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
|
36
|
+
}
|
|
37
|
+
export class OAuthClient extends OAuthResourceClient {
|
|
38
|
+
constructor({ userId, db, callbackUrl, clientName = callbackUrl, isPublic, fetchFn = fetch, sideChannelFetch = fetchFn, strict = false, allowInsecureRequests = process.env.NODE_ENV === 'development', logger = new ConsoleLogger() }) {
|
|
39
|
+
super({
|
|
40
|
+
db: db,
|
|
41
|
+
callbackUrl,
|
|
42
|
+
isPublic,
|
|
43
|
+
sideChannelFetch,
|
|
44
|
+
strict,
|
|
45
|
+
allowInsecureRequests,
|
|
46
|
+
clientName,
|
|
47
|
+
logger
|
|
48
|
+
});
|
|
49
|
+
this.extractResourceUrl = (response) => {
|
|
50
|
+
if (response.status !== 401) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const header = response.headers.get('www-authenticate') || '';
|
|
54
|
+
const match = header.match(/^Bearer resource_metadata="([^"]+)"$/);
|
|
55
|
+
if (match) {
|
|
56
|
+
return this.normalizeResourceServerUrl(match[1]);
|
|
57
|
+
}
|
|
58
|
+
// handle 'www-authenticate: https://mymcp.com/mcp'
|
|
59
|
+
// This is NOT a valid www-authenticate header, and also doesn't conform with the updated 2025-06-18 version of
|
|
60
|
+
// the MCP spec. However, it is what we were originally using for proxying requests, so we still support it.
|
|
61
|
+
if (header.match(/^https?:\/\//)) {
|
|
62
|
+
return this.normalizeResourceServerUrl(header);
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
};
|
|
66
|
+
this.fetch = async (url, init) => {
|
|
67
|
+
let response = await this._doFetch(url, init);
|
|
68
|
+
if (response.status === 401) {
|
|
69
|
+
this.logger.info('Received 401 Unauthorized status');
|
|
70
|
+
let resourceUrl = this.extractResourceUrl(response);
|
|
71
|
+
const calledUrl = OAuthClient.trimToPath(url instanceof URL ? url.toString() : url);
|
|
72
|
+
// If the response indicates an expired token, try to refresh it
|
|
73
|
+
if (response.headers.get('www-authenticate')?.includes('error="invalid_grant"')) {
|
|
74
|
+
this.logger.info(`Response includes invalid_grant error, attempting to refresh token for ${resourceUrl}`);
|
|
75
|
+
let refreshUrl = resourceUrl;
|
|
76
|
+
if (!refreshUrl) {
|
|
77
|
+
this.logger.info(`Refresh: No resource url found in response www-authenticate header, falling back to the called url ${calledUrl} (this could be incorrect if the called server is just proxying back an oauth failure)`);
|
|
78
|
+
refreshUrl = calledUrl;
|
|
79
|
+
}
|
|
80
|
+
const newToken = await this.tryRefreshToken(refreshUrl);
|
|
81
|
+
if (newToken) {
|
|
82
|
+
response = await this._doFetch(url, init);
|
|
83
|
+
resourceUrl = this.extractResourceUrl(response);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (response.status === 401) /* still */ {
|
|
87
|
+
// If we couldn't get a valid resourceServerUrl from wwwAuthenticate, use the original URL
|
|
88
|
+
if (!resourceUrl) {
|
|
89
|
+
this.logger.info(`No resource url found in response www-authenticate header, falling back to the called url ${calledUrl} (this could be incorrect if the called server is just proxying back an oauth failure)`);
|
|
90
|
+
resourceUrl = calledUrl;
|
|
91
|
+
}
|
|
92
|
+
const token = await this.getAccessToken(calledUrl);
|
|
93
|
+
this.logger.info(`Throwing OAuthAuthenticationRequiredError for ${calledUrl}, resource: ${resourceUrl}`);
|
|
94
|
+
throw await OAuthAuthenticationRequiredError.create(calledUrl, resourceUrl, token?.accessToken);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return response;
|
|
98
|
+
};
|
|
99
|
+
this.makeAuthorizationUrl = async (url, resourceUrl) => {
|
|
100
|
+
resourceUrl = this.normalizeResourceServerUrl(resourceUrl);
|
|
101
|
+
const authorizationServer = await this.getAuthorizationServer(resourceUrl);
|
|
102
|
+
const credentials = await this.getClientCredentials(authorizationServer);
|
|
103
|
+
const pkceValues = await this.generatePKCE(url, resourceUrl);
|
|
104
|
+
const authorizationUrl = new URL(authorizationServer.authorization_endpoint || '');
|
|
105
|
+
authorizationUrl.searchParams.set('client_id', credentials.clientId);
|
|
106
|
+
authorizationUrl.searchParams.set('redirect_uri', credentials.redirectUri);
|
|
107
|
+
authorizationUrl.searchParams.set('response_type', 'code');
|
|
108
|
+
authorizationUrl.searchParams.set('code_challenge', pkceValues.codeChallenge);
|
|
109
|
+
authorizationUrl.searchParams.set('code_challenge_method', 'S256');
|
|
110
|
+
authorizationUrl.searchParams.set('state', pkceValues.state);
|
|
111
|
+
return authorizationUrl;
|
|
112
|
+
};
|
|
113
|
+
this.handleCallback = async (url) => {
|
|
114
|
+
this.logger.info(`Handling authorization code callback: ${url}`);
|
|
115
|
+
const callbackUrl = new URL(url);
|
|
116
|
+
const state = callbackUrl.searchParams.get('state');
|
|
117
|
+
if (!state) {
|
|
118
|
+
throw new Error('No state parameter found in callback URL');
|
|
119
|
+
}
|
|
120
|
+
// Get the PKCE values and resource server URL from the database using the state
|
|
121
|
+
const pkceValues = await this.db.getPKCEValues(this.userId, state);
|
|
122
|
+
if (!pkceValues) {
|
|
123
|
+
throw new Error(`No PKCE values found for state: ${state}`);
|
|
124
|
+
}
|
|
125
|
+
// Get the authorization server configuration
|
|
126
|
+
const authorizationServer = await this.getAuthorizationServer(pkceValues.resourceUrl);
|
|
127
|
+
// Get the client credentials
|
|
128
|
+
const credentials = await this.getClientCredentials(authorizationServer);
|
|
129
|
+
// Create the client configuration
|
|
130
|
+
const client = {
|
|
131
|
+
client_id: credentials.clientId,
|
|
132
|
+
token_endpoint_auth_method: 'client_secret_post'
|
|
133
|
+
};
|
|
134
|
+
// Validate the authorization response
|
|
135
|
+
const authResponse = await oauth.validateAuthResponse(authorizationServer, client, callbackUrl, state);
|
|
136
|
+
// Exchange the code for tokens
|
|
137
|
+
await this.exchangeCodeForToken(authResponse, pkceValues, authorizationServer);
|
|
138
|
+
};
|
|
139
|
+
this.getRegistrationMetadata = async () => {
|
|
140
|
+
const grantTypes = ['authorization_code', 'refresh_token'];
|
|
141
|
+
if (!this.isPublic) {
|
|
142
|
+
grantTypes.push('client_credentials');
|
|
143
|
+
}
|
|
144
|
+
let tokenEndpointAuthMethod = 'none';
|
|
145
|
+
if (!this.isPublic) {
|
|
146
|
+
tokenEndpointAuthMethod = 'client_secret_post';
|
|
147
|
+
}
|
|
148
|
+
// Create client metadata for registration
|
|
149
|
+
const clientMetadata = {
|
|
150
|
+
// Required fields for public client
|
|
151
|
+
redirect_uris: [this.callbackUrl],
|
|
152
|
+
response_types: ['code'],
|
|
153
|
+
grant_types: grantTypes,
|
|
154
|
+
token_endpoint_auth_method: tokenEndpointAuthMethod,
|
|
155
|
+
client_name: `OAuth Client for ${this.callbackUrl}`,
|
|
156
|
+
};
|
|
157
|
+
return clientMetadata;
|
|
158
|
+
};
|
|
159
|
+
this.generatePKCE = async (url, resourceUrl) => {
|
|
160
|
+
resourceUrl = this.normalizeResourceServerUrl(resourceUrl);
|
|
161
|
+
// Generate a random code verifier
|
|
162
|
+
const codeVerifier = oauth.generateRandomCodeVerifier();
|
|
163
|
+
// Calculate the code challenge
|
|
164
|
+
// Use our platform-agnostic crypto implementation
|
|
165
|
+
const codeChallenge = encodeBase64Url(await crypto.digest(new TextEncoder().encode(codeVerifier)));
|
|
166
|
+
// Generate a random state
|
|
167
|
+
const state = oauth.generateRandomState();
|
|
168
|
+
// Save the PKCE values in the database
|
|
169
|
+
await this.db.savePKCEValues(this.userId, state, {
|
|
170
|
+
url,
|
|
171
|
+
codeVerifier,
|
|
172
|
+
codeChallenge: codeChallenge,
|
|
173
|
+
resourceUrl
|
|
174
|
+
});
|
|
175
|
+
return { codeVerifier, codeChallenge: codeChallenge, state };
|
|
176
|
+
};
|
|
177
|
+
this.makeTokenRequestAndClient = async (authorizationServer, credentials, codeVerifier, authResponse) => {
|
|
178
|
+
const [client, clientAuth] = this.makeOAuthClientAndAuth(credentials);
|
|
179
|
+
const options = {
|
|
180
|
+
[oauth.customFetch]: this.sideChannelFetch,
|
|
181
|
+
[oauth.allowInsecureRequests]: this.allowInsecureRequests
|
|
182
|
+
};
|
|
183
|
+
const response = await oauth.authorizationCodeGrantRequest(authorizationServer, client, clientAuth, authResponse, credentials.redirectUri, codeVerifier, options);
|
|
184
|
+
return [response, client];
|
|
185
|
+
};
|
|
186
|
+
this.exchangeCodeForToken = async (authResponse, pkceValues, authorizationServer) => {
|
|
187
|
+
const { codeVerifier, url, resourceUrl } = pkceValues;
|
|
188
|
+
// Get the client credentials
|
|
189
|
+
let credentials = await this.getClientCredentials(authorizationServer);
|
|
190
|
+
let [response, client] = await this.makeTokenRequestAndClient(authorizationServer, credentials, codeVerifier, authResponse);
|
|
191
|
+
if (response.status === 403 || response.status === 401) {
|
|
192
|
+
this.logger.info(`Bad response status exchanging code for token: ${response.statusText}. Could be due to bad client credentials - trying to re-register`);
|
|
193
|
+
credentials = await this.registerClient(authorizationServer);
|
|
194
|
+
[response, client] = await this.makeTokenRequestAndClient(authorizationServer, credentials, codeVerifier, authResponse);
|
|
195
|
+
}
|
|
196
|
+
const result = await oauth.processAuthorizationCodeResponse(authorizationServer, client, response);
|
|
197
|
+
// Save the access token in the database
|
|
198
|
+
await this.db.saveAccessToken(this.userId, url, {
|
|
199
|
+
resourceUrl,
|
|
200
|
+
accessToken: result.access_token,
|
|
201
|
+
refreshToken: result.refresh_token,
|
|
202
|
+
expiresAt: result.expires_in
|
|
203
|
+
? Date.now() + result.expires_in * 1000
|
|
204
|
+
: undefined
|
|
205
|
+
});
|
|
206
|
+
return result.access_token;
|
|
207
|
+
};
|
|
208
|
+
this.getAccessToken = async (url) => {
|
|
209
|
+
// Get the access token from the database
|
|
210
|
+
url = OAuthClient.trimToPath(url);
|
|
211
|
+
let parentPath = OAuthClient.getParentPath(url);
|
|
212
|
+
let tokenData = await this.db.getAccessToken(this.userId, url);
|
|
213
|
+
// If there's no token for the requested path, see if there's one for the parent
|
|
214
|
+
while (!tokenData && parentPath) {
|
|
215
|
+
tokenData = await this.db.getAccessToken(this.userId, parentPath);
|
|
216
|
+
parentPath = OAuthClient.getParentPath(parentPath);
|
|
217
|
+
}
|
|
218
|
+
return tokenData;
|
|
219
|
+
};
|
|
220
|
+
this.tryRefreshToken = async (url) => {
|
|
221
|
+
url = OAuthClient.trimToPath(url);
|
|
222
|
+
const token = await this.getAccessToken(url);
|
|
223
|
+
if (!token) {
|
|
224
|
+
this.logger.info('No token found, cannot refresh');
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
if (!token.refreshToken) {
|
|
228
|
+
this.logger.info('No refresh token found, cannot refresh');
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
const authorizationServer = await this.getAuthorizationServer(token.resourceUrl);
|
|
232
|
+
const credentials = await this.getClientCredentials(authorizationServer);
|
|
233
|
+
const [client, clientAuth] = this.makeOAuthClientAndAuth(credentials);
|
|
234
|
+
const response = await oauth.refreshTokenGrantRequest(authorizationServer, client, clientAuth, token.refreshToken, {
|
|
235
|
+
[oauth.customFetch]: this.sideChannelFetch,
|
|
236
|
+
[oauth.allowInsecureRequests]: this.allowInsecureRequests
|
|
237
|
+
});
|
|
238
|
+
const result = await oauth.processRefreshTokenResponse(authorizationServer, client, response);
|
|
239
|
+
const at = {
|
|
240
|
+
resourceUrl: token.resourceUrl,
|
|
241
|
+
accessToken: result.access_token,
|
|
242
|
+
refreshToken: result.refresh_token,
|
|
243
|
+
expiresAt: result.expires_in
|
|
244
|
+
? Date.now() + result.expires_in * 1000
|
|
245
|
+
: undefined
|
|
246
|
+
};
|
|
247
|
+
await this.db.saveAccessToken(this.userId, url, at);
|
|
248
|
+
return at;
|
|
249
|
+
};
|
|
250
|
+
this._doFetch = async (url, init) => {
|
|
251
|
+
const stringUrl = url instanceof URL ? url.toString() : url;
|
|
252
|
+
this.logger.info(`Making ${init?.method || 'GET'} request to ${stringUrl}`);
|
|
253
|
+
const tokenData = await this.getAccessToken(stringUrl);
|
|
254
|
+
if (!tokenData) {
|
|
255
|
+
this.logger.info(`No access token found for resource server ${stringUrl}. Passing no authorization header.`);
|
|
256
|
+
}
|
|
257
|
+
// Create a new init object to avoid mutating the original
|
|
258
|
+
const requestInit = { ...init };
|
|
259
|
+
if (tokenData) {
|
|
260
|
+
// Create a new Headers object from existing headers (if any)
|
|
261
|
+
const headers = new Headers(requestInit.headers);
|
|
262
|
+
headers.set('Authorization', `Bearer ${tokenData.accessToken}`);
|
|
263
|
+
requestInit.headers = headers;
|
|
264
|
+
}
|
|
265
|
+
// Make the request with the access token
|
|
266
|
+
const response = await this.fetchFn(url, requestInit);
|
|
267
|
+
return response;
|
|
268
|
+
};
|
|
269
|
+
this.db = db;
|
|
270
|
+
this.userId = userId;
|
|
271
|
+
this.fetchFn = fetchFn;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=oAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oAuth.js","sourceRoot":"","sources":["../../src/oAuth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.expo.d.ts","sourceRoot":"","sources":["../../src/setup.expo.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Minimal Expo test setup
|
|
2
|
+
import { vi } from 'vitest';
|
|
3
|
+
// Set test environment
|
|
4
|
+
process.env.NODE_ENV = 'test';
|
|
5
|
+
// Skip React Native navigator setup for now - causes syntax errors
|
|
6
|
+
// Mock Expo modules
|
|
7
|
+
vi.mock('expo-sqlite', () => ({
|
|
8
|
+
openDatabaseSync: vi.fn(() => ({
|
|
9
|
+
execAsync: vi.fn(async () => { }),
|
|
10
|
+
prepareAsync: vi.fn(async () => ({
|
|
11
|
+
executeAsync: vi.fn(async () => ({
|
|
12
|
+
getFirstAsync: vi.fn(async () => ({ name: 'test-name' })),
|
|
13
|
+
})),
|
|
14
|
+
finalizeAsync: vi.fn(async () => { }),
|
|
15
|
+
})),
|
|
16
|
+
closeAsync: vi.fn(async () => { }),
|
|
17
|
+
})),
|
|
18
|
+
}));
|
|
19
|
+
vi.mock('expo-crypto', () => ({
|
|
20
|
+
digestStringAsync: vi.fn(async (algorithm, data) => {
|
|
21
|
+
// Simple mock implementation that returns a hex string
|
|
22
|
+
const encoder = new TextEncoder();
|
|
23
|
+
const dataBuffer = encoder.encode(data);
|
|
24
|
+
const hashBuffer = new Uint8Array(32); // SHA256 is 32 bytes
|
|
25
|
+
// Simple hash simulation - just use the first 32 bytes of the input
|
|
26
|
+
for (let i = 0; i < Math.min(32, dataBuffer.length); i++) {
|
|
27
|
+
hashBuffer[i] = dataBuffer[i];
|
|
28
|
+
}
|
|
29
|
+
return Array.from(hashBuffer).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
30
|
+
}),
|
|
31
|
+
CryptoDigestAlgorithm: {
|
|
32
|
+
SHA256: 'SHA256',
|
|
33
|
+
},
|
|
34
|
+
randomUUID: vi.fn(() => 'test-uuid-' + Math.random().toString(36).substr(2, 9)),
|
|
35
|
+
}));
|
|
36
|
+
vi.mock('react-native-url-polyfill', () => ({
|
|
37
|
+
URL: global.URL,
|
|
38
|
+
}));
|
|
39
|
+
vi.mock('react-native-url-polyfill/auto', () => ({}));
|
|
40
|
+
// Set up test environment
|
|
41
|
+
process.env.NODE_ENV = 'test';
|
|
42
|
+
//# sourceMappingURL=setup.expo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.expo.js","sourceRoot":"","sources":["../../src/setup.expo.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,uBAAuB;AACvB,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC;AAE9B,mEAAmE;AAEnE,oBAAoB;AACpB,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7B,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;QAChC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC/B,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC/B,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;aAC1D,CAAC,CAAC;YACH,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;SACrC,CAAC,CAAC;QACH,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;KAClC,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,SAAiB,EAAE,IAAY,EAAE,EAAE;QACjE,uDAAuD;QACvD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB;QAC5D,oEAAoE;QACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzD,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC,CAAC;IACF,qBAAqB,EAAE;QACrB,MAAM,EAAE,QAAQ;KACjB;IACD,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAChF,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,GAAG,EAAE,MAAM,CAAC,GAAG;CAChB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEtD,0BAA0B;AAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Account, PaymentMaker } from './types.js';
|
|
2
|
+
export declare class SolanaAccount implements Account {
|
|
3
|
+
accountId: string;
|
|
4
|
+
paymentMakers: {
|
|
5
|
+
[key: string]: PaymentMaker;
|
|
6
|
+
};
|
|
7
|
+
constructor(solanaEndpoint: string, sourceSecretKey: string);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=solanaAccount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solanaAccount.d.ts","sourceRoot":"","sources":["../../src/solanaAccount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAKxD,qBAAa,aAAc,YAAW,OAAO;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;KAAE,CAAC;gBAEnC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;CAc5D"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SolanaPaymentMaker } from './solanaPaymentMaker.js';
|
|
2
|
+
import { Keypair } from "@solana/web3.js";
|
|
3
|
+
import bs58 from "bs58";
|
|
4
|
+
export class SolanaAccount {
|
|
5
|
+
constructor(solanaEndpoint, sourceSecretKey) {
|
|
6
|
+
if (!solanaEndpoint) {
|
|
7
|
+
throw new Error('Solana endpoint is required');
|
|
8
|
+
}
|
|
9
|
+
if (!sourceSecretKey) {
|
|
10
|
+
throw new Error('Source secret key is required');
|
|
11
|
+
}
|
|
12
|
+
const source = Keypair.fromSecretKey(bs58.decode(sourceSecretKey));
|
|
13
|
+
this.accountId = source.publicKey.toBase58();
|
|
14
|
+
this.paymentMakers = {
|
|
15
|
+
'solana': new SolanaPaymentMaker(solanaEndpoint, sourceSecretKey),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=solanaAccount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solanaAccount.js","sourceRoot":"","sources":["../../src/solanaAccount.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,OAAO,aAAa;IAIxB,YAAY,cAAsB,EAAE,eAAuB;QACzD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;QAEnE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC7C,IAAI,CAAC,aAAa,GAAG;YACnB,QAAQ,EAAE,IAAI,kBAAkB,CAAC,cAAc,EAAE,eAAe,CAAC;SAClE,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PaymentMaker } from './types.js';
|
|
2
|
+
import { ValidateTransferError as _ValidateTransferError } from "@solana/pay";
|
|
3
|
+
import BigNumber from "bignumber.js";
|
|
4
|
+
import { Logger } from '@longrun/atxp-common';
|
|
5
|
+
export declare const ValidateTransferError: typeof _ValidateTransferError;
|
|
6
|
+
export declare class SolanaPaymentMaker implements PaymentMaker {
|
|
7
|
+
private connection;
|
|
8
|
+
private source;
|
|
9
|
+
private logger;
|
|
10
|
+
constructor(solanaEndpoint: string, sourceSecretKey: string, logger?: Logger);
|
|
11
|
+
generateJWT: ({ paymentRequestId, codeChallenge }: {
|
|
12
|
+
paymentRequestId: string;
|
|
13
|
+
codeChallenge: string;
|
|
14
|
+
}) => Promise<string>;
|
|
15
|
+
makePayment: (amount: BigNumber, currency: string, receiver: string) => Promise<string>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=solanaPaymentMaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solanaPaymentMaker.d.ts","sourceRoot":"","sources":["../../src/solanaPaymentMaker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAkB,qBAAqB,IAAI,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE9F,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAM9C,eAAO,MAAM,qBAAqB,+BAAyB,CAAC;AAE5D,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAY5E,WAAW,GAAS,qCAAmC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAC,KAAG,OAAO,CAAC,MAAM,CAAC,CAezH;IAED,WAAW,GAAU,QAAQ,SAAS,EAAE,UAAU,MAAM,EAAE,UAAU,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,CAqC3F;CACF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Keypair, Connection, PublicKey, ComputeBudgetProgram, sendAndConfirmTransaction } from "@solana/web3.js";
|
|
2
|
+
import { createTransfer, ValidateTransferError as _ValidateTransferError } from "@solana/pay";
|
|
3
|
+
import bs58 from "bs58";
|
|
4
|
+
import { generateJWT } from '@longrun/atxp-common';
|
|
5
|
+
import { importJWK } from 'jose';
|
|
6
|
+
import { ConsoleLogger } from '@longrun/atxp-common';
|
|
7
|
+
// this is a global public key for USDC on the solana mainnet
|
|
8
|
+
const USDC_MINT = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
|
|
9
|
+
export const ValidateTransferError = _ValidateTransferError;
|
|
10
|
+
export class SolanaPaymentMaker {
|
|
11
|
+
constructor(solanaEndpoint, sourceSecretKey, logger) {
|
|
12
|
+
this.generateJWT = async ({ paymentRequestId, codeChallenge }) => {
|
|
13
|
+
// Solana/Web3.js secretKey is 64 bytes:
|
|
14
|
+
// first 32 bytes are the private scalar, last 32 are the public key.
|
|
15
|
+
// JWK expects only the 32-byte private scalar for 'd'
|
|
16
|
+
const jwk = {
|
|
17
|
+
kty: 'OKP',
|
|
18
|
+
crv: 'Ed25519',
|
|
19
|
+
d: Buffer.from(this.source.secretKey.slice(0, 32)).toString('base64url'),
|
|
20
|
+
x: Buffer.from(this.source.publicKey.toBytes()).toString('base64url'),
|
|
21
|
+
};
|
|
22
|
+
const privateKey = await importJWK(jwk, 'EdDSA');
|
|
23
|
+
if (!(privateKey instanceof CryptoKey)) {
|
|
24
|
+
throw new Error('Expected CryptoKey from importJWK');
|
|
25
|
+
}
|
|
26
|
+
return generateJWT(this.source.publicKey.toBase58(), privateKey, paymentRequestId || '', codeChallenge || '');
|
|
27
|
+
};
|
|
28
|
+
this.makePayment = async (amount, currency, receiver) => {
|
|
29
|
+
currency = currency.toLowerCase();
|
|
30
|
+
if (currency !== 'usdc') {
|
|
31
|
+
throw new Error('Only usdc currency is supported; received ' + currency);
|
|
32
|
+
}
|
|
33
|
+
const receiverKey = new PublicKey(receiver);
|
|
34
|
+
const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({
|
|
35
|
+
units: 10000,
|
|
36
|
+
});
|
|
37
|
+
const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({
|
|
38
|
+
microLamports: 20000,
|
|
39
|
+
});
|
|
40
|
+
this.logger.info(`Making payment of ${amount} ${currency} to ${receiver}`);
|
|
41
|
+
const transaction = await createTransfer(this.connection, this.source.publicKey, {
|
|
42
|
+
amount: amount,
|
|
43
|
+
recipient: receiverKey,
|
|
44
|
+
splToken: USDC_MINT,
|
|
45
|
+
});
|
|
46
|
+
transaction.add(modifyComputeUnits);
|
|
47
|
+
transaction.add(addPriorityFee);
|
|
48
|
+
const transactionHash = await sendAndConfirmTransaction(this.connection, transaction, [this.source]);
|
|
49
|
+
return transactionHash;
|
|
50
|
+
};
|
|
51
|
+
if (!solanaEndpoint) {
|
|
52
|
+
throw new Error('Solana endpoint is required');
|
|
53
|
+
}
|
|
54
|
+
if (!sourceSecretKey) {
|
|
55
|
+
throw new Error('Source secret key is required');
|
|
56
|
+
}
|
|
57
|
+
this.connection = new Connection(solanaEndpoint, { commitment: 'confirmed' });
|
|
58
|
+
this.source = Keypair.fromSecretKey(bs58.decode(sourceSecretKey));
|
|
59
|
+
this.logger = logger ?? new ConsoleLogger();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=solanaPaymentMaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solanaPaymentMaker.js","sourceRoot":"","sources":["../../src/solanaPaymentMaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { AuthorizationServerUrl, Currency, Logger, Network, OAuthDb, FetchLike } from "@longrun/atxp-common";
|
|
2
|
+
import { ClientOptions } from "@modelcontextprotocol/sdk/client/index.js";
|
|
3
|
+
import { Implementation } from "@modelcontextprotocol/sdk/types.js";
|
|
4
|
+
type AccountPrefix = Network;
|
|
5
|
+
export type AccountIdString = `${AccountPrefix}${string}`;
|
|
6
|
+
export type Account = {
|
|
7
|
+
accountId: string;
|
|
8
|
+
paymentMakers: {
|
|
9
|
+
[key: string]: PaymentMaker;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export type ProspectivePayment = {
|
|
13
|
+
accountId: string;
|
|
14
|
+
resourceUrl: string;
|
|
15
|
+
resourceName: string;
|
|
16
|
+
network: Network;
|
|
17
|
+
currency: Currency;
|
|
18
|
+
amount: BigNumber;
|
|
19
|
+
iss: string;
|
|
20
|
+
};
|
|
21
|
+
export type ClientConfig = {
|
|
22
|
+
mcpServer: string;
|
|
23
|
+
account: Account;
|
|
24
|
+
allowedAuthorizationServers: AuthorizationServerUrl[];
|
|
25
|
+
approvePayment: (payment: ProspectivePayment) => Promise<boolean>;
|
|
26
|
+
oAuthDb: OAuthDb;
|
|
27
|
+
fetchFn: FetchLike;
|
|
28
|
+
oAuthChannelFetch: FetchLike;
|
|
29
|
+
allowHttp: boolean;
|
|
30
|
+
logger: Logger;
|
|
31
|
+
clientInfo: Implementation;
|
|
32
|
+
clientOptions: ClientOptions;
|
|
33
|
+
onAuthorize: (args: {
|
|
34
|
+
authorizationServer: AuthorizationServerUrl;
|
|
35
|
+
userId: string;
|
|
36
|
+
}) => Promise<void>;
|
|
37
|
+
onAuthorizeFailure: (args: {
|
|
38
|
+
authorizationServer: AuthorizationServerUrl;
|
|
39
|
+
userId: string;
|
|
40
|
+
error: Error;
|
|
41
|
+
}) => Promise<void>;
|
|
42
|
+
onPayment: (args: {
|
|
43
|
+
payment: ProspectivePayment;
|
|
44
|
+
}) => Promise<void>;
|
|
45
|
+
onPaymentFailure: (args: {
|
|
46
|
+
payment: ProspectivePayment;
|
|
47
|
+
error: Error;
|
|
48
|
+
}) => Promise<void>;
|
|
49
|
+
};
|
|
50
|
+
export interface PaymentMaker {
|
|
51
|
+
makePayment: (amount: BigNumber, currency: string, receiver: string, memo: string) => Promise<string>;
|
|
52
|
+
generateJWT: (params: {
|
|
53
|
+
paymentRequestId: string;
|
|
54
|
+
codeChallenge: string;
|
|
55
|
+
}) => Promise<string>;
|
|
56
|
+
}
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,KAAK,aAAa,GAAG,OAAO,CAAC;AAC7B,MAAM,MAAM,eAAe,GAAG,GAAG,aAAa,GAAG,MAAM,EAAE,CAAC;AAE1D,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;KAAC,CAAC;CAC9C,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B,EAAE,sBAAsB,EAAE,CAAC;IACtD,cAAc,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,SAAS,CAAC;IACnB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,cAAc,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,mBAAmB,EAAE,sBAAsB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtG,kBAAkB,EAAE,CAAC,IAAI,EAAE;QAAE,mBAAmB,EAAE,sBAAsB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3H,SAAS,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,kBAAkB,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,gBAAgB,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,kBAAkB,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F,CAAA;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtG,WAAW,EAAE,CAAC,MAAM,EAAE;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|