@resultdev/sdk 0.1.0 → 0.3.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/CHANGELOG.md +54 -0
- package/README.md +76 -6
- package/THIRD-PARTY-NOTICES +209 -0
- package/dist/client-CJv_awPt.d.cts +1087 -0
- package/dist/client-DrsZ1qIm.d.ts +1087 -0
- package/dist/index.cjs +2791 -9267
- package/dist/index.d.cts +10 -7494
- package/dist/index.d.ts +10 -7494
- package/dist/index.js +2117 -1446
- package/dist/middleware-BJl9JRg3.d.ts +67 -0
- package/dist/middleware-C1Z6aMvn.d.cts +67 -0
- package/dist/ssr/middleware.cjs +179 -7176
- package/dist/ssr/middleware.d.cts +2 -1881
- package/dist/ssr/middleware.d.ts +2 -1881
- package/dist/ssr/middleware.js +179 -25
- package/dist/ssr.cjs +3154 -9588
- package/dist/ssr.d.cts +66 -7432
- package/dist/ssr.d.ts +66 -7432
- package/dist/ssr.js +2562 -1846
- package/dist/types-DSVtGaIA.d.cts +672 -0
- package/dist/types-DSVtGaIA.d.ts +672 -0
- package/package.json +43 -12
- package/dist/chunk-Y7VCTXPN.js +0 -7165
package/dist/ssr/middleware.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
ERROR_CODES
|
|
3
|
-
} from "../chunk-Y7VCTXPN.js";
|
|
4
|
-
|
|
5
|
-
// ../../node_modules/.bun/@insforge+sdk@1.4.4/node_modules/@insforge/sdk/dist/ssr/middleware.mjs
|
|
1
|
+
// src/lib/jwt.ts
|
|
6
2
|
function decodeBase64Url(input) {
|
|
7
3
|
const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
|
|
8
|
-
const padded = normalized.padEnd(
|
|
4
|
+
const padded = normalized.padEnd(
|
|
5
|
+
normalized.length + (4 - normalized.length % 4) % 4,
|
|
6
|
+
"="
|
|
7
|
+
);
|
|
9
8
|
const binary = atob(padded);
|
|
10
9
|
const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));
|
|
11
10
|
return new TextDecoder().decode(bytes);
|
|
@@ -38,8 +37,10 @@ function isJwtExpiredOrExpiring(token, leewaySeconds = 60) {
|
|
|
38
37
|
}
|
|
39
38
|
return expires.getTime() <= Date.now() + leewaySeconds * 1e3;
|
|
40
39
|
}
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
|
|
41
|
+
// src/ssr/cookies.ts
|
|
42
|
+
var DEFAULT_ACCESS_TOKEN_COOKIE = "result_access_token";
|
|
43
|
+
var DEFAULT_REFRESH_TOKEN_COOKIE = "result_refresh_token";
|
|
43
44
|
var EXPIRED_DATE = /* @__PURE__ */ new Date(0);
|
|
44
45
|
function getAccessTokenCookieName(names) {
|
|
45
46
|
return names?.accessToken ?? DEFAULT_ACCESS_TOKEN_COOKIE;
|
|
@@ -103,7 +104,11 @@ function refreshTokenCookieOptions(token, overrides) {
|
|
|
103
104
|
};
|
|
104
105
|
}
|
|
105
106
|
function expiredCookieOptions(overrides) {
|
|
106
|
-
const {
|
|
107
|
+
const {
|
|
108
|
+
expires: _expires,
|
|
109
|
+
maxAge: _maxAge,
|
|
110
|
+
...safeOverrides
|
|
111
|
+
} = overrides ?? {};
|
|
107
112
|
return {
|
|
108
113
|
...defaultCookieOptions(),
|
|
109
114
|
...safeOverrides,
|
|
@@ -159,14 +164,20 @@ function appendSetCookie(headers, name, value, options) {
|
|
|
159
164
|
function setAuthCookies(cookies, tokens, settings = {}) {
|
|
160
165
|
const accessName = getAccessTokenCookieName(settings.names);
|
|
161
166
|
const refreshName = getRefreshTokenCookieName(settings.names);
|
|
162
|
-
const accessOptions = accessTokenCookieOptions(
|
|
167
|
+
const accessOptions = accessTokenCookieOptions(
|
|
168
|
+
tokens.accessToken,
|
|
169
|
+
settings.options?.accessToken
|
|
170
|
+
);
|
|
163
171
|
setCookie(cookies, accessName, tokens.accessToken, accessOptions);
|
|
164
172
|
if (tokens.refreshToken) {
|
|
165
173
|
setCookie(
|
|
166
174
|
cookies,
|
|
167
175
|
refreshName,
|
|
168
176
|
tokens.refreshToken,
|
|
169
|
-
refreshTokenCookieOptions(
|
|
177
|
+
refreshTokenCookieOptions(
|
|
178
|
+
tokens.refreshToken,
|
|
179
|
+
settings.options?.refreshToken
|
|
180
|
+
)
|
|
170
181
|
);
|
|
171
182
|
}
|
|
172
183
|
}
|
|
@@ -192,7 +203,10 @@ function setAuthCookieHeaders(headers, tokens, settings = {}) {
|
|
|
192
203
|
headers,
|
|
193
204
|
refreshName,
|
|
194
205
|
tokens.refreshToken,
|
|
195
|
-
refreshTokenCookieOptions(
|
|
206
|
+
refreshTokenCookieOptions(
|
|
207
|
+
tokens.refreshToken,
|
|
208
|
+
settings.options?.refreshToken
|
|
209
|
+
)
|
|
196
210
|
);
|
|
197
211
|
}
|
|
198
212
|
}
|
|
@@ -210,16 +224,21 @@ function clearAuthCookieHeaders(headers, settings = {}) {
|
|
|
210
224
|
expiredCookieOptions(settings.options?.refreshToken)
|
|
211
225
|
);
|
|
212
226
|
}
|
|
213
|
-
|
|
227
|
+
|
|
228
|
+
// src/types.ts
|
|
229
|
+
var ResultError = class _ResultError extends Error {
|
|
230
|
+
statusCode;
|
|
231
|
+
error;
|
|
232
|
+
nextActions;
|
|
214
233
|
constructor(message, statusCode, error, nextActions) {
|
|
215
234
|
super(message);
|
|
216
|
-
this.name = "
|
|
235
|
+
this.name = "ResultError";
|
|
217
236
|
this.statusCode = statusCode;
|
|
218
237
|
this.error = error;
|
|
219
238
|
this.nextActions = nextActions;
|
|
220
239
|
}
|
|
221
240
|
static fromApiError(apiError) {
|
|
222
|
-
return new
|
|
241
|
+
return new _ResultError(
|
|
223
242
|
apiError.message,
|
|
224
243
|
apiError.statusCode,
|
|
225
244
|
apiError.error,
|
|
@@ -227,6 +246,131 @@ var InsForgeError = class _InsForgeError extends Error {
|
|
|
227
246
|
);
|
|
228
247
|
}
|
|
229
248
|
};
|
|
249
|
+
|
|
250
|
+
// src/types/api.ts
|
|
251
|
+
var ERROR_CODE_VALUES = [
|
|
252
|
+
// Auth
|
|
253
|
+
"AUTH_INVALID_EMAIL",
|
|
254
|
+
"AUTH_WEAK_PASSWORD",
|
|
255
|
+
"AUTH_INVALID_CREDENTIALS",
|
|
256
|
+
"AUTH_INVALID_API_KEY",
|
|
257
|
+
"AUTH_EMAIL_EXISTS",
|
|
258
|
+
"AUTH_USER_NOT_FOUND",
|
|
259
|
+
"AUTH_OAUTH_CONFIG_ALREADY_EXISTS",
|
|
260
|
+
"AUTH_OAUTH_CONFIG_ERROR",
|
|
261
|
+
"AUTH_OAUTH_CONFIG_NOT_FOUND",
|
|
262
|
+
"AUTH_UNSUPPORTED_PROVIDER",
|
|
263
|
+
"AUTH_TOKEN_EXPIRED",
|
|
264
|
+
"AUTH_UNAUTHORIZED",
|
|
265
|
+
"AUTH_NEED_VERIFICATION",
|
|
266
|
+
"AUTH_SIGNUP_DISABLED",
|
|
267
|
+
"AUTH_VERIFICATION_EMAIL_DELIVERY_FAILED",
|
|
268
|
+
// Database
|
|
269
|
+
"DATABASE_INVALID_PARAMETER",
|
|
270
|
+
"DATABASE_VALIDATION_ERROR",
|
|
271
|
+
"DATABASE_CONSTRAINT_VIOLATION",
|
|
272
|
+
"DATABASE_NOT_FOUND",
|
|
273
|
+
"DATABASE_DUPLICATE",
|
|
274
|
+
"DATABASE_MIGRATION_ALREADY_EXISTS",
|
|
275
|
+
"DATABASE_PERMISSION_DENIED",
|
|
276
|
+
"DATABASE_INTERNAL_ERROR",
|
|
277
|
+
"DATABASE_FORBIDDEN",
|
|
278
|
+
// Storage
|
|
279
|
+
"STORAGE_ALREADY_EXISTS",
|
|
280
|
+
"STORAGE_INVALID_PARAMETER",
|
|
281
|
+
"STORAGE_INVALID_FILE_TYPE",
|
|
282
|
+
"STORAGE_INSUFFICIENT_QUOTA",
|
|
283
|
+
"STORAGE_NOT_FOUND",
|
|
284
|
+
"STORAGE_PERMISSION_DENIED",
|
|
285
|
+
"S3_ACCESS_KEY_LIMIT_EXCEEDED",
|
|
286
|
+
"S3_ACCESS_KEY_NOT_FOUND",
|
|
287
|
+
"S3_PROTOCOL_UNAVAILABLE",
|
|
288
|
+
// Realtime
|
|
289
|
+
"REALTIME_CHANNEL_NOT_FOUND",
|
|
290
|
+
"REALTIME_CONNECTION_FAILED",
|
|
291
|
+
"REALTIME_INVALID_CHANNEL_REQUEST",
|
|
292
|
+
"REALTIME_INVALID_CHANNEL_PATTERN",
|
|
293
|
+
"REALTIME_INVALID_EVENT",
|
|
294
|
+
"REALTIME_NOT_SUBSCRIBED",
|
|
295
|
+
"REALTIME_UNAUTHORIZED",
|
|
296
|
+
// AI
|
|
297
|
+
"AI_INVALID_API_KEY",
|
|
298
|
+
"AI_INVALID_MODEL",
|
|
299
|
+
"AI_UPSTREAM_UNAVAILABLE",
|
|
300
|
+
// Analytics
|
|
301
|
+
"ANALYTICS_NOT_CONNECTED",
|
|
302
|
+
"ANALYTICS_UNAVAILABLE",
|
|
303
|
+
// Logs
|
|
304
|
+
"LOGS_AWS_NOT_CONFIGURED",
|
|
305
|
+
"LOG_NOT_FOUND",
|
|
306
|
+
// Compute
|
|
307
|
+
"COMPUTE_CLOUD_UNAVAILABLE",
|
|
308
|
+
"COMPUTE_NOT_CONFIGURED",
|
|
309
|
+
"COMPUTE_PROVIDER_ERROR",
|
|
310
|
+
"COMPUTE_SERVICE_NOT_FOUND",
|
|
311
|
+
"COMPUTE_MACHINE_NOT_FOUND",
|
|
312
|
+
"COMPUTE_SERVICE_NOT_CONFIGURED",
|
|
313
|
+
"COMPUTE_SERVICE_DEPLOY_FAILED",
|
|
314
|
+
"COMPUTE_SERVICE_ALREADY_EXISTS",
|
|
315
|
+
"COMPUTE_SERVICE_START_FAILED",
|
|
316
|
+
"COMPUTE_SERVICE_STOP_FAILED",
|
|
317
|
+
"COMPUTE_SERVICE_DELETE_FAILED",
|
|
318
|
+
"COMPUTE_REGION_CHANGE_NOT_SUPPORTED",
|
|
319
|
+
"COMPUTE_QUOTA_EXCEEDED",
|
|
320
|
+
// Billing
|
|
321
|
+
"BILLING_INSUFFICIENT_BALANCE",
|
|
322
|
+
// Email
|
|
323
|
+
"EMAIL_PROVIDER_NOT_CONFIGURED",
|
|
324
|
+
"EMAIL_SMTP_CONNECTION_FAILED",
|
|
325
|
+
"EMAIL_SMTP_SEND_FAILED",
|
|
326
|
+
"EMAIL_TEMPLATE_NOT_FOUND",
|
|
327
|
+
// Deployments
|
|
328
|
+
"DEPLOYMENT_ALREADY_EXISTS",
|
|
329
|
+
"DEPLOYMENT_INVALID_FILE",
|
|
330
|
+
"DEPLOYMENT_NOT_FOUND",
|
|
331
|
+
"DEPLOYMENT_UPLOAD_CANCELED",
|
|
332
|
+
"DOMAIN_ALREADY_EXISTS",
|
|
333
|
+
"DOMAIN_INVALID",
|
|
334
|
+
"DOMAIN_NOT_FOUND",
|
|
335
|
+
"ENVIRONMENT_VARIABLE_NOT_FOUND",
|
|
336
|
+
// Docs
|
|
337
|
+
"DOCS_NOT_FOUND",
|
|
338
|
+
// Functions
|
|
339
|
+
"FUNCTION_ALREADY_EXISTS",
|
|
340
|
+
"FUNCTION_DEPLOYMENT_NOT_FOUND",
|
|
341
|
+
"FUNCTION_NOT_FOUND",
|
|
342
|
+
// Schedules
|
|
343
|
+
"SCHEDULE_INVALID_CRON",
|
|
344
|
+
"SCHEDULE_NOT_FOUND",
|
|
345
|
+
// Payments
|
|
346
|
+
"PAYMENT_CHECKOUT_ALREADY_EXISTS",
|
|
347
|
+
"PAYMENT_CONFIG_INVALID",
|
|
348
|
+
"PAYMENT_CONFIG_NOT_FOUND",
|
|
349
|
+
"PAYMENT_NOT_FOUND",
|
|
350
|
+
"PAYMENT_METHOD_DECLINED",
|
|
351
|
+
"PAYMENT_PRICE_NOT_FOUND",
|
|
352
|
+
"PAYMENT_PRODUCT_NOT_FOUND",
|
|
353
|
+
// Secrets
|
|
354
|
+
"SECRET_ALREADY_EXISTS",
|
|
355
|
+
"SECRET_NOT_FOUND",
|
|
356
|
+
// General
|
|
357
|
+
"MISSING_FIELD",
|
|
358
|
+
"ALREADY_EXISTS",
|
|
359
|
+
"INVALID_INPUT",
|
|
360
|
+
"NOT_FOUND",
|
|
361
|
+
"UNKNOWN_ERROR",
|
|
362
|
+
"INTERNAL_ERROR",
|
|
363
|
+
"TOO_MANY_REQUESTS",
|
|
364
|
+
"FORBIDDEN",
|
|
365
|
+
"RATE_LIMITED",
|
|
366
|
+
"NOT_IMPLEMENTED",
|
|
367
|
+
"UPSTREAM_FAILURE"
|
|
368
|
+
];
|
|
369
|
+
var ERROR_CODES = Object.fromEntries(
|
|
370
|
+
ERROR_CODE_VALUES.map((code) => [code, code])
|
|
371
|
+
);
|
|
372
|
+
|
|
373
|
+
// src/ssr/refresh.ts
|
|
230
374
|
function jsonResponse(body, init = {}, headers = new Headers(init.headers)) {
|
|
231
375
|
headers.set("Content-Type", "application/json");
|
|
232
376
|
return new Response(JSON.stringify(body), {
|
|
@@ -235,18 +379,18 @@ function jsonResponse(body, init = {}, headers = new Headers(init.headers)) {
|
|
|
235
379
|
});
|
|
236
380
|
}
|
|
237
381
|
function normalizeError(error) {
|
|
238
|
-
if (error instanceof
|
|
382
|
+
if (error instanceof ResultError) {
|
|
239
383
|
return error;
|
|
240
384
|
}
|
|
241
385
|
if (error && typeof error === "object") {
|
|
242
386
|
const body = error;
|
|
243
|
-
return new
|
|
387
|
+
return new ResultError(
|
|
244
388
|
typeof body.message === "string" ? body.message : "Failed to refresh auth session",
|
|
245
389
|
typeof body.statusCode === "number" ? body.statusCode : 500,
|
|
246
390
|
typeof body.error === "string" ? body.error : ERROR_CODES.UNKNOWN_ERROR
|
|
247
391
|
);
|
|
248
392
|
}
|
|
249
|
-
return new
|
|
393
|
+
return new ResultError(
|
|
250
394
|
error instanceof Error ? error.message : "Failed to refresh auth session",
|
|
251
395
|
500,
|
|
252
396
|
ERROR_CODES.UNKNOWN_ERROR
|
|
@@ -268,14 +412,17 @@ function readRefreshToken(options) {
|
|
|
268
412
|
if (cookieValue) {
|
|
269
413
|
return cookieValue;
|
|
270
414
|
}
|
|
271
|
-
return getCookieValueFromHeader(
|
|
415
|
+
return getCookieValueFromHeader(
|
|
416
|
+
options.request?.headers.get("cookie"),
|
|
417
|
+
refreshCookieName
|
|
418
|
+
);
|
|
272
419
|
}
|
|
273
420
|
async function refreshAuth(options = {}) {
|
|
274
421
|
const headers = new Headers();
|
|
275
422
|
const refreshToken = readRefreshToken(options);
|
|
276
423
|
if (!refreshToken) {
|
|
277
424
|
clearAuthCookieHeaders(headers, options);
|
|
278
|
-
const error2 = new
|
|
425
|
+
const error2 = new ResultError(
|
|
279
426
|
"Refresh token cookie is missing",
|
|
280
427
|
401,
|
|
281
428
|
ERROR_CODES.AUTH_UNAUTHORIZED
|
|
@@ -298,18 +445,20 @@ async function refreshAuth(options = {}) {
|
|
|
298
445
|
}
|
|
299
446
|
let { baseUrl, anonKey } = options;
|
|
300
447
|
try {
|
|
301
|
-
baseUrl
|
|
302
|
-
anonKey
|
|
448
|
+
baseUrl ||= process.env.NEXT_PUBLIC_BACKEND_URL;
|
|
449
|
+
anonKey ||= process.env.NEXT_PUBLIC_BACKEND_ANON_KEY;
|
|
303
450
|
} catch {
|
|
304
451
|
}
|
|
305
452
|
if (!baseUrl || !anonKey) {
|
|
306
453
|
throw new Error(
|
|
307
|
-
"Missing
|
|
454
|
+
"Missing Result baseUrl or anonKey. Pass baseUrl and anonKey to refreshAuth() or set NEXT_PUBLIC_BACKEND_URL and NEXT_PUBLIC_BACKEND_ANON_KEY."
|
|
308
455
|
);
|
|
309
456
|
}
|
|
310
457
|
const fetchImpl = options.fetch ?? (globalThis.fetch ? globalThis.fetch.bind(globalThis) : void 0);
|
|
311
458
|
if (!fetchImpl) {
|
|
312
|
-
throw new Error(
|
|
459
|
+
throw new Error(
|
|
460
|
+
"Fetch is not available. Please provide a fetch implementation."
|
|
461
|
+
);
|
|
313
462
|
}
|
|
314
463
|
const requestHeaders = new Headers(options.headers);
|
|
315
464
|
requestHeaders.set("Authorization", `Bearer ${anonKey}`);
|
|
@@ -382,6 +531,8 @@ async function refreshAuth(options = {}) {
|
|
|
382
531
|
error: null
|
|
383
532
|
};
|
|
384
533
|
}
|
|
534
|
+
|
|
535
|
+
// src/ssr/update-session.ts
|
|
385
536
|
async function updateSession(options) {
|
|
386
537
|
const accessCookieName = getAccessTokenCookieName(options.names);
|
|
387
538
|
const refreshCookieName = getRefreshTokenCookieName(options.names);
|
|
@@ -393,7 +544,10 @@ async function updateSession(options) {
|
|
|
393
544
|
error: null
|
|
394
545
|
};
|
|
395
546
|
}
|
|
396
|
-
const refreshToken = getCookieValue(
|
|
547
|
+
const refreshToken = getCookieValue(
|
|
548
|
+
options.requestCookies,
|
|
549
|
+
refreshCookieName
|
|
550
|
+
);
|
|
397
551
|
if (!refreshToken) {
|
|
398
552
|
if (accessToken) {
|
|
399
553
|
clearAuthCookies(options.requestCookies, options);
|