@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.
@@ -1,11 +1,10 @@
1
- import {
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(normalized.length + (4 - normalized.length % 4) % 4, "=");
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
- var DEFAULT_ACCESS_TOKEN_COOKIE = "insforge_access_token";
42
- var DEFAULT_REFRESH_TOKEN_COOKIE = "insforge_refresh_token";
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 { expires: _expires, maxAge: _maxAge, ...safeOverrides } = overrides ?? {};
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(tokens.accessToken, settings.options?.accessToken);
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(tokens.refreshToken, settings.options?.refreshToken)
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(tokens.refreshToken, settings.options?.refreshToken)
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
- var InsForgeError = class _InsForgeError extends Error {
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 = "InsForgeError";
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 _InsForgeError(
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 InsForgeError) {
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 InsForgeError(
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 InsForgeError(
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(options.request?.headers.get("cookie"), refreshCookieName);
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 InsForgeError(
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 || (baseUrl = process.env.NEXT_PUBLIC_INSFORGE_URL);
302
- anonKey || (anonKey = process.env.NEXT_PUBLIC_INSFORGE_ANON_KEY);
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 InsForge baseUrl or anonKey. Pass baseUrl and anonKey to refreshAuth() or set NEXT_PUBLIC_INSFORGE_URL and NEXT_PUBLIC_INSFORGE_ANON_KEY."
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("Fetch is not available. Please provide a fetch implementation.");
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(options.requestCookies, refreshCookieName);
547
+ const refreshToken = getCookieValue(
548
+ options.requestCookies,
549
+ refreshCookieName
550
+ );
397
551
  if (!refreshToken) {
398
552
  if (accessToken) {
399
553
  clearAuthCookies(options.requestCookies, options);