alepha 0.20.2 → 0.20.4
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 +0 -1
- package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
- package/assets/swagger-ui/swagger-ui.css +1 -1
- package/dist/api/audits/index.browser.js +49 -0
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.js +49 -0
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.d.ts +2 -61
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +4 -4
- package/dist/api/keys/index.js.map +1 -1
- package/dist/api/notifications/index.d.ts +1 -10
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/parameters/index.browser.js +37 -0
- package/dist/api/parameters/index.browser.js.map +1 -1
- package/dist/api/parameters/index.d.ts +12 -68
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +57 -4
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/payments/index.js.map +1 -1
- package/dist/api/users/index.browser.js +6 -0
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +148 -227
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +60 -14
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +2 -1
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/bucket/index.d.ts +77 -107
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +153 -5
- package/dist/bucket/index.js.map +1 -1
- package/dist/bucket/index.workerd.js +12 -2
- package/dist/bucket/index.workerd.js.map +1 -1
- package/dist/cache/core/index.d.ts +26 -0
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js +11 -1
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js +11 -1
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/captcha/index.js.map +1 -1
- package/dist/cli/config/index.d.ts +7 -5
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +2 -3
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +637 -11660
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +707 -532
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +4 -8
- package/dist/cli/devtools/index.d.ts.map +1 -1
- package/dist/cli/devtools/index.js +20 -16
- package/dist/cli/devtools/index.js.map +1 -1
- package/dist/cli/platform/index.d.ts +51 -77
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +65 -15
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +10 -13
- package/dist/cli/vendor/index.d.ts.map +1 -1
- package/dist/cli/vendor/index.js +30 -12
- package/dist/cli/vendor/index.js.map +1 -1
- package/dist/command/index.js +1 -1
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +27 -3
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +8 -11
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +27 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +27 -3
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +27 -3
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.js.map +1 -1
- package/dist/datetime/index.d.ts +69 -10
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/datetime/index.js +135 -13
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/smtp/index.js +130 -16
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +30 -2
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +35 -12
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.js.map +1 -1
- package/dist/logger/index.js +32 -1
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +238 -31
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +198 -67
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +2 -362
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +18 -409
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +41 -194
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +27 -422
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.bun.js +17 -20
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +1 -5
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js +17 -20
- package/dist/orm/postgres/index.js.map +1 -1
- package/dist/react/core/index.d.ts +102 -1
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +65 -1
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +6 -0
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/form/index.js +7 -7
- package/dist/react/form/index.js.map +1 -1
- package/dist/react/i18n/index.d.ts +7 -1
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/i18n/index.js +6 -0
- package/dist/react/i18n/index.js.map +1 -1
- package/dist/react/intro/index.js +22 -17
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +98 -4
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +58 -5
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +122 -6
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/testing/{chunk-DBEY4PJZ.js → chunk-6Ep1yQYe.js} +1 -1
- package/dist/react/testing/index.js +1 -1
- package/dist/react/testing/index.js.map +1 -1
- package/dist/react/ui/index.d.ts +195 -1
- package/dist/react/ui/index.d.ts.map +1 -1
- package/dist/react/ui/index.js +64 -1
- package/dist/react/ui/index.js.map +1 -1
- package/dist/react/websocket/index.js.map +1 -1
- package/dist/redis/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +1 -2
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +1 -1
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +1 -1
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +2 -2
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +24 -10
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.browser.js +10 -3
- package/dist/server/core/index.browser.js.map +1 -1
- package/dist/server/core/index.d.ts +1 -4
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +47 -9
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.js +19 -1
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +4 -5
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.browser.js.map +1 -1
- package/dist/system/index.js.map +1 -1
- package/dist/system/index.workerd.js.map +1 -1
- package/dist/topic/core/index.js.map +1 -1
- package/dist/websocket/index.browser.js +32 -5
- package/dist/websocket/index.browser.js.map +1 -1
- package/dist/websocket/index.d.ts +3 -1
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +42 -6
- package/dist/websocket/index.js.map +1 -1
- package/package.json +685 -274
- package/src/api/files/__tests__/FileController.spec.ts +1 -1
- package/src/api/jobs/__tests__/$job.spec.ts +5 -1
- package/src/api/parameters/services/ParameterProvider.ts +21 -4
- package/src/api/users/__tests__/SessionService.spec.ts +99 -0
- package/src/api/users/__tests__/UserJobs.spec.ts +67 -0
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +15 -0
- package/src/api/users/entities/sessions.ts +6 -0
- package/src/api/users/jobs/UserJobs.ts +44 -17
- package/src/api/users/providers/RealmProvider.ts +4 -0
- package/src/api/users/schemas/userQuerySchema.ts +0 -1
- package/src/api/users/services/SessionService.ts +27 -0
- package/src/api/users/services/UserService.ts +1 -5
- package/src/api/verifications/__tests__/CodeVerification.spec.ts +14 -0
- package/src/api/verifications/__tests__/LinkVerification.spec.ts +14 -0
- package/src/api/verifications/services/VerificationService.ts +1 -0
- package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +74 -0
- package/src/bucket/index.ts +19 -2
- package/src/bucket/primitives/$bucket.ts +9 -1
- package/src/bucket/providers/CloudflareR2Provider.ts +2 -137
- package/src/bucket/providers/NodeS3BucketProvider.ts +218 -0
- package/src/cache/core/index.ts +29 -0
- package/src/cache/core/primitives/$cache.ts +14 -1
- package/src/cli/config/defineConfig.ts +13 -15
- package/src/cli/core/__tests__/init.spec.ts +214 -7
- package/src/cli/core/commands/init.ts +12 -0
- package/src/cli/core/services/PackageManagerUtils.ts +23 -6
- package/src/cli/core/services/ProjectScaffolder.ts +315 -33
- package/src/cli/core/tasks/BuildCloudflareTask.ts +5 -0
- package/src/cli/core/tasks/BuildDockerTask.ts +9 -10
- package/src/cli/core/tasks/BuildServerTask.ts +8 -0
- package/src/cli/core/templates/agentMd.ts +2 -10
- package/src/cli/core/templates/apiIndexTs.ts +23 -1
- package/src/cli/core/templates/componentsJsonTs.ts +39 -0
- package/src/cli/core/templates/mainCss.ts +1 -0
- package/src/cli/core/templates/saasAdminLayoutTsx.ts +77 -0
- package/src/cli/core/templates/saasAdminPagesTsx.ts +26 -0
- package/src/cli/core/templates/saasAuthLayoutTsx.ts +20 -0
- package/src/cli/core/templates/saasAuthPagesTsx.ts +62 -0
- package/src/cli/core/templates/saasRealmProviderTs.ts +46 -0
- package/src/cli/core/templates/webAppRouterTs.ts +104 -1
- package/src/cli/core/templates/webIndexTs.ts +23 -1
- package/src/cli/devtools/index.ts +12 -26
- package/src/cli/platform/__tests__/SecretsCommand.spec.ts +2 -0
- package/src/cli/platform/index.ts +15 -24
- package/src/cli/vendor/atoms/vendorOptions.ts +1 -1
- package/src/cli/vendor/index.ts +14 -23
- package/src/command/providers/CliProvider.ts +1 -1
- package/src/core/Alepha.ts +11 -1
- package/src/core/helpers/ref.ts +18 -0
- package/src/core/index.shared.ts +1 -0
- package/src/core/interfaces/Service.ts +3 -1
- package/src/core/providers/SchemaValidator.ts +9 -1
- package/src/core/providers/TypeProvider.ts +2 -3
- package/src/datetime/REFACTORING.md +118 -0
- package/src/datetime/providers/DateTimeProvider.ts +203 -24
- package/src/lock/core/index.ts +31 -0
- package/src/lock/core/primitives/$lock.ts +14 -1
- package/src/logger/services/Logger.ts +1 -1
- package/src/mcp/__tests__/$resource.spec.ts +1 -1
- package/src/mcp/__tests__/$tool.spec.ts +1 -1
- package/src/mcp/__tests__/McpServerProvider.spec.ts +1 -1
- package/src/mcp/__tests__/jsonrpc.spec.ts +1 -1
- package/src/mcp/helpers/jsonrpc.ts +26 -1
- package/src/mcp/index.ts +10 -5
- package/src/mcp/interfaces/McpTypes.ts +83 -6
- package/src/mcp/primitives/$prompt.ts +18 -1
- package/src/mcp/primitives/$resource.ts +18 -1
- package/src/mcp/primitives/$tool.ts +83 -7
- package/src/mcp/providers/McpServerProvider.ts +74 -16
- package/src/mcp/transports/StreamableHttpMcpTransport.ts +226 -0
- package/src/orm/REFACTORING.md +330 -0
- package/src/orm/__tests__/$repository-tests.ts +1 -0
- package/src/orm/__tests__/orm-next-tests.ts +2 -67
- package/src/orm/__tests__/orm-next.spec.ts +0 -21
- package/src/orm/core/index.shared.ts +0 -2
- package/src/orm/core/index.ts +1 -2
- package/src/orm/core/primitives/$repository.ts +3 -6
- package/src/orm/core/primitives/$transactional.ts +11 -0
- package/src/orm/core/providers/drivers/DatabaseProvider.ts +0 -5
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +11 -13
- package/src/orm/core/schemas/updateSchema.ts +1 -1
- package/src/orm/core/services/ModelBuilder.ts +1 -13
- package/src/orm/core/services/PgRelationManager.ts +4 -2
- package/src/orm/core/services/Repository.ts +1 -42
- package/src/orm/core/services/SqliteModelBuilder.ts +2 -33
- package/src/orm/postgres/services/PostgresModelBuilder.ts +10 -45
- package/src/react/core/__tests__/useQuery.browser.spec.tsx +86 -0
- package/src/react/core/hooks/useQuery.ts +153 -0
- package/src/react/core/index.ts +1 -0
- package/src/react/form/services/FormModel.ts +15 -6
- package/src/react/form/services/parseField.ts +8 -0
- package/src/react/i18n/providers/I18nProvider.ts +8 -2
- package/src/react/intro/components/GettingStartedAuthSlide.tsx +11 -4
- package/src/react/router/__tests__/$page.spec.tsx +0 -16
- package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +213 -2
- package/src/react/router/__tests__/ssr.spec.tsx +339 -0
- package/src/react/router/primitives/$page.ts +28 -4
- package/src/react/router/providers/ReactBrowserProvider.ts +73 -0
- package/src/react/router/providers/ReactBrowserRouterProvider.ts +1 -1
- package/src/react/router/providers/ReactPageProvider.ts +27 -9
- package/src/react/router/providers/ReactPreloadProvider.ts +1 -1
- package/src/react/router/providers/ReactServerProvider.ts +1 -0
- package/src/react/ui/atoms/uiThemeListAtom.ts +36 -0
- package/src/react/ui/index.ts +6 -0
- package/src/react/ui/services/SchemaControl.ts +209 -0
- package/src/scheduler/providers/CronProvider.ts +1 -1
- package/src/security/primitives/$basicAuth.ts +1 -1
- package/src/security/primitives/$issuer.ts +6 -3
- package/src/server/auth/providers/ServerAuthProvider.ts +5 -1
- package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +75 -0
- package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +306 -0
- package/src/server/core/errors/ValidationError.ts +13 -1
- package/src/server/core/interfaces/ServerRequest.ts +1 -0
- package/src/server/core/primitives/$action.ts +16 -5
- package/src/server/core/providers/ServerProvider.ts +1 -1
- package/src/server/core/providers/ServerRouterProvider.ts +28 -6
- package/src/server/core/services/HttpClient.ts +1 -1
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +6 -8
- package/src/websocket/providers/NodeWebSocketServerProvider.ts +10 -4
- package/src/websocket/services/WebSocketClient.ts +11 -5
- package/src/mcp/transports/SseMcpTransport.ts +0 -182
- package/src/orm/core/__tests__/parseQueryString.spec.ts +0 -196
- package/src/orm/core/helpers/parseQueryString.ts +0 -502
- package/src/orm/core/primitives/$view.ts +0 -88
package/dist/api/users/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import { AuditService } from "alepha/api/audits";
|
|
|
3
3
|
import { $bucket } from "alepha/bucket";
|
|
4
4
|
import { $issuer, $permission, $secure, CryptoProvider, InvalidCredentialsError, SecurityProvider } from "alepha/security";
|
|
5
5
|
import { $action, BadRequestError, ConflictError, HttpError, UnauthorizedError, okSchema } from "alepha/server";
|
|
6
|
-
import { $entity, $repository, db, pageQuerySchema,
|
|
6
|
+
import { $entity, $repository, db, pageQuerySchema, sql } from "alepha/orm";
|
|
7
7
|
import { $logger } from "alepha/logger";
|
|
8
8
|
import { $client } from "alepha/server/links";
|
|
9
9
|
import { $notification } from "alepha/api/notifications";
|
|
@@ -202,7 +202,11 @@ const realmAuthSettingsAtom = $atom({
|
|
|
202
202
|
default: 900 * 1e3,
|
|
203
203
|
minimum: 1e3
|
|
204
204
|
})
|
|
205
|
-
})
|
|
205
|
+
}),
|
|
206
|
+
refreshToken: t.object({ expirationIdle: t.optional(t.integer({
|
|
207
|
+
description: "Maximum time in milliseconds a refresh token may stay unused before being invalidated. When set, sessions whose last refresh is older than this window are rejected and deleted, even if the absolute `expiresAt` has not been reached. Recommended for SaaS auth posture (SOC2/ISO27001). Leave undefined to disable idle invalidation (default).",
|
|
208
|
+
minimum: 1e3
|
|
209
|
+
})) })
|
|
206
210
|
}),
|
|
207
211
|
default: {
|
|
208
212
|
registrationAllowed: true,
|
|
@@ -229,7 +233,8 @@ const realmAuthSettingsAtom = $atom({
|
|
|
229
233
|
ipMaxAttempts: 15,
|
|
230
234
|
accountMaxAttempts: 5,
|
|
231
235
|
windowMs: 900 * 1e3
|
|
232
|
-
}
|
|
236
|
+
},
|
|
237
|
+
refreshToken: {}
|
|
233
238
|
}
|
|
234
239
|
});
|
|
235
240
|
//#endregion
|
|
@@ -244,6 +249,12 @@ const sessions = $entity({
|
|
|
244
249
|
refreshToken: t.uuid(),
|
|
245
250
|
userId: db.ref(t.uuid(), () => users.cols.id),
|
|
246
251
|
expiresAt: t.datetime(),
|
|
252
|
+
/**
|
|
253
|
+
* Last time the session was used to refresh an access token.
|
|
254
|
+
* Used by realm `refreshToken.expirationIdle` to invalidate idle sessions.
|
|
255
|
+
* `null` on existing rows pre-migration — falls back to `createdAt`.
|
|
256
|
+
*/
|
|
257
|
+
lastUsedAt: t.optional(t.datetime()),
|
|
247
258
|
ip: t.optional(t.text()),
|
|
248
259
|
userAgent: t.optional(t.object({
|
|
249
260
|
os: t.text(),
|
|
@@ -300,6 +311,10 @@ var RealmProvider = class {
|
|
|
300
311
|
loginRateLimit: {
|
|
301
312
|
...realmAuthSettingsAtom.options.default.loginRateLimit,
|
|
302
313
|
...realmOptions.settings?.loginRateLimit
|
|
314
|
+
},
|
|
315
|
+
refreshToken: {
|
|
316
|
+
...realmAuthSettingsAtom.options.default.refreshToken,
|
|
317
|
+
...realmOptions.settings?.refreshToken
|
|
303
318
|
}
|
|
304
319
|
},
|
|
305
320
|
features,
|
|
@@ -628,8 +643,7 @@ const userQuerySchema = t.extend(pageQuerySchema, {
|
|
|
628
643
|
email: t.optional(t.string()),
|
|
629
644
|
enabled: t.optional(t.boolean()),
|
|
630
645
|
emailVerified: t.optional(t.boolean()),
|
|
631
|
-
roles: t.optional(t.array(t.string()))
|
|
632
|
-
query: t.optional(t.text())
|
|
646
|
+
roles: t.optional(t.array(t.string()))
|
|
633
647
|
});
|
|
634
648
|
//#endregion
|
|
635
649
|
//#region ../../src/api/users/schemas/userResourceSchema.ts
|
|
@@ -940,7 +954,6 @@ var UserService = class {
|
|
|
940
954
|
if (q.enabled !== void 0) where.enabled = { eq: q.enabled };
|
|
941
955
|
if (q.emailVerified !== void 0) where.emailVerified = { eq: q.emailVerified };
|
|
942
956
|
if (q.roles) where.roles = { arrayContains: q.roles };
|
|
943
|
-
if (q.query) Object.assign(where, parseQueryString(q.query));
|
|
944
957
|
const result = await this.users(userRealmName).paginate(q, { where }, { count: true });
|
|
945
958
|
this.log.debug("Users found", {
|
|
946
959
|
count: result.content.length,
|
|
@@ -2104,10 +2117,18 @@ var UserJobs = class {
|
|
|
2104
2117
|
log = $logger();
|
|
2105
2118
|
dateTimeProvider = $inject(DateTimeProvider);
|
|
2106
2119
|
sessionRepository = $repository(sessions);
|
|
2120
|
+
realmProvider = $inject(RealmProvider);
|
|
2107
2121
|
/**
|
|
2108
2122
|
* Purge expired sessions from the database.
|
|
2109
2123
|
*
|
|
2110
|
-
* Runs hourly (at :00) and deletes
|
|
2124
|
+
* Runs hourly (at :00) and deletes:
|
|
2125
|
+
* - sessions whose absolute `expiresAt` has passed
|
|
2126
|
+
* - sessions whose `lastUsedAt` exceeds the realm's `refreshToken.expirationIdle`
|
|
2127
|
+
* (when configured). Falls back to `createdAt` for sessions without a
|
|
2128
|
+
* recorded `lastUsedAt`.
|
|
2129
|
+
*
|
|
2130
|
+
* The idle sweep is best-effort cleanup — runtime enforcement happens in
|
|
2131
|
+
* `SessionService.refreshSession()`.
|
|
2111
2132
|
*/
|
|
2112
2133
|
purgeExpiredSessions = $job({
|
|
2113
2134
|
name: "api:users:purgeExpiredSessions",
|
|
@@ -2115,14 +2136,22 @@ var UserJobs = class {
|
|
|
2115
2136
|
handler: async () => {
|
|
2116
2137
|
const now = this.dateTimeProvider.nowISOString();
|
|
2117
2138
|
this.log.info("Starting expired sessions purge", { cutoffTime: now });
|
|
2118
|
-
const
|
|
2119
|
-
if (
|
|
2120
|
-
|
|
2121
|
-
|
|
2139
|
+
const absoluteDeletedIds = await this.sessionRepository.deleteMany({ expiresAt: { lt: now } });
|
|
2140
|
+
if (absoluteDeletedIds.length > 0) this.log.info("Expired sessions purged (absolute)", { deletedCount: absoluteDeletedIds.length });
|
|
2141
|
+
const idleMs = (await this.realmProvider.getRealm().getSettings()).refreshToken?.expirationIdle;
|
|
2142
|
+
if (idleMs && idleMs > 0) {
|
|
2143
|
+
const cutoff = this.dateTimeProvider.now().subtract(idleMs, "milliseconds").toISOString();
|
|
2144
|
+
const lastUsedDeletedIds = await this.sessionRepository.deleteMany({ lastUsedAt: { lt: cutoff } });
|
|
2145
|
+
const fallbackDeletedIds = await this.sessionRepository.deleteMany({
|
|
2146
|
+
lastUsedAt: { isNull: true },
|
|
2147
|
+
createdAt: { lt: cutoff }
|
|
2148
|
+
});
|
|
2149
|
+
const idleTotal = lastUsedDeletedIds.length + fallbackDeletedIds.length;
|
|
2150
|
+
if (idleTotal > 0) this.log.info("Expired sessions purged (idle)", {
|
|
2151
|
+
deletedCount: idleTotal,
|
|
2152
|
+
thresholdMs: idleMs
|
|
2153
|
+
});
|
|
2122
2154
|
}
|
|
2123
|
-
this.log.info("Found expired sessions", { count: expiredSessions.length });
|
|
2124
|
-
const deletedIds = await this.sessionRepository.deleteMany({ expiresAt: { lt: now } });
|
|
2125
|
-
this.log.info("Expired sessions purged successfully", { deletedCount: deletedIds.length });
|
|
2126
2155
|
}
|
|
2127
2156
|
});
|
|
2128
2157
|
};
|
|
@@ -2453,6 +2482,7 @@ var SessionService = class SessionService {
|
|
|
2453
2482
|
const session = await this.sessions(userRealmName).create({
|
|
2454
2483
|
userId: user.id,
|
|
2455
2484
|
expiresAt,
|
|
2485
|
+
lastUsedAt: this.dateTimeProvider.nowISOString(),
|
|
2456
2486
|
ip: request?.ip,
|
|
2457
2487
|
userAgent: request?.userAgent,
|
|
2458
2488
|
refreshToken
|
|
@@ -2480,6 +2510,21 @@ var SessionService = class SessionService {
|
|
|
2480
2510
|
await this.sessions(userRealmName).deleteById(session.id);
|
|
2481
2511
|
throw new UnauthorizedError("Session expired");
|
|
2482
2512
|
}
|
|
2513
|
+
const idleMs = (await this.realmProvider.getRealm(userRealmName).getSettings()).refreshToken?.expirationIdle;
|
|
2514
|
+
if (idleMs && idleMs > 0) {
|
|
2515
|
+
const lastUsedRef = session.lastUsedAt ?? session.createdAt;
|
|
2516
|
+
const idleSince = now.diff(this.dateTimeProvider.of(lastUsedRef));
|
|
2517
|
+
if (idleSince > idleMs) {
|
|
2518
|
+
this.log.info("Session expired (idle timeout)", {
|
|
2519
|
+
sessionId: session.id,
|
|
2520
|
+
userId: session.userId,
|
|
2521
|
+
idleMs: idleSince,
|
|
2522
|
+
thresholdMs: idleMs
|
|
2523
|
+
});
|
|
2524
|
+
await this.sessions(userRealmName).deleteById(session.id);
|
|
2525
|
+
throw new UnauthorizedError("Session expired");
|
|
2526
|
+
}
|
|
2527
|
+
}
|
|
2483
2528
|
const user = await this.users(userRealmName).getOne({ where: { id: { eq: session.userId } } });
|
|
2484
2529
|
if (!user.enabled) {
|
|
2485
2530
|
this.log.warn("Session refresh for disabled account", {
|
|
@@ -2490,6 +2535,7 @@ var SessionService = class SessionService {
|
|
|
2490
2535
|
throw new UnauthorizedError("Account disabled");
|
|
2491
2536
|
}
|
|
2492
2537
|
await this.ensureAdminRole(user, userRealmName);
|
|
2538
|
+
await this.sessions(userRealmName).updateById(session.id, { lastUsedAt: now.toISOString() });
|
|
2493
2539
|
this.log.debug("Session refreshed", {
|
|
2494
2540
|
sessionId: session.id,
|
|
2495
2541
|
userId: session.userId
|