@calimero-network/mero-js 1.0.2 → 1.2.0
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/dist/admin-api/admin-client.d.ts +29 -27
- package/dist/admin-api/admin-client.d.ts.map +1 -1
- package/dist/admin-api/admin-client.js +70 -58
- package/dist/admin-api/admin-client.js.map +1 -1
- package/dist/admin-api/admin-types.d.ts +57 -159
- package/dist/admin-api/admin-types.d.ts.map +1 -1
- package/dist/admin-api/admin-types.js +1 -1
- package/dist/admin-api/admin-types.js.map +1 -1
- package/dist/auth/index.d.ts +26 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +51 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/events/index.d.ts +5 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +3 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/sse.d.ts +41 -0
- package/dist/events/sse.d.ts.map +1 -0
- package/dist/events/sse.js +237 -0
- package/dist/events/sse.js.map +1 -0
- package/dist/events/ws.d.ts +42 -0
- package/dist/events/ws.d.ts.map +1 -0
- package/dist/events/ws.js +178 -0
- package/dist/events/ws.js.map +1 -0
- package/dist/http-client/http-factory.d.ts +18 -0
- package/dist/http-client/http-factory.d.ts.map +1 -1
- package/dist/http-client/http-factory.js +2 -0
- package/dist/http-client/http-factory.js.map +1 -1
- package/dist/http-client/http-types.d.ts +6 -0
- package/dist/http-client/http-types.d.ts.map +1 -1
- package/dist/http-client/web-client.d.ts +2 -0
- package/dist/http-client/web-client.d.ts.map +1 -1
- package/dist/http-client/web-client.js +129 -58
- package/dist/http-client/web-client.js.map +1 -1
- package/dist/index.browser.mjs +2 -1
- package/dist/index.browser.mjs.map +4 -4
- package/dist/index.cjs +784 -148
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +784 -148
- package/dist/index.mjs.map +4 -4
- package/dist/mero-js.d.ts +47 -1
- package/dist/mero-js.d.ts.map +1 -1
- package/dist/mero-js.js +132 -16
- package/dist/mero-js.js.map +1 -1
- package/dist/rpc/index.d.ts +21 -0
- package/dist/rpc/index.d.ts.map +1 -0
- package/dist/rpc/index.js +39 -0
- package/dist/rpc/index.js.map +1 -0
- package/dist/token-store/index.d.ts +20 -0
- package/dist/token-store/index.d.ts.map +1 -0
- package/dist/token-store/index.js +62 -0
- package/dist/token-store/index.js.map +1 -0
- package/package.json +1 -1
package/dist/mero-js.js
CHANGED
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
import { createBrowserHttpClient } from './http-client';
|
|
2
2
|
import { createAuthApiClientFromHttpClient } from './auth-api';
|
|
3
3
|
import { createAdminApiClientFromHttpClient } from './admin-api';
|
|
4
|
+
import { parseAuthCallback, buildAuthLoginUrl } from './auth';
|
|
5
|
+
import { RpcClient } from './rpc';
|
|
6
|
+
import { SseClient } from './events/sse';
|
|
7
|
+
import { WsClient } from './events/ws';
|
|
8
|
+
/** Try to extract `exp` (seconds) from a JWT, return ms timestamp or fallback. */
|
|
9
|
+
function expiresAtFromJwt(token, fallbackMs) {
|
|
10
|
+
try {
|
|
11
|
+
const parts = token.split('.');
|
|
12
|
+
if (parts.length === 3) {
|
|
13
|
+
// JWT uses base64url encoding: replace -/_ with +// and add padding
|
|
14
|
+
let b64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');
|
|
15
|
+
while (b64.length % 4)
|
|
16
|
+
b64 += '=';
|
|
17
|
+
const payload = JSON.parse(atob(b64));
|
|
18
|
+
if (typeof payload.exp === 'number') {
|
|
19
|
+
return payload.exp * 1000;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// not a JWT or can't parse
|
|
25
|
+
}
|
|
26
|
+
return fallbackMs;
|
|
27
|
+
}
|
|
4
28
|
/**
|
|
5
29
|
* Main MeroJs SDK class that manages all API clients and authentication
|
|
6
30
|
*/
|
|
@@ -8,10 +32,19 @@ export class MeroJs {
|
|
|
8
32
|
constructor(config) {
|
|
9
33
|
this.tokenData = null;
|
|
10
34
|
this.refreshPromise = null;
|
|
35
|
+
this.rpcClient = null;
|
|
36
|
+
this.sseClient = null;
|
|
37
|
+
this.wsClient = null;
|
|
38
|
+
this.wsWarned = false;
|
|
11
39
|
this.config = {
|
|
12
40
|
timeoutMs: 10000,
|
|
13
41
|
...config,
|
|
14
42
|
};
|
|
43
|
+
this.tokenStore = config.tokenStore ?? null;
|
|
44
|
+
// Restore tokens from store if available
|
|
45
|
+
if (this.tokenStore) {
|
|
46
|
+
this.tokenData = this.tokenStore.getTokens();
|
|
47
|
+
}
|
|
15
48
|
// Create HTTP client with token management
|
|
16
49
|
// For Tauri, explicitly set credentials to 'omit' to avoid network errors
|
|
17
50
|
const isTauri = typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;
|
|
@@ -21,6 +54,16 @@ export class MeroJs {
|
|
|
21
54
|
const token = await this.getValidToken();
|
|
22
55
|
return token?.access_token || '';
|
|
23
56
|
},
|
|
57
|
+
refreshToken: async () => {
|
|
58
|
+
const refreshed = await this.performTokenRefresh();
|
|
59
|
+
return refreshed.access_token;
|
|
60
|
+
},
|
|
61
|
+
onTokenRefresh: async (newToken) => {
|
|
62
|
+
if (this.tokenData) {
|
|
63
|
+
this.tokenData.access_token = newToken;
|
|
64
|
+
this.tokenStore?.setTokens(this.tokenData);
|
|
65
|
+
}
|
|
66
|
+
},
|
|
24
67
|
timeoutMs: this.config.timeoutMs,
|
|
25
68
|
credentials: this.config.requestCredentials ?? (isTauri ? 'omit' : undefined),
|
|
26
69
|
});
|
|
@@ -41,7 +84,6 @@ export class MeroJs {
|
|
|
41
84
|
},
|
|
42
85
|
timeoutMs: this.config.timeoutMs,
|
|
43
86
|
});
|
|
44
|
-
// Token management is in-memory only
|
|
45
87
|
}
|
|
46
88
|
/**
|
|
47
89
|
* Get the Auth API client
|
|
@@ -55,6 +97,50 @@ export class MeroJs {
|
|
|
55
97
|
get admin() {
|
|
56
98
|
return this.adminClient;
|
|
57
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Get the RPC client (lazy initialized)
|
|
102
|
+
*/
|
|
103
|
+
get rpc() {
|
|
104
|
+
if (!this.rpcClient) {
|
|
105
|
+
this.rpcClient = new RpcClient({ httpClient: this.httpClient });
|
|
106
|
+
}
|
|
107
|
+
return this.rpcClient;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get the SSE event client (lazy initialized)
|
|
111
|
+
*/
|
|
112
|
+
get events() {
|
|
113
|
+
if (!this.sseClient) {
|
|
114
|
+
this.sseClient = new SseClient({
|
|
115
|
+
baseUrl: this.config.baseUrl,
|
|
116
|
+
getAuthToken: async () => {
|
|
117
|
+
const token = await this.getValidToken();
|
|
118
|
+
return token?.access_token || '';
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return this.sseClient;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get the WebSocket event client (lazy initialized).
|
|
126
|
+
* @experimental Use `events` (SSE) for production. WsClient is experimental.
|
|
127
|
+
*/
|
|
128
|
+
get ws() {
|
|
129
|
+
if (!this.wsWarned) {
|
|
130
|
+
this.wsWarned = true;
|
|
131
|
+
console.warn('[mero-js] WsClient is experimental. Use mero.events (SSE) for production.');
|
|
132
|
+
}
|
|
133
|
+
if (!this.wsClient) {
|
|
134
|
+
this.wsClient = new WsClient({
|
|
135
|
+
baseUrl: this.config.baseUrl,
|
|
136
|
+
getAuthToken: async () => {
|
|
137
|
+
const token = await this.getValidToken();
|
|
138
|
+
return token?.access_token || '';
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return this.wsClient;
|
|
143
|
+
}
|
|
58
144
|
/**
|
|
59
145
|
* Authenticate with the provided credentials
|
|
60
146
|
* This will create the root key on first use
|
|
@@ -77,11 +163,13 @@ export class MeroJs {
|
|
|
77
163
|
},
|
|
78
164
|
};
|
|
79
165
|
const response = await this.authClient.generateTokens(requestBody);
|
|
166
|
+
const accessToken = response.data.access_token;
|
|
80
167
|
this.tokenData = {
|
|
81
|
-
access_token:
|
|
168
|
+
access_token: accessToken,
|
|
82
169
|
refresh_token: response.data.refresh_token,
|
|
83
|
-
expires_at: Date.now() +
|
|
170
|
+
expires_at: expiresAtFromJwt(accessToken, Date.now() + 3600000),
|
|
84
171
|
};
|
|
172
|
+
this.tokenStore?.setTokens(this.tokenData);
|
|
85
173
|
return this.tokenData;
|
|
86
174
|
}
|
|
87
175
|
catch (error) {
|
|
@@ -89,17 +177,12 @@ export class MeroJs {
|
|
|
89
177
|
}
|
|
90
178
|
}
|
|
91
179
|
/**
|
|
92
|
-
* Get a valid token
|
|
180
|
+
* Get a valid token. Returns the current token as-is.
|
|
181
|
+
* The server rejects refresh attempts while the access token is still valid,
|
|
182
|
+
* so we never proactively refresh. Instead, the WebHttpClient handles 401
|
|
183
|
+
* responses reactively via the refreshToken transport hook.
|
|
93
184
|
*/
|
|
94
185
|
async getValidToken() {
|
|
95
|
-
if (!this.tokenData) {
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
// Check if token is expired (with 5 minute buffer)
|
|
99
|
-
const bufferTime = 5 * 60 * 1000; // 5 minutes
|
|
100
|
-
if (Date.now() >= this.tokenData.expires_at - bufferTime) {
|
|
101
|
-
return await this.refreshToken();
|
|
102
|
-
}
|
|
103
186
|
return this.tokenData;
|
|
104
187
|
}
|
|
105
188
|
/**
|
|
@@ -134,16 +217,19 @@ export class MeroJs {
|
|
|
134
217
|
access_token: this.tokenData.access_token,
|
|
135
218
|
refresh_token: this.tokenData.refresh_token,
|
|
136
219
|
});
|
|
220
|
+
const accessToken = response.data.access_token;
|
|
137
221
|
this.tokenData = {
|
|
138
|
-
access_token:
|
|
222
|
+
access_token: accessToken,
|
|
139
223
|
refresh_token: response.data.refresh_token,
|
|
140
|
-
expires_at: Date.now() +
|
|
224
|
+
expires_at: expiresAtFromJwt(accessToken, Date.now() + 3600000),
|
|
141
225
|
};
|
|
226
|
+
this.tokenStore?.setTokens(this.tokenData);
|
|
142
227
|
return this.tokenData;
|
|
143
228
|
}
|
|
144
229
|
catch (error) {
|
|
145
|
-
//
|
|
146
|
-
|
|
230
|
+
// Don't clear tokens on refresh failure — the access token may still be
|
|
231
|
+
// valid (server rejects refresh while access token hasn't expired yet).
|
|
232
|
+
// Let the caller handle the error.
|
|
147
233
|
throw new Error(`Token refresh failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
148
234
|
}
|
|
149
235
|
}
|
|
@@ -152,6 +238,7 @@ export class MeroJs {
|
|
|
152
238
|
*/
|
|
153
239
|
clearToken() {
|
|
154
240
|
this.tokenData = null;
|
|
241
|
+
this.tokenStore?.clear();
|
|
155
242
|
}
|
|
156
243
|
/**
|
|
157
244
|
* Check if the SDK is authenticated
|
|
@@ -159,12 +246,41 @@ export class MeroJs {
|
|
|
159
246
|
isAuthenticated() {
|
|
160
247
|
return this.tokenData !== null;
|
|
161
248
|
}
|
|
249
|
+
/**
|
|
250
|
+
* Set token data directly (e.g., from auth callback).
|
|
251
|
+
* If `expires_at` is missing or 0, attempts to parse the JWT exp claim,
|
|
252
|
+
* falling back to 1 hour from now.
|
|
253
|
+
*/
|
|
254
|
+
setTokenData(data) {
|
|
255
|
+
const expiresAt = data.expires_at || expiresAtFromJwt(data.access_token, Date.now() + 3600000);
|
|
256
|
+
this.tokenData = { ...data, expires_at: expiresAt };
|
|
257
|
+
this.tokenStore?.setTokens(this.tokenData);
|
|
258
|
+
}
|
|
162
259
|
/**
|
|
163
260
|
* Get the current token data (for debugging)
|
|
164
261
|
*/
|
|
165
262
|
getTokenData() {
|
|
166
263
|
return this.tokenData;
|
|
167
264
|
}
|
|
265
|
+
/**
|
|
266
|
+
* Close all event connections and clean up resources
|
|
267
|
+
*/
|
|
268
|
+
close() {
|
|
269
|
+
this.sseClient?.close();
|
|
270
|
+
this.wsClient?.close();
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Parse an auth callback URL hash fragment (static utility)
|
|
274
|
+
*/
|
|
275
|
+
static parseAuthCallback(url) {
|
|
276
|
+
return parseAuthCallback(url);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Build an auth login URL (static utility)
|
|
280
|
+
*/
|
|
281
|
+
static buildAuthLoginUrl(nodeUrl, opts) {
|
|
282
|
+
return buildAuthLoginUrl(nodeUrl, opts);
|
|
283
|
+
}
|
|
168
284
|
}
|
|
169
285
|
/**
|
|
170
286
|
* Create a new MeroJs SDK instance
|
package/dist/mero-js.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mero-js.js","sourceRoot":"","sources":["../src/mero-js.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,kCAAkC,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"mero-js.js","sourceRoot":"","sources":["../src/mero-js.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { HttpClient } from '../http-client';
|
|
2
|
+
export interface ExecuteParams {
|
|
3
|
+
contextId: string;
|
|
4
|
+
method: string;
|
|
5
|
+
argsJson?: Record<string, unknown>;
|
|
6
|
+
executorPublicKey: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class RpcError extends Error {
|
|
9
|
+
code: number;
|
|
10
|
+
type?: string;
|
|
11
|
+
data?: unknown;
|
|
12
|
+
constructor(code: number, message: string, data?: unknown, type?: string);
|
|
13
|
+
}
|
|
14
|
+
export declare class RpcClient {
|
|
15
|
+
private httpClient;
|
|
16
|
+
constructor(opts: {
|
|
17
|
+
httpClient: HttpClient;
|
|
18
|
+
});
|
|
19
|
+
execute<T = unknown>(params: ExecuteParams): Promise<T>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rpc/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEH,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;CAOzE;AAmBD,qBAAa,SAAS;IACpB,OAAO,CAAC,UAAU,CAAa;gBAEnB,IAAI,EAAE;QAAE,UAAU,EAAE,UAAU,CAAA;KAAE;IAItC,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;CA+B9D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export class RpcError extends Error {
|
|
2
|
+
constructor(code, message, data, type) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = 'RpcError';
|
|
5
|
+
this.code = code;
|
|
6
|
+
this.data = data;
|
|
7
|
+
this.type = type;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class RpcClient {
|
|
11
|
+
constructor(opts) {
|
|
12
|
+
this.httpClient = opts.httpClient;
|
|
13
|
+
}
|
|
14
|
+
async execute(params) {
|
|
15
|
+
const body = {
|
|
16
|
+
jsonrpc: '2.0',
|
|
17
|
+
id: 1,
|
|
18
|
+
method: 'execute',
|
|
19
|
+
params: {
|
|
20
|
+
contextId: params.contextId,
|
|
21
|
+
method: params.method,
|
|
22
|
+
argsJson: params.argsJson ?? {},
|
|
23
|
+
executorPublicKey: params.executorPublicKey,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
const response = await this.httpClient.post('/jsonrpc', body);
|
|
27
|
+
if (response.error) {
|
|
28
|
+
const err = response.error;
|
|
29
|
+
const code = err.code ?? -1;
|
|
30
|
+
const message = err.message ?? err.type ?? 'RPC error';
|
|
31
|
+
throw new RpcError(code, message, err.data, err.type);
|
|
32
|
+
}
|
|
33
|
+
if (response.result && 'output' in response.result) {
|
|
34
|
+
return response.result.output;
|
|
35
|
+
}
|
|
36
|
+
return response.result;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rpc/index.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAKjC,YAAY,IAAY,EAAE,OAAe,EAAE,IAAc,EAAE,IAAa;QACtE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAmBD,MAAM,OAAO,SAAS;IAGpB,YAAY,IAAgC;QAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,OAAO,CAAc,MAAqB;QAC9C,MAAM,IAAI,GAAG;YACX,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE;gBACN,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;gBAC/B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;aAC5C;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CACzC,UAAU,EACV,IAAI,CACL,CAAC;QAEF,IAAI,QAAQ,CAAC,KAAK,EAAE;YAClB,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC;YACvD,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;SACvD;QAED,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,EAAE;YAClD,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAW,CAAC;SACpC;QAED,OAAO,QAAQ,CAAC,MAAW,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { TokenData } from '../mero-js';
|
|
2
|
+
export interface TokenStore {
|
|
3
|
+
getTokens(): TokenData | null;
|
|
4
|
+
setTokens(data: TokenData): void;
|
|
5
|
+
clear(): void;
|
|
6
|
+
}
|
|
7
|
+
export declare class MemoryTokenStore implements TokenStore {
|
|
8
|
+
private tokens;
|
|
9
|
+
getTokens(): TokenData | null;
|
|
10
|
+
setTokens(data: TokenData): void;
|
|
11
|
+
clear(): void;
|
|
12
|
+
}
|
|
13
|
+
export declare class LocalStorageTokenStore implements TokenStore {
|
|
14
|
+
private readonly key;
|
|
15
|
+
constructor(key?: string);
|
|
16
|
+
getTokens(): TokenData | null;
|
|
17
|
+
setTokens(data: TokenData): void;
|
|
18
|
+
clear(): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/token-store/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,SAAS,IAAI,SAAS,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,MAAM,CAA0B;IAExC,SAAS,IAAI,SAAS,GAAG,IAAI;IAI7B,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAIhC,KAAK,IAAI,IAAI;CAGd;AAID,qBAAa,sBAAuB,YAAW,UAAU;IACvD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEjB,GAAG,GAAE,MAAoB;IAIrC,SAAS,IAAI,SAAS,GAAG,IAAI;IAmB7B,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAShC,KAAK,IAAI,IAAI;CAQd"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export class MemoryTokenStore {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.tokens = null;
|
|
4
|
+
}
|
|
5
|
+
getTokens() {
|
|
6
|
+
return this.tokens;
|
|
7
|
+
}
|
|
8
|
+
setTokens(data) {
|
|
9
|
+
this.tokens = data;
|
|
10
|
+
}
|
|
11
|
+
clear() {
|
|
12
|
+
this.tokens = null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const STORAGE_KEY = 'mero-tokens';
|
|
16
|
+
export class LocalStorageTokenStore {
|
|
17
|
+
constructor(key = STORAGE_KEY) {
|
|
18
|
+
this.key = key;
|
|
19
|
+
}
|
|
20
|
+
getTokens() {
|
|
21
|
+
try {
|
|
22
|
+
if (typeof localStorage === 'undefined')
|
|
23
|
+
return null;
|
|
24
|
+
const raw = localStorage.getItem(this.key);
|
|
25
|
+
if (!raw)
|
|
26
|
+
return null;
|
|
27
|
+
const parsed = JSON.parse(raw);
|
|
28
|
+
if (parsed && parsed.access_token && parsed.refresh_token) {
|
|
29
|
+
return {
|
|
30
|
+
access_token: parsed.access_token,
|
|
31
|
+
refresh_token: parsed.refresh_token,
|
|
32
|
+
expires_at: typeof parsed.expires_at === 'number' ? parsed.expires_at : Date.now() + 3600000,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
setTokens(data) {
|
|
42
|
+
try {
|
|
43
|
+
if (typeof localStorage === 'undefined')
|
|
44
|
+
return;
|
|
45
|
+
localStorage.setItem(this.key, JSON.stringify(data));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Storage unavailable
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
clear() {
|
|
52
|
+
try {
|
|
53
|
+
if (typeof localStorage === 'undefined')
|
|
54
|
+
return;
|
|
55
|
+
localStorage.removeItem(this.key);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Storage unavailable
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/token-store/index.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,gBAAgB;IAA7B;QACU,WAAM,GAAqB,IAAI,CAAC;IAa1C,CAAC;IAXC,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,SAAS,CAAC,IAAe;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;CACF;AAED,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,MAAM,OAAO,sBAAsB;IAGjC,YAAY,MAAc,WAAW;QACnC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,SAAS;QACP,IAAI;YACF,IAAI,OAAO,YAAY,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YACrD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,MAAM,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,aAAa,EAAE;gBACzD,OAAO;oBACL,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,UAAU,EAAE,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAQ;iBAC9F,CAAC;aACH;YACD,OAAO,IAAI,CAAC;SACb;QAAC,MAAM;YACN,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED,SAAS,CAAC,IAAe;QACvB,IAAI;YACF,IAAI,OAAO,YAAY,KAAK,WAAW;gBAAE,OAAO;YAChD,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;SACtD;QAAC,MAAM;YACN,sBAAsB;SACvB;IACH,CAAC;IAED,KAAK;QACH,IAAI;YACF,IAAI,OAAO,YAAY,KAAK,WAAW;gBAAE,OAAO;YAChD,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACnC;QAAC,MAAM;YACN,sBAAsB;SACvB;IACH,CAAC;CACF"}
|