@absolutejs/auth 0.79.0 → 0.80.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.
@@ -0,0 +1,12 @@
1
+ import { runMigrations } from '../migrations';
2
+ /** A missing or unknown selection must never silently become ephemeral storage. */
3
+ export declare const setupStorage: (configuration: unknown) => "memory" | "neon";
4
+ export declare const runSetup: ({ configuration, databaseUrl, migrate, log }?: {
5
+ configuration?: unknown;
6
+ databaseUrl?: string;
7
+ migrate?: typeof runMigrations;
8
+ log?: (message: string) => void;
9
+ }) => Promise<{
10
+ migrated: boolean;
11
+ storage: string;
12
+ }>;
package/dist/index.d.ts CHANGED
@@ -4209,7 +4209,7 @@ export { readSessionCookie } from './session/cookieReader';
4209
4209
  export { AuthIdentityConflictError } from './errors';
4210
4210
  export { sessionStore } from './session/state';
4211
4211
  export { createInMemoryAuthSessionStore } from './session/inMemoryStore';
4212
- export { createNeonAuthSessionStore } from './session/neonStore';
4212
+ export { createNeonAuthSessionStore, createPostgresAuthSessionStore } from './session/neonStore';
4213
4213
  export { providersFromEnv, type ProviderSelection } from './providersFromEnv';
4214
4214
  export { createRedisAuthSessionStore, type RedisSessionClient } from './session/redisStore';
4215
4215
  export { createLinkedProviderCredentialResolver, type CreateLinkedProviderCredentialResolverOptions, type LinkedProviderRefreshResult } from './linkedProviders/resolver';
package/dist/index.js CHANGED
@@ -25793,10 +25793,9 @@ var toUnregisteredSessionData = (row) => ({
25793
25793
  sessionInformation: cloneRecord(row.session_information_json ?? undefined),
25794
25794
  userIdentity: cloneRecord(row.user_identity_json ?? undefined)
25795
25795
  });
25796
- var createNeonAuthSessionStore = (databaseUrl, decodeUser) => {
25797
- const sql2 = as(databaseUrl);
25798
- const db = drizzle({ client: sql2 });
25799
- return {
25796
+ var createNeonAuthSessionStore = (databaseUrl, decodeUser) => createPostgresAuthSessionStore(drizzle({ client: as(databaseUrl) }), decodeUser);
25797
+ var createPostgresAuthSessionStore = (db, decodeUser) => {
25798
+ const store = {
25800
25799
  deleteExpired: async () => {
25801
25800
  const rows = await db.delete(authSessionsTable).where(lt(authSessionsTable.expires_at_ms, Date.now())).returning({ id: authSessionsTable.id });
25802
25801
  return rows.length;
@@ -25874,6 +25873,7 @@ var createNeonAuthSessionStore = (databaseUrl, decodeUser) => {
25874
25873
  });
25875
25874
  }
25876
25875
  };
25876
+ return store;
25877
25877
  };
25878
25878
  // src/providersFromEnv.ts
25879
25879
  var envKey = (provider, suffix) => `${provider.replace(/[^a-zA-Z0-9]/g, "_").toUpperCase()}_${suffix}`;
@@ -33970,6 +33970,30 @@ var createRedisAuthSessionStore = (redis, decodeUser, keyPrefix = "auth:session:
33970
33970
  }
33971
33971
  };
33972
33972
  };
33973
+ // src/linkedProviders/credentialError.ts
33974
+ class LinkedProviderCredentialError extends Error {
33975
+ code;
33976
+ recovery;
33977
+ constructor(code, recovery, message, cause) {
33978
+ super(message, { cause });
33979
+ this.code = code;
33980
+ this.recovery = recovery;
33981
+ this.name = "LinkedProviderCredentialError";
33982
+ }
33983
+ }
33984
+ var credentialRefreshError = (error2) => {
33985
+ if (error2 instanceof LinkedProviderCredentialError)
33986
+ return error2;
33987
+ const message = error2 instanceof Error ? error2.message : "";
33988
+ if (/\binvalid_grant\b/.test(message)) {
33989
+ return new LinkedProviderCredentialError("invalid_grant", "reconnect", "Authorization has expired or was revoked. Reconnect your account.", error2);
33990
+ }
33991
+ if (/\b(invalid_client|unauthorized_client)\b/.test(message)) {
33992
+ return new LinkedProviderCredentialError("invalid_client", "configuration", "The provider connection is misconfigured. Contact support.", error2);
33993
+ }
33994
+ return new LinkedProviderCredentialError("refresh_failed", "retry", "The provider could not refresh the connection. Try again.", error2);
33995
+ };
33996
+
33973
33997
  // src/linkedProviders/resolver.ts
33974
33998
  var uniqueStrings = (values) => [...new Set(values)];
33975
33999
  var getEffectiveScopes = (grant, binding) => {
@@ -34067,6 +34091,30 @@ var resolveBindingCredential = async (grantStore, binding, input) => {
34067
34091
  }
34068
34092
  return buildResolvedCredential(grant, binding);
34069
34093
  };
34094
+ var refreshAndRecord = async (grant, input, refresh2, grantStore, now) => {
34095
+ let refreshed;
34096
+ try {
34097
+ const result = await refresh2(grant, input);
34098
+ if (!result)
34099
+ throw new Error("Linked provider access token refresh failed");
34100
+ refreshed = result;
34101
+ } catch (cause) {
34102
+ const error2 = credentialRefreshError(cause);
34103
+ await grantStore.saveGrant({
34104
+ ...grant,
34105
+ lastRefreshError: error2.message,
34106
+ metadata: { ...grant.metadata, credentialFailureCode: error2.code, credentialRecovery: error2.recovery },
34107
+ status: "refresh_required",
34108
+ updatedAt: now()
34109
+ });
34110
+ throw error2;
34111
+ }
34112
+ const metadata = { ...refreshed.grant.metadata };
34113
+ delete metadata.credentialRecovery;
34114
+ delete metadata.credentialFailureCode;
34115
+ await grantStore.saveGrant({ ...refreshed.grant, lastRefreshError: undefined, metadata });
34116
+ return refreshed;
34117
+ };
34070
34118
  var createLinkedProviderCredentialResolver = ({
34071
34119
  grantStore,
34072
34120
  bindingStore,
@@ -34096,11 +34144,7 @@ var createLinkedProviderCredentialResolver = ({
34096
34144
  if (!refreshAccessTokenLease) {
34097
34145
  throw new Error("Linked provider access token lease requires refresh");
34098
34146
  }
34099
- const refreshed = await refreshAccessTokenLease(grant, input);
34100
- if (!refreshed) {
34101
- throw new Error("Linked provider access token refresh failed");
34102
- }
34103
- await grantStore.saveGrant(refreshed.grant);
34147
+ const refreshed = await refreshAndRecord(grant, input, refreshAccessTokenLease, grantStore, now);
34104
34148
  ({ lease } = refreshed);
34105
34149
  }
34106
34150
  if (!lease) {
@@ -34193,8 +34237,11 @@ var createOAuthLinkedProviderCredentialResolver = async ({
34193
34237
  tokenType: grant.tokenType
34194
34238
  } : null,
34195
34239
  refreshAccessTokenLease: async (grant) => {
34196
- if (!isValidProviderOption(grant.authProviderKey) || !grant.refreshTokenCiphertext) {
34197
- return null;
34240
+ if (!grant.refreshTokenCiphertext) {
34241
+ throw new LinkedProviderCredentialError("missing_refresh_token", "reconnect", "Authorization cannot renew automatically. Reconnect your account.");
34242
+ }
34243
+ if (!isValidProviderOption(grant.authProviderKey)) {
34244
+ throw new LinkedProviderCredentialError("unsupported_provider", "configuration", "This provider cannot renew the connection. Contact support.");
34198
34245
  }
34199
34246
  const providerKey = grant.authProviderKey;
34200
34247
  const providerClientName = typeof grant.metadata?.providerClient === "string" && grant.metadata.providerClient.trim().length > 0 ? grant.metadata.providerClient.trim() : undefined;
@@ -34204,11 +34251,11 @@ var createOAuthLinkedProviderCredentialResolver = async ({
34204
34251
  providersConfiguration
34205
34252
  });
34206
34253
  if ("error" in resolvedProviderClientConfiguration || !resolvedProviderClientConfiguration.config) {
34207
- return null;
34254
+ throw new LinkedProviderCredentialError("provider_configuration", "configuration", "The provider connection is misconfigured. Contact support.");
34208
34255
  }
34209
34256
  const providerClient = await createOAuth2Client(providerKey, resolvedProviderClientConfiguration.config.credentials);
34210
34257
  if (!providerClient || !isRefreshableOAuth2Client(providerKey, providerClient)) {
34211
- return null;
34258
+ throw new LinkedProviderCredentialError("unsupported_refresh", "configuration", "This provider cannot renew the connection. Contact support.");
34212
34259
  }
34213
34260
  const tokenResponse2 = await providerClient.refreshAccessToken(grant.refreshTokenCiphertext);
34214
34261
  const refreshedAt = Date.now();
@@ -41145,6 +41192,7 @@ export {
41145
41192
  createPostgresApiClientStore,
41146
41193
  createPostgresApiKeyStore,
41147
41194
  createPostgresAuditSink,
41195
+ createPostgresAuthSessionStore,
41148
41196
  createPostgresAuthorizationCodeStore,
41149
41197
  createPostgresBackchannelAuthStore,
41150
41198
  createPostgresClientAssertionJtiStore,
@@ -41457,5 +41505,5 @@ export {
41457
41505
  writeWarrant
41458
41506
  };
41459
41507
 
41460
- //# debugId=7BA88CF5784F986664756E2164756E21
41508
+ //# debugId=637E1C97D77705DC64756E2164756E21
41461
41509
  //# sourceMappingURL=index.js.map