alepha 0.15.3 → 0.15.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/dist/api/audits/index.d.ts +332 -332
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +8 -0
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.js +1 -0
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.d.ts +151 -151
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +3 -0
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +195 -195
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/notifications/index.browser.js +1 -0
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.js +1 -0
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/parameters/index.d.ts +260 -260
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +10 -0
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/users/index.d.ts +10 -10
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +11 -0
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +128 -128
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/batch/index.d.ts +4 -4
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +19 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/email/index.d.ts +13 -13
- package/dist/email/index.d.ts.map +1 -1
- package/dist/email/index.js +10554 -2
- package/dist/email/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +6 -1
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +9 -1
- package/dist/lock/core/index.js.map +1 -1
- package/dist/react/auth/index.browser.js +2 -1
- package/dist/react/auth/index.browser.js.map +1 -1
- package/dist/react/auth/index.js +2 -1
- package/dist/react/auth/index.js.map +1 -1
- package/dist/react/core/index.d.ts +3 -3
- package/dist/react/router/index.d.ts +10 -0
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +16 -6
- package/dist/react/router/index.js.map +1 -1
- package/dist/redis/index.d.ts +19 -19
- package/dist/scheduler/index.d.ts +13 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +42 -4
- package/dist/scheduler/index.js.map +1 -1
- package/dist/server/compress/index.d.ts.map +1 -1
- package/dist/server/compress/index.js +1 -0
- package/dist/server/compress/index.js.map +1 -1
- package/dist/server/core/index.d.ts +9 -9
- package/dist/server/links/index.js +1 -1
- package/dist/server/links/index.js.map +1 -1
- package/dist/vite/index.d.ts +2 -1
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +28 -2
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.d.ts +34 -34
- package/dist/websocket/index.d.ts.map +1 -1
- package/package.json +6 -3
- package/src/api/audits/controllers/AdminAuditController.ts +8 -0
- package/src/api/files/controllers/AdminFileStatsController.ts +1 -0
- package/src/api/jobs/controllers/AdminJobController.ts +3 -0
- package/src/api/notifications/controllers/AdminNotificationController.ts +1 -0
- package/src/api/parameters/controllers/AdminConfigController.ts +10 -0
- package/src/api/users/controllers/AdminIdentityController.ts +3 -0
- package/src/api/users/controllers/AdminSessionController.ts +3 -0
- package/src/api/users/controllers/AdminUserController.ts +5 -0
- package/src/cli/commands/build.ts +1 -0
- package/src/cli/providers/ViteDevServerProvider.ts +31 -0
- package/src/email/index.workerd.ts +36 -0
- package/src/email/providers/WorkermailerEmailProvider.ts +221 -0
- package/src/lock/core/primitives/$lock.ts +13 -1
- package/src/react/auth/services/ReactAuth.ts +3 -1
- package/src/react/router/atoms/ssrManifestAtom.ts +7 -0
- package/src/react/router/providers/ReactServerProvider.ts +14 -4
- package/src/react/router/providers/SSRManifestProvider.ts +7 -0
- package/src/scheduler/index.workerd.ts +43 -0
- package/src/scheduler/providers/CronProvider.ts +53 -6
- package/src/scheduler/providers/WorkerdCronProvider.ts +102 -0
- package/src/server/compress/providers/ServerCompressProvider.ts +6 -0
- package/src/server/links/providers/ServerLinksProvider.spec.ts +332 -0
- package/src/server/links/providers/ServerLinksProvider.ts +1 -1
- package/src/vite/tasks/generateCloudflare.ts +38 -2
|
@@ -298,7 +298,12 @@ declare class LockPrimitive<TFunc extends AsyncFn> extends Primitive<LockPrimiti
|
|
|
298
298
|
LOCK_PREFIX_KEY: string;
|
|
299
299
|
};
|
|
300
300
|
protected readonly dateTimeProvider: DateTimeProvider;
|
|
301
|
-
|
|
301
|
+
/**
|
|
302
|
+
* Lazy-initialized UUID to avoid calling crypto.randomUUID() in global scope.
|
|
303
|
+
* Cloudflare Workers doesn't allow random value generation during initialization.
|
|
304
|
+
*/
|
|
305
|
+
protected _id?: string;
|
|
306
|
+
protected get id(): string;
|
|
302
307
|
readonly maxDuration: dayjs_plugin_duration_js0.Duration;
|
|
303
308
|
protected readonly topicLockEnd: alepha_topic0.TopicPrimitive<{
|
|
304
309
|
payload: alepha1.TObject<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/lock/core/providers/LockProvider.ts","../../../src/lock/core/primitives/$lock.ts","../../../src/lock/core/providers/LockTopicProvider.ts","../../../src/lock/core/providers/MemoryLockProvider.ts","../../../src/lock/core/index.ts"],"mappings":";;;;;;;;;;;;uBAGsB,YAAA;;;;;;AAAtB;;;WASkB,GAAA,CACd,GAAA,UACA,KAAA,UACA,EAAA,YACA,EAAA,YACC,OAAA;EALa;;;;;EAAA,SAYA,GAAA,CAAA,GAAO,IAAA,aAAiB,OAAA;AAAA;;;;;;;;;AArB1C;;;;;;;;;;;;;;;;;;ACkEA;;;;;;;;;;;;;;;;;;;;;;;AAQA;;cARa,KAAA;EAAA,eAAuB,OAAA,EAAO,OAAA,EAChC,oBAAA,CAAqB,KAAA,IAC7B,aAAA,CAAc,KAAA;EAAA;;UAMA,oBAAA,eAAmC,OAAA;EA6JpC;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDf;;;;;;;;EA7KC,OAAA,EAAS,KAAA;;;;;;;;;;;;;;;;AAyLX;;;;;;;;;;;;;;;;;;;;;EAnJE,IAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/lock/core/providers/LockProvider.ts","../../../src/lock/core/primitives/$lock.ts","../../../src/lock/core/providers/LockTopicProvider.ts","../../../src/lock/core/providers/MemoryLockProvider.ts","../../../src/lock/core/index.ts"],"mappings":";;;;;;;;;;;;uBAGsB,YAAA;;;;;;AAAtB;;;WASkB,GAAA,CACd,GAAA,UACA,KAAA,UACA,EAAA,YACA,EAAA,YACC,OAAA;EALa;;;;;EAAA,SAYA,GAAA,CAAA,GAAO,IAAA,aAAiB,OAAA;AAAA;;;;;;;;;AArB1C;;;;;;;;;;;;;;;;;;ACkEA;;;;;;;;;;;;;;;;;;;;;;;AAQA;;cARa,KAAA;EAAA,eAAuB,OAAA,EAAO,OAAA,EAChC,oBAAA,CAAqB,KAAA,IAC7B,aAAA,CAAc,KAAA;EAAA;;UAMA,oBAAA,eAAmC,OAAA;EA6JpC;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDf;;;;;;;;EA7KC,OAAA,EAAS,KAAA;;;;;;;;;;;;;;;;AAyLX;;;;;;;;;;;;;;;;;;;;;EAnJE,IAAA;EAqQ+C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAzN/C,IAAA,iBAAqB,IAAA,EAAM,UAAA,CAAW,KAAA;EAoMpC;;;;;;;;;;;;;;;;;;;AAiEJ;;;;;;;;;;;;;;;ACrcA;;;;EDwOE,WAAA,GAAc,YAAA;;;;AElOhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACwBA;;;;;EH0PE,WAAA,QACS,IAAA,EAAM,UAAA,CAAW,KAAA,MAAW,YAAA,gBACjC,YAAA;AAAA;AAAA,cAKA,SAAA,EAEJ,OAAA,CAFa,OAAA;mBAEb,OAAA,CAAA,OAAA;AAAA;AAAA;EAAA,UAGU,GAAA,SAAY,OAAA,CAAQ,MAAA,QAAc,SAAA;AAAA;AAAA,cAGjC,aAAA,eAA4B,OAAA,UAAiB,SAAA,CACxD,oBAAA,CAAqB,KAAA;EAAA,mBAEF,GAAA,EAFC,cAAA,CAEE,MAAA;EAAA,mBACH,QAAA,EAAQ,YAAA;EAAA,mBACR,GAAA;;;qBACA,gBAAA,EAAgB,gBAAA;;;;;YAMzB,GAAA;EAAA,cACI,EAAA,CAAA;EAAA,SAOE,WAAA,EAdmB,yBAAA,CAcR,QAAA;EAAA,mBAIR,YAAA,gBAAY,cAAA;;YAJJ,OAAA,CAAA,OAAA;IAAA;EAAA;EAcd,GAAA,CAAA,GAAO,IAAA,EAAM,UAAA,CAAW,KAAA,IAAS,OAAA;;;;YA8C9B,IAAA,CAAK,GAAA,WAAc,OAAA,CAAQ,UAAA;EAAA,UAW3B,cAAA,CACd,GAAA,UACA,IAAA,EAAM,UAAA,KACH,IAAA,EAAM,UAAA,CAAW,KAAA,IACnB,OAAA;EAAA,UAmBa,IAAA,CAAK,GAAA,UAAa,WAAA,EAAa,YAAA,GAAe,OAAA;EAAA,UAWpD,GAAA,CAAA,GAAO,IAAA,EAAM,UAAA,CAAW,KAAA;EAAA,UAgBxB,KAAA,CAAM,KAAA,WAAgB,UAAA;AAAA;AAAA,UAiBjB,UAAA;EACf,EAAA;EACA,SAAA,EAAW,QAAA;EACX,OAAA,GAAU,QAAA;EACV,QAAA;AAAA;;;uBCzcoB,iBAAA,SAA0B,aAAA;;;;;;cCMnC,kBAAA,YAA8B,YAAA;EAAA,mBACtB,gBAAA,EAAgB,gBAAA;EAAA,mBAChB,GAAA,EADgB,cAAA,CACb,MAAA;;AHPxB;;YGYY,KAAA,EAAO,MAAA;EHS8B;;;EAAA,UGJrC,YAAA,EAAc,MAAA,SAAe,OAAA;EAE1B,GAAA,CACX,GAAA,UACA,KAAA,UACA,EAAA,YACA,EAAA,YACC,OAAA;EAcU,GAAA,CAAA,GAAO,IAAA,aAAiB,OAAA;EAAA,QAU7B,GAAA;AAAA;;;;;;;;AHhDV;;;;;;;;;;;cI6Ba,UAAA,EAAU,OAAA,CAAA,OAAA,CAgBrB,OAAA,CAhBqB,MAAA"}
|
package/dist/lock/core/index.js
CHANGED
|
@@ -73,7 +73,15 @@ var LockPrimitive = class extends Primitive {
|
|
|
73
73
|
provider = $inject(LockProvider);
|
|
74
74
|
env = $env(envSchema);
|
|
75
75
|
dateTimeProvider = $inject(DateTimeProvider);
|
|
76
|
-
|
|
76
|
+
/**
|
|
77
|
+
* Lazy-initialized UUID to avoid calling crypto.randomUUID() in global scope.
|
|
78
|
+
* Cloudflare Workers doesn't allow random value generation during initialization.
|
|
79
|
+
*/
|
|
80
|
+
_id;
|
|
81
|
+
get id() {
|
|
82
|
+
if (!this._id) this._id = crypto.randomUUID();
|
|
83
|
+
return this._id;
|
|
84
|
+
}
|
|
77
85
|
maxDuration = this.dateTimeProvider.duration(this.options.maxDuration ?? [5, "minutes"]);
|
|
78
86
|
topicLockEnd = $topic({
|
|
79
87
|
name: `${this.env.LOCK_PREFIX_KEY}:lock-end`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/lock/core/providers/LockProvider.ts","../../../src/lock/core/providers/LockTopicProvider.ts","../../../src/lock/core/primitives/$lock.ts","../../../src/lock/core/providers/MemoryLockProvider.ts","../../../src/lock/core/index.ts"],"sourcesContent":["/**\n * Store Provider Interface\n */\nexport abstract class LockProvider {\n /**\n * Set the string value of a key.\n *\n * @param key The key of the value to set.\n * @param value The value to set.\n * @param nx If set to true, the key will only be set if it does not already exist.\n * @param px Set the specified expire time, in milliseconds.\n */\n public abstract set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string>;\n\n /**\n * Remove the specified keys.\n *\n * @param keys The keys to delete.\n */\n public abstract del(...keys: string[]): Promise<void>;\n}\n","import { TopicProvider } from \"alepha/topic\";\n\nexport abstract class LockTopicProvider extends TopicProvider {}\n","import {\n $env,\n $inject,\n type AsyncFn,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n t,\n} from \"alepha\";\nimport {\n type DateTime,\n DateTimeProvider,\n type DurationLike,\n} from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { $topic, TopicTimeoutError } from \"alepha/topic\";\nimport { LockProvider } from \"../providers/LockProvider.ts\";\nimport { LockTopicProvider } from \"../providers/LockTopicProvider.ts\";\n\n/**\n * Creates a distributed lock primitive for ensuring single-instance execution across processes.\n *\n * Prevents multiple instances of the same operation from running simultaneously, essential for\n * maintaining data consistency and preventing race conditions in distributed applications.\n *\n * **Key Features**\n * - Distributed coordination across multiple processes, servers, and containers\n * - Automatic expiration to prevent deadlocks\n * - Configurable wait behavior (blocking vs. non-blocking)\n * - Optional grace periods for lock extension after completion\n * - Dynamic or static lock keys for fine-grained control\n *\n * **Common Use Cases**\n * - Database migrations and scheduled jobs\n * - File processing and batch operations\n * - Critical section protection and resource initialization\n *\n * @example\n * ```ts\n * class TaskService {\n * // Basic scheduled task - only one server executes\n * dailyReport = $lock({\n * handler: async () => {\n * const report = await this.generateDailyReport();\n * await this.sendReportToManagement(report);\n * }\n * });\n *\n * // Migration with wait - all instances wait for completion\n * migration = $lock({\n * wait: true,\n * maxDuration: [10, \"minutes\"],\n * handler: async (version: string) => {\n * await this.runMigrationScripts(version);\n * }\n * });\n *\n * // Dynamic lock keys for per-resource locking\n * processFile = $lock({\n * name: (fileId: string) => `file-processing:${fileId}`,\n * gracePeriod: [5, \"minutes\"],\n * handler: async (fileId: string) => {\n * await this.processFileData(fileId);\n * }\n * });\n * }\n * ```\n */\nexport const $lock = <TFunc extends AsyncFn>(\n options: LockPrimitiveOptions<TFunc>,\n): LockPrimitive<TFunc> => {\n return createPrimitive(LockPrimitive<TFunc>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface LockPrimitiveOptions<TFunc extends AsyncFn> {\n /**\n * The function to execute when the lock is successfully acquired.\n *\n * This function:\n * - Only executes on the instance that successfully acquires the lock\n * - Has exclusive access to the protected resource during execution\n * - Should contain the critical section logic that must not run concurrently\n * - Can be async and perform any operations needed\n * - Will automatically release the lock upon completion or error\n * - Has access to the full Alepha dependency injection container\n *\n * **Handler Design Guidelines**:\n * - Keep critical sections as short as possible to minimize lock contention\n * - Include proper error handling to ensure locks are released\n * - Use timeouts for external operations to prevent deadlocks\n * - Log important operations for debugging and monitoring\n * - Consider idempotency for handlers that might be retried\n *\n * @param ...args - The arguments passed to the lock execution\n * @returns Promise that resolves when the protected operation is complete\n *\n * @example\n * ```ts\n * handler: async (batchId: string) => {\n * console.log(`Processing batch ${batchId} - only one instance will run this`);\n *\n * const batch = await this.getBatchData(batchId);\n * const results = await this.processBatchItems(batch.items);\n * await this.saveBatchResults(batchId, results);\n *\n * console.log(`Batch ${batchId} completed successfully`);\n * }\n * ```\n */\n handler: TFunc;\n\n /**\n * Whether the lock should wait for other instances to complete before giving up.\n *\n * **wait = false (default)**:\n * - Non-blocking behavior - if lock is held, immediately return without executing\n * - Perfect for scheduled tasks where you only want one execution per trigger\n * - Use when multiple triggers are acceptable but concurrent execution is not\n * - Examples: periodic cleanup, cron jobs, background maintenance\n *\n * **wait = true**:\n * - Blocking behavior - wait for the current lock holder to finish\n * - All instances will eventually execute (one after another)\n * - Perfect for initialization tasks where all instances need the work completed\n * - Examples: database migrations, cache warming, resource initialization\n *\n * **Trade-offs**:\n * - Non-waiting: Better performance, may miss executions if timing is off\n * - Waiting: Guaranteed execution order, slower overall throughput\n *\n * @default false\n *\n * @example\n * ```ts\n * // Scheduled task - don't wait, just skip if already running\n * scheduledCleanup = $lock({\n * wait: false, // Skip if cleanup already running\n * handler: async () => { } // perform cleanup\n * });\n *\n * // Migration - wait for completion before proceeding\n * migration = $lock({\n * wait: true, // All instances wait for migration to complete\n * handler: async () => { } // perform migration\n * });\n * ```\n */\n wait?: boolean;\n\n /**\n * The unique identifier for the lock.\n *\n * Can be either:\n * - **Static string**: A fixed identifier for the lock\n * - **Dynamic function**: A function that generates the lock key based on arguments\n *\n * **Dynamic Lock Keys**:\n * - Enable per-resource locking (e.g., per-user, per-file, per-product)\n * - Allow fine-grained concurrency control\n * - Prevent unnecessary blocking between unrelated operations\n *\n * **Key Design Guidelines**:\n * - Use descriptive names that indicate the protected resource\n * - Include relevant identifiers for dynamic keys\n * - Keep keys reasonably short but unique\n * - Consider using hierarchical naming (e.g., \"service:operation:resource\")\n *\n * If not provided, defaults to `{serviceName}:{propertyKey}`.\n *\n * @example \"user-migration\"\n * @example \"daily-report-generation\"\n * @example (userId: string) => `user-profile-update:${userId}`\n * @example (fileId: string, operation: string) => `file-${operation}:${fileId}`\n *\n * @example\n * ```ts\n * // Static lock key - all instances compete for the same lock\n * globalCleanup = $lock({\n * name: \"system-cleanup\",\n * handler: async () => { } // perform cleanup\n * });\n *\n * // Dynamic lock key - per-user locks, users don't block each other\n * updateUserProfile = $lock({\n * name: (userId: string) => `user-update:${userId}`,\n * handler: async (userId: string, data: UserData) => {\n * // Only one update per user at a time, but different users can update concurrently\n * }\n * });\n * ```\n */\n name?: string | ((...args: Parameters<TFunc>) => string);\n\n /**\n * Maximum duration the lock can be held before it expires automatically.\n *\n * This prevents deadlocks when a process dies while holding a lock or when\n * operations take longer than expected. The lock will be automatically released\n * after this duration, allowing other instances to proceed.\n *\n * **Duration Guidelines**:\n * - Set based on expected operation duration plus safety margin\n * - Too short: Operations may be interrupted by early expiration\n * - Too long: Failed processes block others for extended periods\n * - Consider worst-case scenarios and external dependency timeouts\n *\n * **Typical Values**:\n * - Quick operations: 30 seconds - 2 minutes\n * - Database operations: 5 - 15 minutes\n * - File processing: 10 - 30 minutes\n * - Large migrations: 30 minutes - 2 hours\n *\n * @default [5, \"minutes\"]\n *\n * @example [30, \"seconds\"] // Quick operations\n * @example [10, \"minutes\"] // Database migrations\n * @example [1, \"hour\"] // Long-running batch jobs\n *\n * @example\n * ```ts\n * quickTask = $lock({\n * maxDuration: [2, \"minutes\"], // Quick timeout for fast operations\n * handler: async () => { } // perform quick task\n * });\n *\n * heavyProcessing = $lock({\n * maxDuration: [30, \"minutes\"], // Longer timeout for heavy work\n * handler: async () => { } // perform heavy processing\n * });\n * ```\n */\n maxDuration?: DurationLike;\n\n /**\n * Additional time to keep the lock active after the handler completes successfully.\n *\n * This provides a \"cooling off\" period that can be useful for:\n * - Preventing immediate re-execution of the same operation\n * - Giving time for related systems to process the results\n * - Avoiding race conditions with dependent operations\n * - Providing a buffer for cleanup operations\n *\n * Can be either:\n * - **Static duration**: Fixed grace period for all executions\n * - **Dynamic function**: Grace period determined by execution arguments\n * - **undefined**: No grace period, lock released immediately after completion\n *\n * **Grace Period Use Cases**:\n * - File processing: Prevent immediate reprocessing of uploaded files\n * - Cache updates: Allow time for cache propagation\n * - Batch operations: Prevent overlapping batch processing\n * - External API calls: Respect rate limiting requirements\n *\n * @default undefined (no grace period)\n *\n * @example [5, \"minutes\"] // Fixed 5-minute grace period\n * @example [30, \"seconds\"] // Short grace for quick operations\n * @example (userId: string) => userId.startsWith(\"premium\") ? [10, \"minutes\"] : [2, \"minutes\"]\n *\n * @example\n * ```ts\n * fileProcessor = $lock({\n * gracePeriod: [10, \"minutes\"], // Prevent reprocessing same file immediately\n * handler: async (filePath: string) => {\n * await this.processFile(filePath);\n * }\n * });\n *\n * userOperation = $lock({\n * gracePeriod: (userId: string, operation: string) => {\n * // Dynamic grace based on operation type\n * return operation === 'migration' ? [30, \"minutes\"] : [5, \"minutes\"];\n * },\n * handler: async (userId: string, operation: string) => {\n * await this.performUserOperation(userId, operation);\n * }\n * });\n * ```\n */\n gracePeriod?:\n | ((...args: Parameters<TFunc>) => DurationLike | undefined)\n | DurationLike;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n LOCK_PREFIX_KEY: t.text({ default: \"lock\" }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\nexport class LockPrimitive<TFunc extends AsyncFn> extends Primitive<\n LockPrimitiveOptions<TFunc>\n> {\n protected readonly log = $logger();\n protected readonly provider = $inject(LockProvider);\n protected readonly env = $env(envSchema);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly id = crypto.randomUUID();\n public readonly maxDuration = this.dateTimeProvider.duration(\n this.options.maxDuration ?? [5, \"minutes\"],\n );\n\n protected readonly topicLockEnd = $topic({\n name: `${this.env.LOCK_PREFIX_KEY}:lock-end`,\n provider: LockTopicProvider,\n schema: {\n payload: t.object({\n name: t.text(),\n }),\n },\n });\n\n public async run(...args: Parameters<TFunc>): Promise<void> {\n const key = this.key(...args);\n const handler = this.options.handler;\n\n const lock = await this.lock(key);\n if (lock.endedAt) {\n return;\n }\n\n if (lock.id !== this.id) {\n if (this.options.wait) {\n try {\n await this.wait(key, this.maxDuration);\n } catch (error) {\n if (error instanceof TopicTimeoutError) {\n this.log.warn(\n `Lock timeout for '${key}' has been reached. Retry...`,\n );\n await this.run(...args);\n } else {\n throw error;\n }\n }\n }\n\n return;\n }\n\n this.log.debug(`Lock '${key}' ...`);\n\n try {\n await handler(...args);\n } finally {\n await this.topicLockEnd.publish({\n name: key,\n });\n\n await this.setGracePeriod(key, lock, ...args);\n\n this.log.debug(`Lock '${key}' OK`);\n }\n }\n\n /**\n * Set the lock for the given key.\n */\n protected async lock(key: string): Promise<LockResult> {\n const value = await this.provider.set(\n key,\n `${this.id},${this.dateTimeProvider.nowISOString()}`,\n true,\n this.maxDuration.as(\"milliseconds\"),\n );\n\n return this.parse(value);\n }\n\n protected async setGracePeriod(\n key: string,\n lock: LockResult,\n ...args: Parameters<TFunc>\n ): Promise<void> {\n const gracePeriod = this.options.gracePeriod\n ? this.dateTimeProvider.isDurationLike(this.options.gracePeriod)\n ? this.options.gracePeriod\n : this.options.gracePeriod(...args)\n : undefined;\n\n if (gracePeriod) {\n await this.provider.set(\n key,\n `${this.id},${lock.createdAt.toISOString()},${this.dateTimeProvider.nowISOString()}`,\n false,\n this.dateTimeProvider.duration(gracePeriod).as(\"milliseconds\"),\n );\n } else {\n await this.provider.del(key);\n }\n }\n\n protected async wait(key: string, maxDuration: DurationLike): Promise<void> {\n this.log.debug(`Wait for lock '${key}' ...`);\n\n await this.topicLockEnd.wait({\n filter: (message) => message.payload.name === key,\n timeout: maxDuration,\n });\n\n this.log.debug(`Wait for lock '${key}' OK`);\n }\n\n protected key(...args: Parameters<TFunc>) {\n let base = \"\";\n\n if (this.options.name) {\n if (typeof this.options.name === \"string\") {\n base = this.options.name;\n } else {\n base = this.options.name(...args);\n }\n } else {\n base = `${this.config.service.name}:${this.config.propertyKey}`;\n }\n\n return `${this.env.LOCK_PREFIX_KEY}:${base}`;\n }\n\n protected parse(value: string): LockResult {\n const [id, createdAtStr, endedAtStr] = value.split(\",\");\n const createdAt = this.dateTimeProvider.of(createdAtStr);\n const endedAt = endedAtStr\n ? this.dateTimeProvider.of(endedAtStr)\n : undefined;\n\n return {\n id,\n createdAt,\n endedAt,\n };\n }\n}\n\n$lock[KIND] = LockPrimitive;\n\nexport interface LockResult {\n id: string;\n createdAt: DateTime;\n endedAt?: DateTime;\n response?: string;\n}\n","import { $inject } from \"alepha\";\nimport { DateTimeProvider, type Timeout } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport type { LockProvider } from \"./LockProvider.ts\";\n\n/**\n * A simple in-memory store provider.\n */\nexport class MemoryLockProvider implements LockProvider {\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly log = $logger();\n\n /**\n * The in-memory store.\n */\n protected store: Record<string, string> = {};\n\n /**\n * Timeouts used to expire keys.\n */\n protected storeTimeout: Record<string, Timeout> = {};\n\n public async set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string> {\n if (nx && this.store[key] != null) {\n return this.store[key];\n }\n\n if (px) {\n this.ttl(key, px);\n }\n\n this.store[key] = value;\n\n return this.store[key];\n }\n\n public async del(...keys: string[]): Promise<void> {\n for (const key of keys) {\n delete this.store[key];\n if (this.storeTimeout[key] != null) {\n this.storeTimeout[key].clear();\n delete this.storeTimeout[key];\n }\n }\n }\n\n private ttl(key: string, ms: number): void {\n if (this.storeTimeout[key] != null) {\n this.storeTimeout[key].clear();\n delete this.storeTimeout[key];\n }\n\n this.storeTimeout[key] = this.dateTimeProvider.createTimeout(() => {\n delete this.store[key];\n delete this.storeTimeout[key];\n }, ms);\n }\n}\n","import { $module } from \"alepha\";\nimport { MemoryTopicProvider } from \"alepha/topic\";\nimport { $lock } from \"./primitives/$lock.ts\";\nimport { LockProvider } from \"./providers/LockProvider.ts\";\nimport { LockTopicProvider } from \"./providers/LockTopicProvider.ts\";\nimport { MemoryLockProvider } from \"./providers/MemoryLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$lock.ts\";\nexport * from \"./providers/LockProvider.ts\";\nexport * from \"./providers/LockTopicProvider.ts\";\nexport * from \"./providers/MemoryLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * | type | quality | stability |\n * |------|---------|-----------|\n * | backend | rare | stable |\n *\n * Resource locking for distributed systems.\n *\n * **Features:**\n * - Distributed locks with timeout\n * - Time-based lock expiration\n * - Automatic release on scope exit\n * - Distributed coordination via Redis\n * - Providers: Memory (dev), Redis (production)\n *\n * @module alepha.lock\n */\nexport const AlephaLock = $module({\n name: \"alepha.lock\",\n primitives: [$lock],\n services: [LockProvider, MemoryLockProvider, LockTopicProvider],\n register: (alepha) =>\n alepha\n .with({\n optional: true,\n provide: LockTopicProvider,\n use: MemoryTopicProvider,\n })\n .with({\n optional: true,\n provide: LockProvider,\n use: MemoryLockProvider,\n }),\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/lock/core/providers/LockProvider.ts","../../../src/lock/core/providers/LockTopicProvider.ts","../../../src/lock/core/primitives/$lock.ts","../../../src/lock/core/providers/MemoryLockProvider.ts","../../../src/lock/core/index.ts"],"sourcesContent":["/**\n * Store Provider Interface\n */\nexport abstract class LockProvider {\n /**\n * Set the string value of a key.\n *\n * @param key The key of the value to set.\n * @param value The value to set.\n * @param nx If set to true, the key will only be set if it does not already exist.\n * @param px Set the specified expire time, in milliseconds.\n */\n public abstract set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string>;\n\n /**\n * Remove the specified keys.\n *\n * @param keys The keys to delete.\n */\n public abstract del(...keys: string[]): Promise<void>;\n}\n","import { TopicProvider } from \"alepha/topic\";\n\nexport abstract class LockTopicProvider extends TopicProvider {}\n","import {\n $env,\n $inject,\n type AsyncFn,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n t,\n} from \"alepha\";\nimport {\n type DateTime,\n DateTimeProvider,\n type DurationLike,\n} from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { $topic, TopicTimeoutError } from \"alepha/topic\";\nimport { LockProvider } from \"../providers/LockProvider.ts\";\nimport { LockTopicProvider } from \"../providers/LockTopicProvider.ts\";\n\n/**\n * Creates a distributed lock primitive for ensuring single-instance execution across processes.\n *\n * Prevents multiple instances of the same operation from running simultaneously, essential for\n * maintaining data consistency and preventing race conditions in distributed applications.\n *\n * **Key Features**\n * - Distributed coordination across multiple processes, servers, and containers\n * - Automatic expiration to prevent deadlocks\n * - Configurable wait behavior (blocking vs. non-blocking)\n * - Optional grace periods for lock extension after completion\n * - Dynamic or static lock keys for fine-grained control\n *\n * **Common Use Cases**\n * - Database migrations and scheduled jobs\n * - File processing and batch operations\n * - Critical section protection and resource initialization\n *\n * @example\n * ```ts\n * class TaskService {\n * // Basic scheduled task - only one server executes\n * dailyReport = $lock({\n * handler: async () => {\n * const report = await this.generateDailyReport();\n * await this.sendReportToManagement(report);\n * }\n * });\n *\n * // Migration with wait - all instances wait for completion\n * migration = $lock({\n * wait: true,\n * maxDuration: [10, \"minutes\"],\n * handler: async (version: string) => {\n * await this.runMigrationScripts(version);\n * }\n * });\n *\n * // Dynamic lock keys for per-resource locking\n * processFile = $lock({\n * name: (fileId: string) => `file-processing:${fileId}`,\n * gracePeriod: [5, \"minutes\"],\n * handler: async (fileId: string) => {\n * await this.processFileData(fileId);\n * }\n * });\n * }\n * ```\n */\nexport const $lock = <TFunc extends AsyncFn>(\n options: LockPrimitiveOptions<TFunc>,\n): LockPrimitive<TFunc> => {\n return createPrimitive(LockPrimitive<TFunc>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface LockPrimitiveOptions<TFunc extends AsyncFn> {\n /**\n * The function to execute when the lock is successfully acquired.\n *\n * This function:\n * - Only executes on the instance that successfully acquires the lock\n * - Has exclusive access to the protected resource during execution\n * - Should contain the critical section logic that must not run concurrently\n * - Can be async and perform any operations needed\n * - Will automatically release the lock upon completion or error\n * - Has access to the full Alepha dependency injection container\n *\n * **Handler Design Guidelines**:\n * - Keep critical sections as short as possible to minimize lock contention\n * - Include proper error handling to ensure locks are released\n * - Use timeouts for external operations to prevent deadlocks\n * - Log important operations for debugging and monitoring\n * - Consider idempotency for handlers that might be retried\n *\n * @param ...args - The arguments passed to the lock execution\n * @returns Promise that resolves when the protected operation is complete\n *\n * @example\n * ```ts\n * handler: async (batchId: string) => {\n * console.log(`Processing batch ${batchId} - only one instance will run this`);\n *\n * const batch = await this.getBatchData(batchId);\n * const results = await this.processBatchItems(batch.items);\n * await this.saveBatchResults(batchId, results);\n *\n * console.log(`Batch ${batchId} completed successfully`);\n * }\n * ```\n */\n handler: TFunc;\n\n /**\n * Whether the lock should wait for other instances to complete before giving up.\n *\n * **wait = false (default)**:\n * - Non-blocking behavior - if lock is held, immediately return without executing\n * - Perfect for scheduled tasks where you only want one execution per trigger\n * - Use when multiple triggers are acceptable but concurrent execution is not\n * - Examples: periodic cleanup, cron jobs, background maintenance\n *\n * **wait = true**:\n * - Blocking behavior - wait for the current lock holder to finish\n * - All instances will eventually execute (one after another)\n * - Perfect for initialization tasks where all instances need the work completed\n * - Examples: database migrations, cache warming, resource initialization\n *\n * **Trade-offs**:\n * - Non-waiting: Better performance, may miss executions if timing is off\n * - Waiting: Guaranteed execution order, slower overall throughput\n *\n * @default false\n *\n * @example\n * ```ts\n * // Scheduled task - don't wait, just skip if already running\n * scheduledCleanup = $lock({\n * wait: false, // Skip if cleanup already running\n * handler: async () => { } // perform cleanup\n * });\n *\n * // Migration - wait for completion before proceeding\n * migration = $lock({\n * wait: true, // All instances wait for migration to complete\n * handler: async () => { } // perform migration\n * });\n * ```\n */\n wait?: boolean;\n\n /**\n * The unique identifier for the lock.\n *\n * Can be either:\n * - **Static string**: A fixed identifier for the lock\n * - **Dynamic function**: A function that generates the lock key based on arguments\n *\n * **Dynamic Lock Keys**:\n * - Enable per-resource locking (e.g., per-user, per-file, per-product)\n * - Allow fine-grained concurrency control\n * - Prevent unnecessary blocking between unrelated operations\n *\n * **Key Design Guidelines**:\n * - Use descriptive names that indicate the protected resource\n * - Include relevant identifiers for dynamic keys\n * - Keep keys reasonably short but unique\n * - Consider using hierarchical naming (e.g., \"service:operation:resource\")\n *\n * If not provided, defaults to `{serviceName}:{propertyKey}`.\n *\n * @example \"user-migration\"\n * @example \"daily-report-generation\"\n * @example (userId: string) => `user-profile-update:${userId}`\n * @example (fileId: string, operation: string) => `file-${operation}:${fileId}`\n *\n * @example\n * ```ts\n * // Static lock key - all instances compete for the same lock\n * globalCleanup = $lock({\n * name: \"system-cleanup\",\n * handler: async () => { } // perform cleanup\n * });\n *\n * // Dynamic lock key - per-user locks, users don't block each other\n * updateUserProfile = $lock({\n * name: (userId: string) => `user-update:${userId}`,\n * handler: async (userId: string, data: UserData) => {\n * // Only one update per user at a time, but different users can update concurrently\n * }\n * });\n * ```\n */\n name?: string | ((...args: Parameters<TFunc>) => string);\n\n /**\n * Maximum duration the lock can be held before it expires automatically.\n *\n * This prevents deadlocks when a process dies while holding a lock or when\n * operations take longer than expected. The lock will be automatically released\n * after this duration, allowing other instances to proceed.\n *\n * **Duration Guidelines**:\n * - Set based on expected operation duration plus safety margin\n * - Too short: Operations may be interrupted by early expiration\n * - Too long: Failed processes block others for extended periods\n * - Consider worst-case scenarios and external dependency timeouts\n *\n * **Typical Values**:\n * - Quick operations: 30 seconds - 2 minutes\n * - Database operations: 5 - 15 minutes\n * - File processing: 10 - 30 minutes\n * - Large migrations: 30 minutes - 2 hours\n *\n * @default [5, \"minutes\"]\n *\n * @example [30, \"seconds\"] // Quick operations\n * @example [10, \"minutes\"] // Database migrations\n * @example [1, \"hour\"] // Long-running batch jobs\n *\n * @example\n * ```ts\n * quickTask = $lock({\n * maxDuration: [2, \"minutes\"], // Quick timeout for fast operations\n * handler: async () => { } // perform quick task\n * });\n *\n * heavyProcessing = $lock({\n * maxDuration: [30, \"minutes\"], // Longer timeout for heavy work\n * handler: async () => { } // perform heavy processing\n * });\n * ```\n */\n maxDuration?: DurationLike;\n\n /**\n * Additional time to keep the lock active after the handler completes successfully.\n *\n * This provides a \"cooling off\" period that can be useful for:\n * - Preventing immediate re-execution of the same operation\n * - Giving time for related systems to process the results\n * - Avoiding race conditions with dependent operations\n * - Providing a buffer for cleanup operations\n *\n * Can be either:\n * - **Static duration**: Fixed grace period for all executions\n * - **Dynamic function**: Grace period determined by execution arguments\n * - **undefined**: No grace period, lock released immediately after completion\n *\n * **Grace Period Use Cases**:\n * - File processing: Prevent immediate reprocessing of uploaded files\n * - Cache updates: Allow time for cache propagation\n * - Batch operations: Prevent overlapping batch processing\n * - External API calls: Respect rate limiting requirements\n *\n * @default undefined (no grace period)\n *\n * @example [5, \"minutes\"] // Fixed 5-minute grace period\n * @example [30, \"seconds\"] // Short grace for quick operations\n * @example (userId: string) => userId.startsWith(\"premium\") ? [10, \"minutes\"] : [2, \"minutes\"]\n *\n * @example\n * ```ts\n * fileProcessor = $lock({\n * gracePeriod: [10, \"minutes\"], // Prevent reprocessing same file immediately\n * handler: async (filePath: string) => {\n * await this.processFile(filePath);\n * }\n * });\n *\n * userOperation = $lock({\n * gracePeriod: (userId: string, operation: string) => {\n * // Dynamic grace based on operation type\n * return operation === 'migration' ? [30, \"minutes\"] : [5, \"minutes\"];\n * },\n * handler: async (userId: string, operation: string) => {\n * await this.performUserOperation(userId, operation);\n * }\n * });\n * ```\n */\n gracePeriod?:\n | ((...args: Parameters<TFunc>) => DurationLike | undefined)\n | DurationLike;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n LOCK_PREFIX_KEY: t.text({ default: \"lock\" }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\nexport class LockPrimitive<TFunc extends AsyncFn> extends Primitive<\n LockPrimitiveOptions<TFunc>\n> {\n protected readonly log = $logger();\n protected readonly provider = $inject(LockProvider);\n protected readonly env = $env(envSchema);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n /**\n * Lazy-initialized UUID to avoid calling crypto.randomUUID() in global scope.\n * Cloudflare Workers doesn't allow random value generation during initialization.\n */\n protected _id?: string;\n protected get id(): string {\n if (!this._id) {\n this._id = crypto.randomUUID();\n }\n return this._id;\n }\n\n public readonly maxDuration = this.dateTimeProvider.duration(\n this.options.maxDuration ?? [5, \"minutes\"],\n );\n\n protected readonly topicLockEnd = $topic({\n name: `${this.env.LOCK_PREFIX_KEY}:lock-end`,\n provider: LockTopicProvider,\n schema: {\n payload: t.object({\n name: t.text(),\n }),\n },\n });\n\n public async run(...args: Parameters<TFunc>): Promise<void> {\n const key = this.key(...args);\n const handler = this.options.handler;\n\n const lock = await this.lock(key);\n if (lock.endedAt) {\n return;\n }\n\n if (lock.id !== this.id) {\n if (this.options.wait) {\n try {\n await this.wait(key, this.maxDuration);\n } catch (error) {\n if (error instanceof TopicTimeoutError) {\n this.log.warn(\n `Lock timeout for '${key}' has been reached. Retry...`,\n );\n await this.run(...args);\n } else {\n throw error;\n }\n }\n }\n\n return;\n }\n\n this.log.debug(`Lock '${key}' ...`);\n\n try {\n await handler(...args);\n } finally {\n await this.topicLockEnd.publish({\n name: key,\n });\n\n await this.setGracePeriod(key, lock, ...args);\n\n this.log.debug(`Lock '${key}' OK`);\n }\n }\n\n /**\n * Set the lock for the given key.\n */\n protected async lock(key: string): Promise<LockResult> {\n const value = await this.provider.set(\n key,\n `${this.id},${this.dateTimeProvider.nowISOString()}`,\n true,\n this.maxDuration.as(\"milliseconds\"),\n );\n\n return this.parse(value);\n }\n\n protected async setGracePeriod(\n key: string,\n lock: LockResult,\n ...args: Parameters<TFunc>\n ): Promise<void> {\n const gracePeriod = this.options.gracePeriod\n ? this.dateTimeProvider.isDurationLike(this.options.gracePeriod)\n ? this.options.gracePeriod\n : this.options.gracePeriod(...args)\n : undefined;\n\n if (gracePeriod) {\n await this.provider.set(\n key,\n `${this.id},${lock.createdAt.toISOString()},${this.dateTimeProvider.nowISOString()}`,\n false,\n this.dateTimeProvider.duration(gracePeriod).as(\"milliseconds\"),\n );\n } else {\n await this.provider.del(key);\n }\n }\n\n protected async wait(key: string, maxDuration: DurationLike): Promise<void> {\n this.log.debug(`Wait for lock '${key}' ...`);\n\n await this.topicLockEnd.wait({\n filter: (message) => message.payload.name === key,\n timeout: maxDuration,\n });\n\n this.log.debug(`Wait for lock '${key}' OK`);\n }\n\n protected key(...args: Parameters<TFunc>) {\n let base = \"\";\n\n if (this.options.name) {\n if (typeof this.options.name === \"string\") {\n base = this.options.name;\n } else {\n base = this.options.name(...args);\n }\n } else {\n base = `${this.config.service.name}:${this.config.propertyKey}`;\n }\n\n return `${this.env.LOCK_PREFIX_KEY}:${base}`;\n }\n\n protected parse(value: string): LockResult {\n const [id, createdAtStr, endedAtStr] = value.split(\",\");\n const createdAt = this.dateTimeProvider.of(createdAtStr);\n const endedAt = endedAtStr\n ? this.dateTimeProvider.of(endedAtStr)\n : undefined;\n\n return {\n id,\n createdAt,\n endedAt,\n };\n }\n}\n\n$lock[KIND] = LockPrimitive;\n\nexport interface LockResult {\n id: string;\n createdAt: DateTime;\n endedAt?: DateTime;\n response?: string;\n}\n","import { $inject } from \"alepha\";\nimport { DateTimeProvider, type Timeout } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport type { LockProvider } from \"./LockProvider.ts\";\n\n/**\n * A simple in-memory store provider.\n */\nexport class MemoryLockProvider implements LockProvider {\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly log = $logger();\n\n /**\n * The in-memory store.\n */\n protected store: Record<string, string> = {};\n\n /**\n * Timeouts used to expire keys.\n */\n protected storeTimeout: Record<string, Timeout> = {};\n\n public async set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string> {\n if (nx && this.store[key] != null) {\n return this.store[key];\n }\n\n if (px) {\n this.ttl(key, px);\n }\n\n this.store[key] = value;\n\n return this.store[key];\n }\n\n public async del(...keys: string[]): Promise<void> {\n for (const key of keys) {\n delete this.store[key];\n if (this.storeTimeout[key] != null) {\n this.storeTimeout[key].clear();\n delete this.storeTimeout[key];\n }\n }\n }\n\n private ttl(key: string, ms: number): void {\n if (this.storeTimeout[key] != null) {\n this.storeTimeout[key].clear();\n delete this.storeTimeout[key];\n }\n\n this.storeTimeout[key] = this.dateTimeProvider.createTimeout(() => {\n delete this.store[key];\n delete this.storeTimeout[key];\n }, ms);\n }\n}\n","import { $module } from \"alepha\";\nimport { MemoryTopicProvider } from \"alepha/topic\";\nimport { $lock } from \"./primitives/$lock.ts\";\nimport { LockProvider } from \"./providers/LockProvider.ts\";\nimport { LockTopicProvider } from \"./providers/LockTopicProvider.ts\";\nimport { MemoryLockProvider } from \"./providers/MemoryLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$lock.ts\";\nexport * from \"./providers/LockProvider.ts\";\nexport * from \"./providers/LockTopicProvider.ts\";\nexport * from \"./providers/MemoryLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * | type | quality | stability |\n * |------|---------|-----------|\n * | backend | rare | stable |\n *\n * Resource locking for distributed systems.\n *\n * **Features:**\n * - Distributed locks with timeout\n * - Time-based lock expiration\n * - Automatic release on scope exit\n * - Distributed coordination via Redis\n * - Providers: Memory (dev), Redis (production)\n *\n * @module alepha.lock\n */\nexport const AlephaLock = $module({\n name: \"alepha.lock\",\n primitives: [$lock],\n services: [LockProvider, MemoryLockProvider, LockTopicProvider],\n register: (alepha) =>\n alepha\n .with({\n optional: true,\n provide: LockTopicProvider,\n use: MemoryTopicProvider,\n })\n .with({\n optional: true,\n provide: LockProvider,\n use: MemoryLockProvider,\n }),\n});\n"],"mappings":";;;;;;;;;AAGA,IAAsB,eAAtB,MAAmC;;;;ACDnC,IAAsB,oBAAtB,cAAgD,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACmE9D,MAAa,SACX,YACyB;AACzB,QAAO,gBAAgB,eAAsB,QAAQ;;AAyNvD,MAAM,YAAY,EAAE,OAAO,EACzB,iBAAiB,EAAE,KAAK,EAAE,SAAS,QAAQ,CAAC,EAC7C,CAAC;AAMF,IAAa,gBAAb,cAA0D,UAExD;CACA,AAAmB,MAAM,SAAS;CAClC,AAAmB,WAAW,QAAQ,aAAa;CACnD,AAAmB,MAAM,KAAK,UAAU;CACxC,AAAmB,mBAAmB,QAAQ,iBAAiB;;;;;CAM/D,AAAU;CACV,IAAc,KAAa;AACzB,MAAI,CAAC,KAAK,IACR,MAAK,MAAM,OAAO,YAAY;AAEhC,SAAO,KAAK;;CAGd,AAAgB,cAAc,KAAK,iBAAiB,SAClD,KAAK,QAAQ,eAAe,CAAC,GAAG,UAAU,CAC3C;CAED,AAAmB,eAAe,OAAO;EACvC,MAAM,GAAG,KAAK,IAAI,gBAAgB;EAClC,UAAU;EACV,QAAQ,EACN,SAAS,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACf,CAAC,EACH;EACF,CAAC;CAEF,MAAa,IAAI,GAAG,MAAwC;EAC1D,MAAM,MAAM,KAAK,IAAI,GAAG,KAAK;EAC7B,MAAM,UAAU,KAAK,QAAQ;EAE7B,MAAM,OAAO,MAAM,KAAK,KAAK,IAAI;AACjC,MAAI,KAAK,QACP;AAGF,MAAI,KAAK,OAAO,KAAK,IAAI;AACvB,OAAI,KAAK,QAAQ,KACf,KAAI;AACF,UAAM,KAAK,KAAK,KAAK,KAAK,YAAY;YAC/B,OAAO;AACd,QAAI,iBAAiB,mBAAmB;AACtC,UAAK,IAAI,KACP,qBAAqB,IAAI,8BAC1B;AACD,WAAM,KAAK,IAAI,GAAG,KAAK;UAEvB,OAAM;;AAKZ;;AAGF,OAAK,IAAI,MAAM,SAAS,IAAI,OAAO;AAEnC,MAAI;AACF,SAAM,QAAQ,GAAG,KAAK;YACd;AACR,SAAM,KAAK,aAAa,QAAQ,EAC9B,MAAM,KACP,CAAC;AAEF,SAAM,KAAK,eAAe,KAAK,MAAM,GAAG,KAAK;AAE7C,QAAK,IAAI,MAAM,SAAS,IAAI,MAAM;;;;;;CAOtC,MAAgB,KAAK,KAAkC;EACrD,MAAM,QAAQ,MAAM,KAAK,SAAS,IAChC,KACA,GAAG,KAAK,GAAG,GAAG,KAAK,iBAAiB,cAAc,IAClD,MACA,KAAK,YAAY,GAAG,eAAe,CACpC;AAED,SAAO,KAAK,MAAM,MAAM;;CAG1B,MAAgB,eACd,KACA,MACA,GAAG,MACY;EACf,MAAM,cAAc,KAAK,QAAQ,cAC7B,KAAK,iBAAiB,eAAe,KAAK,QAAQ,YAAY,GAC5D,KAAK,QAAQ,cACb,KAAK,QAAQ,YAAY,GAAG,KAAK,GACnC;AAEJ,MAAI,YACF,OAAM,KAAK,SAAS,IAClB,KACA,GAAG,KAAK,GAAG,GAAG,KAAK,UAAU,aAAa,CAAC,GAAG,KAAK,iBAAiB,cAAc,IAClF,OACA,KAAK,iBAAiB,SAAS,YAAY,CAAC,GAAG,eAAe,CAC/D;MAED,OAAM,KAAK,SAAS,IAAI,IAAI;;CAIhC,MAAgB,KAAK,KAAa,aAA0C;AAC1E,OAAK,IAAI,MAAM,kBAAkB,IAAI,OAAO;AAE5C,QAAM,KAAK,aAAa,KAAK;GAC3B,SAAS,YAAY,QAAQ,QAAQ,SAAS;GAC9C,SAAS;GACV,CAAC;AAEF,OAAK,IAAI,MAAM,kBAAkB,IAAI,MAAM;;CAG7C,AAAU,IAAI,GAAG,MAAyB;EACxC,IAAI,OAAO;AAEX,MAAI,KAAK,QAAQ,KACf,KAAI,OAAO,KAAK,QAAQ,SAAS,SAC/B,QAAO,KAAK,QAAQ;MAEpB,QAAO,KAAK,QAAQ,KAAK,GAAG,KAAK;MAGnC,QAAO,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG,KAAK,OAAO;AAGpD,SAAO,GAAG,KAAK,IAAI,gBAAgB,GAAG;;CAGxC,AAAU,MAAM,OAA2B;EACzC,MAAM,CAAC,IAAI,cAAc,cAAc,MAAM,MAAM,IAAI;AAMvD,SAAO;GACL;GACA,WAPgB,KAAK,iBAAiB,GAAG,aAAa;GAQtD,SAPc,aACZ,KAAK,iBAAiB,GAAG,WAAW,GACpC;GAMH;;;AAIL,MAAM,QAAQ;;;;;;;AC7bd,IAAa,qBAAb,MAAwD;CACtD,AAAmB,mBAAmB,QAAQ,iBAAiB;CAC/D,AAAmB,MAAM,SAAS;;;;CAKlC,AAAU,QAAgC,EAAE;;;;CAK5C,AAAU,eAAwC,EAAE;CAEpD,MAAa,IACX,KACA,OACA,IACA,IACiB;AACjB,MAAI,MAAM,KAAK,MAAM,QAAQ,KAC3B,QAAO,KAAK,MAAM;AAGpB,MAAI,GACF,MAAK,IAAI,KAAK,GAAG;AAGnB,OAAK,MAAM,OAAO;AAElB,SAAO,KAAK,MAAM;;CAGpB,MAAa,IAAI,GAAG,MAA+B;AACjD,OAAK,MAAM,OAAO,MAAM;AACtB,UAAO,KAAK,MAAM;AAClB,OAAI,KAAK,aAAa,QAAQ,MAAM;AAClC,SAAK,aAAa,KAAK,OAAO;AAC9B,WAAO,KAAK,aAAa;;;;CAK/B,AAAQ,IAAI,KAAa,IAAkB;AACzC,MAAI,KAAK,aAAa,QAAQ,MAAM;AAClC,QAAK,aAAa,KAAK,OAAO;AAC9B,UAAO,KAAK,aAAa;;AAG3B,OAAK,aAAa,OAAO,KAAK,iBAAiB,oBAAoB;AACjE,UAAO,KAAK,MAAM;AAClB,UAAO,KAAK,aAAa;KACxB,GAAG;;;;;;;;;;;;;;;;;;;;;;AC5BV,MAAa,aAAa,QAAQ;CAChC,MAAM;CACN,YAAY,CAAC,MAAM;CACnB,UAAU;EAAC;EAAc;EAAoB;EAAkB;CAC/D,WAAW,WACT,OACG,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;EACN,CAAC,CACD,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;EACN,CAAC;CACP,CAAC"}
|
|
@@ -73,7 +73,8 @@ var ReactAuth = class {
|
|
|
73
73
|
throw new Redirection(`${alephaServerAuthRoutes.login}?provider=${provider}${realmParam}&redirect_uri=${options.redirect || "/"}`);
|
|
74
74
|
}
|
|
75
75
|
logout() {
|
|
76
|
-
|
|
76
|
+
const cacheBuster = Date.now();
|
|
77
|
+
window.location.href = `${alephaServerAuthRoutes.logout}?post_logout_redirect_uri=${encodeURIComponent(window.location.origin)}&_=${cacheBuster}`;
|
|
77
78
|
}
|
|
78
79
|
};
|
|
79
80
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/react/auth/services/ReactAuth.ts","../../../src/react/auth/hooks/useAuth.ts","../../../src/react/auth/index.browser.ts"],"sourcesContent":["import { $hook, $inject, Alepha } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { ReactBrowserProvider, Redirection } from \"alepha/react/router\";\nimport type { UserAccountToken } from \"alepha/security\";\nimport { HttpClient } from \"alepha/server\";\nimport {\n alephaServerAuthRoutes,\n type Tokens,\n tokenResponseSchema,\n userinfoResponseSchema,\n} from \"alepha/server/auth\";\nimport { LinkProvider } from \"alepha/server/links\";\n\n/**\n * Browser, SSR friendly, service to handle authentication.\n */\nexport class ReactAuth {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly httpClient = $inject(HttpClient);\n protected readonly linkProvider = $inject(LinkProvider);\n\n protected readonly onBeginTransition = $hook({\n on: \"react:transition:begin\",\n handler: async (event) => {\n if (this.alepha.isBrowser()) {\n Object.defineProperty(event.state, \"user\", {\n get: () => this.user,\n });\n }\n },\n });\n\n protected readonly onFetchRequest = $hook({\n on: \"client:onRequest\",\n handler: async ({ request }) => {\n if (this.alepha.isBrowser() && this.user) {\n // ensure cookies are sent with requests and refresh-able\n request.credentials ??= \"include\";\n }\n },\n });\n\n /**\n * Get the current authenticated user.\n *\n * Alias for `alepha.state.get(\"user\")`\n */\n public get user(): UserAccountToken | undefined {\n return this.alepha.store.get(\"alepha.server.request.user\");\n }\n\n public async ping() {\n const { data } = await this.httpClient.fetch(\n alephaServerAuthRoutes.userinfo,\n {\n schema: { response: userinfoResponseSchema },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data.api);\n this.alepha.store.set(\"alepha.server.request.user\", data.user);\n\n return data.user;\n }\n\n public can(action: string): boolean {\n if (!this.user) {\n return false;\n }\n\n return this.linkProvider.can(action);\n }\n\n public async login(\n provider: string,\n options: {\n hostname?: string;\n username?: string;\n password?: string;\n redirect?: string;\n realm?: string;\n [extra: string]: any;\n },\n ): Promise<Tokens> {\n const realmParam = options.realm\n ? `&realm=${encodeURIComponent(options.realm)}`\n : \"\";\n\n if (options.username || options.password) {\n const { data } = await this.httpClient.fetch(\n `${options.hostname || \"\"}${alephaServerAuthRoutes.token}?provider=${provider}${realmParam}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n username: options.username,\n password: options.password,\n }),\n schema: { response: tokenResponseSchema },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data.api);\n this.alepha.store.set(\"alepha.server.request.user\", data.user);\n\n return data;\n }\n\n if (this.alepha.isBrowser()) {\n const browser = this.alepha.inject(ReactBrowserProvider);\n const redirect =\n options.redirect ||\n (browser.transitioning\n ? window.location.origin + browser.transitioning.to\n : window.location.href);\n\n const href = `${window.location.origin}${alephaServerAuthRoutes.login}?provider=${provider}${realmParam}&redirect_uri=${encodeURIComponent(redirect)}`;\n\n if (browser.transitioning) {\n throw new Redirection(href);\n } else {\n window.location.href = href;\n return {} as Tokens;\n }\n }\n\n throw new Redirection(\n `${alephaServerAuthRoutes.login}?provider=${provider}${realmParam}&redirect_uri=${options.redirect || \"/\"}`,\n );\n }\n\n public logout() {\n window.location.href = `${alephaServerAuthRoutes.logout}?post_logout_redirect_uri=${encodeURIComponent(window.location.origin)}`;\n }\n}\n","import { useAlepha, useStore } from \"alepha/react\";\nimport { type HttpVirtualClient, LinkProvider } from \"alepha/server/links\";\nimport { ReactAuth } from \"../services/ReactAuth.ts\";\n\nexport const useAuth = <T extends object = any>() => {\n const alepha = useAlepha();\n const [user] = useStore(\"alepha.server.request.user\");\n\n return {\n user,\n logout: () => {\n alepha.inject(ReactAuth).logout();\n },\n login: async (\n provider: keyof T,\n options: {\n username?: string;\n password?: string;\n redirect?: string;\n realm?: string;\n [extra: string]: any;\n } = {},\n ) => {\n await alepha.inject(ReactAuth).login(provider as string, options);\n },\n can: <Api extends object = any>(\n name: keyof HttpVirtualClient<Api>,\n ): boolean => {\n return alepha.inject(LinkProvider).can(name as string);\n },\n };\n};\n","import { $module } from \"alepha\";\nimport { ReactAuth } from \"./services/ReactAuth.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./index.shared.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaReactAuth = $module({\n name: \"alepha.react.auth\",\n services: [ReactAuth],\n});\n"],"mappings":";;;;;;;;;;;;AAgBA,IAAa,YAAb,MAAuB;CACrB,AAAmB,MAAM,SAAS;CAClC,AAAmB,SAAS,QAAQ,OAAO;CAC3C,AAAmB,aAAa,QAAQ,WAAW;CACnD,AAAmB,eAAe,QAAQ,aAAa;CAEvD,AAAmB,oBAAoB,MAAM;EAC3C,IAAI;EACJ,SAAS,OAAO,UAAU;AACxB,OAAI,KAAK,OAAO,WAAW,CACzB,QAAO,eAAe,MAAM,OAAO,QAAQ,EACzC,WAAW,KAAK,MACjB,CAAC;;EAGP,CAAC;CAEF,AAAmB,iBAAiB,MAAM;EACxC,IAAI;EACJ,SAAS,OAAO,EAAE,cAAc;AAC9B,OAAI,KAAK,OAAO,WAAW,IAAI,KAAK,KAElC,SAAQ,gBAAgB;;EAG7B,CAAC;;;;;;CAOF,IAAW,OAAqC;AAC9C,SAAO,KAAK,OAAO,MAAM,IAAI,6BAA6B;;CAG5D,MAAa,OAAO;EAClB,MAAM,EAAE,SAAS,MAAM,KAAK,WAAW,MACrC,uBAAuB,UACvB,EACE,QAAQ,EAAE,UAAU,wBAAwB,EAC7C,CACF;AAED,OAAK,OAAO,MAAM,IAAI,kCAAkC,KAAK,IAAI;AACjE,OAAK,OAAO,MAAM,IAAI,8BAA8B,KAAK,KAAK;AAE9D,SAAO,KAAK;;CAGd,AAAO,IAAI,QAAyB;AAClC,MAAI,CAAC,KAAK,KACR,QAAO;AAGT,SAAO,KAAK,aAAa,IAAI,OAAO;;CAGtC,MAAa,MACX,UACA,SAQiB;EACjB,MAAM,aAAa,QAAQ,QACvB,UAAU,mBAAmB,QAAQ,MAAM,KAC3C;AAEJ,MAAI,QAAQ,YAAY,QAAQ,UAAU;GACxC,MAAM,EAAE,SAAS,MAAM,KAAK,WAAW,MACrC,GAAG,QAAQ,YAAY,KAAK,uBAAuB,MAAM,YAAY,WAAW,cAChF;IACE,QAAQ;IACR,MAAM,KAAK,UAAU;KACnB,UAAU,QAAQ;KAClB,UAAU,QAAQ;KACnB,CAAC;IACF,QAAQ,EAAE,UAAU,qBAAqB;IAC1C,CACF;AAED,QAAK,OAAO,MAAM,IAAI,kCAAkC,KAAK,IAAI;AACjE,QAAK,OAAO,MAAM,IAAI,8BAA8B,KAAK,KAAK;AAE9D,UAAO;;AAGT,MAAI,KAAK,OAAO,WAAW,EAAE;GAC3B,MAAM,UAAU,KAAK,OAAO,OAAO,qBAAqB;GACxD,MAAM,WACJ,QAAQ,aACP,QAAQ,gBACL,OAAO,SAAS,SAAS,QAAQ,cAAc,KAC/C,OAAO,SAAS;GAEtB,MAAM,OAAO,GAAG,OAAO,SAAS,SAAS,uBAAuB,MAAM,YAAY,WAAW,WAAW,gBAAgB,mBAAmB,SAAS;AAEpJ,OAAI,QAAQ,cACV,OAAM,IAAI,YAAY,KAAK;QACtB;AACL,WAAO,SAAS,OAAO;AACvB,WAAO,EAAE;;;AAIb,QAAM,IAAI,YACR,GAAG,uBAAuB,MAAM,YAAY,WAAW,WAAW,gBAAgB,QAAQ,YAAY,MACvG;;CAGH,AAAO,SAAS;
|
|
1
|
+
{"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/react/auth/services/ReactAuth.ts","../../../src/react/auth/hooks/useAuth.ts","../../../src/react/auth/index.browser.ts"],"sourcesContent":["import { $hook, $inject, Alepha } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { ReactBrowserProvider, Redirection } from \"alepha/react/router\";\nimport type { UserAccountToken } from \"alepha/security\";\nimport { HttpClient } from \"alepha/server\";\nimport {\n alephaServerAuthRoutes,\n type Tokens,\n tokenResponseSchema,\n userinfoResponseSchema,\n} from \"alepha/server/auth\";\nimport { LinkProvider } from \"alepha/server/links\";\n\n/**\n * Browser, SSR friendly, service to handle authentication.\n */\nexport class ReactAuth {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly httpClient = $inject(HttpClient);\n protected readonly linkProvider = $inject(LinkProvider);\n\n protected readonly onBeginTransition = $hook({\n on: \"react:transition:begin\",\n handler: async (event) => {\n if (this.alepha.isBrowser()) {\n Object.defineProperty(event.state, \"user\", {\n get: () => this.user,\n });\n }\n },\n });\n\n protected readonly onFetchRequest = $hook({\n on: \"client:onRequest\",\n handler: async ({ request }) => {\n if (this.alepha.isBrowser() && this.user) {\n // ensure cookies are sent with requests and refresh-able\n request.credentials ??= \"include\";\n }\n },\n });\n\n /**\n * Get the current authenticated user.\n *\n * Alias for `alepha.state.get(\"user\")`\n */\n public get user(): UserAccountToken | undefined {\n return this.alepha.store.get(\"alepha.server.request.user\");\n }\n\n public async ping() {\n const { data } = await this.httpClient.fetch(\n alephaServerAuthRoutes.userinfo,\n {\n schema: { response: userinfoResponseSchema },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data.api);\n this.alepha.store.set(\"alepha.server.request.user\", data.user);\n\n return data.user;\n }\n\n public can(action: string): boolean {\n if (!this.user) {\n return false;\n }\n\n return this.linkProvider.can(action);\n }\n\n public async login(\n provider: string,\n options: {\n hostname?: string;\n username?: string;\n password?: string;\n redirect?: string;\n realm?: string;\n [extra: string]: any;\n },\n ): Promise<Tokens> {\n const realmParam = options.realm\n ? `&realm=${encodeURIComponent(options.realm)}`\n : \"\";\n\n if (options.username || options.password) {\n const { data } = await this.httpClient.fetch(\n `${options.hostname || \"\"}${alephaServerAuthRoutes.token}?provider=${provider}${realmParam}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n username: options.username,\n password: options.password,\n }),\n schema: { response: tokenResponseSchema },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data.api);\n this.alepha.store.set(\"alepha.server.request.user\", data.user);\n\n return data;\n }\n\n if (this.alepha.isBrowser()) {\n const browser = this.alepha.inject(ReactBrowserProvider);\n const redirect =\n options.redirect ||\n (browser.transitioning\n ? window.location.origin + browser.transitioning.to\n : window.location.href);\n\n const href = `${window.location.origin}${alephaServerAuthRoutes.login}?provider=${provider}${realmParam}&redirect_uri=${encodeURIComponent(redirect)}`;\n\n if (browser.transitioning) {\n throw new Redirection(href);\n } else {\n window.location.href = href;\n return {} as Tokens;\n }\n }\n\n throw new Redirection(\n `${alephaServerAuthRoutes.login}?provider=${provider}${realmParam}&redirect_uri=${options.redirect || \"/\"}`,\n );\n }\n\n public logout() {\n // Add cache-busting parameter to prevent browser from using cached redirect\n const cacheBuster = Date.now();\n window.location.href = `${alephaServerAuthRoutes.logout}?post_logout_redirect_uri=${encodeURIComponent(window.location.origin)}&_=${cacheBuster}`;\n }\n}\n","import { useAlepha, useStore } from \"alepha/react\";\nimport { type HttpVirtualClient, LinkProvider } from \"alepha/server/links\";\nimport { ReactAuth } from \"../services/ReactAuth.ts\";\n\nexport const useAuth = <T extends object = any>() => {\n const alepha = useAlepha();\n const [user] = useStore(\"alepha.server.request.user\");\n\n return {\n user,\n logout: () => {\n alepha.inject(ReactAuth).logout();\n },\n login: async (\n provider: keyof T,\n options: {\n username?: string;\n password?: string;\n redirect?: string;\n realm?: string;\n [extra: string]: any;\n } = {},\n ) => {\n await alepha.inject(ReactAuth).login(provider as string, options);\n },\n can: <Api extends object = any>(\n name: keyof HttpVirtualClient<Api>,\n ): boolean => {\n return alepha.inject(LinkProvider).can(name as string);\n },\n };\n};\n","import { $module } from \"alepha\";\nimport { ReactAuth } from \"./services/ReactAuth.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./index.shared.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaReactAuth = $module({\n name: \"alepha.react.auth\",\n services: [ReactAuth],\n});\n"],"mappings":"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"}
|
package/dist/react/auth/index.js
CHANGED
|
@@ -89,7 +89,8 @@ var ReactAuth = class {
|
|
|
89
89
|
throw new Redirection(`${alephaServerAuthRoutes.login}?provider=${provider}${realmParam}&redirect_uri=${options.redirect || "/"}`);
|
|
90
90
|
}
|
|
91
91
|
logout() {
|
|
92
|
-
|
|
92
|
+
const cacheBuster = Date.now();
|
|
93
|
+
window.location.href = `${alephaServerAuthRoutes.logout}?post_logout_redirect_uri=${encodeURIComponent(window.location.origin)}&_=${cacheBuster}`;
|
|
93
94
|
}
|
|
94
95
|
};
|
|
95
96
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/react/auth/providers/ReactAuthProvider.ts","../../../src/react/auth/services/ReactAuth.ts","../../../src/react/auth/hooks/useAuth.ts","../../../src/react/auth/index.ts"],"sourcesContent":["import { $hook, $inject, Alepha } from \"alepha\";\n\nexport class ReactAuthProvider {\n protected readonly alepha = $inject(Alepha);\n\n public readonly onRender = $hook({\n on: \"react:server:render:begin\",\n handler: async ({ request, state }) => {\n if (request?.user) {\n const { token, realm, ...user } = request.user; // do not send token and realm to the client\n this.alepha.store.set(\"alepha.server.request.user\", user); // for hydration, browser, etc...\n state.user = user;\n }\n },\n });\n}\n","import { $hook, $inject, Alepha } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { ReactBrowserProvider, Redirection } from \"alepha/react/router\";\nimport type { UserAccountToken } from \"alepha/security\";\nimport { HttpClient } from \"alepha/server\";\nimport {\n alephaServerAuthRoutes,\n type Tokens,\n tokenResponseSchema,\n userinfoResponseSchema,\n} from \"alepha/server/auth\";\nimport { LinkProvider } from \"alepha/server/links\";\n\n/**\n * Browser, SSR friendly, service to handle authentication.\n */\nexport class ReactAuth {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly httpClient = $inject(HttpClient);\n protected readonly linkProvider = $inject(LinkProvider);\n\n protected readonly onBeginTransition = $hook({\n on: \"react:transition:begin\",\n handler: async (event) => {\n if (this.alepha.isBrowser()) {\n Object.defineProperty(event.state, \"user\", {\n get: () => this.user,\n });\n }\n },\n });\n\n protected readonly onFetchRequest = $hook({\n on: \"client:onRequest\",\n handler: async ({ request }) => {\n if (this.alepha.isBrowser() && this.user) {\n // ensure cookies are sent with requests and refresh-able\n request.credentials ??= \"include\";\n }\n },\n });\n\n /**\n * Get the current authenticated user.\n *\n * Alias for `alepha.state.get(\"user\")`\n */\n public get user(): UserAccountToken | undefined {\n return this.alepha.store.get(\"alepha.server.request.user\");\n }\n\n public async ping() {\n const { data } = await this.httpClient.fetch(\n alephaServerAuthRoutes.userinfo,\n {\n schema: { response: userinfoResponseSchema },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data.api);\n this.alepha.store.set(\"alepha.server.request.user\", data.user);\n\n return data.user;\n }\n\n public can(action: string): boolean {\n if (!this.user) {\n return false;\n }\n\n return this.linkProvider.can(action);\n }\n\n public async login(\n provider: string,\n options: {\n hostname?: string;\n username?: string;\n password?: string;\n redirect?: string;\n realm?: string;\n [extra: string]: any;\n },\n ): Promise<Tokens> {\n const realmParam = options.realm\n ? `&realm=${encodeURIComponent(options.realm)}`\n : \"\";\n\n if (options.username || options.password) {\n const { data } = await this.httpClient.fetch(\n `${options.hostname || \"\"}${alephaServerAuthRoutes.token}?provider=${provider}${realmParam}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n username: options.username,\n password: options.password,\n }),\n schema: { response: tokenResponseSchema },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data.api);\n this.alepha.store.set(\"alepha.server.request.user\", data.user);\n\n return data;\n }\n\n if (this.alepha.isBrowser()) {\n const browser = this.alepha.inject(ReactBrowserProvider);\n const redirect =\n options.redirect ||\n (browser.transitioning\n ? window.location.origin + browser.transitioning.to\n : window.location.href);\n\n const href = `${window.location.origin}${alephaServerAuthRoutes.login}?provider=${provider}${realmParam}&redirect_uri=${encodeURIComponent(redirect)}`;\n\n if (browser.transitioning) {\n throw new Redirection(href);\n } else {\n window.location.href = href;\n return {} as Tokens;\n }\n }\n\n throw new Redirection(\n `${alephaServerAuthRoutes.login}?provider=${provider}${realmParam}&redirect_uri=${options.redirect || \"/\"}`,\n );\n }\n\n public logout() {\n window.location.href = `${alephaServerAuthRoutes.logout}?post_logout_redirect_uri=${encodeURIComponent(window.location.origin)}`;\n }\n}\n","import { useAlepha, useStore } from \"alepha/react\";\nimport { type HttpVirtualClient, LinkProvider } from \"alepha/server/links\";\nimport { ReactAuth } from \"../services/ReactAuth.ts\";\n\nexport const useAuth = <T extends object = any>() => {\n const alepha = useAlepha();\n const [user] = useStore(\"alepha.server.request.user\");\n\n return {\n user,\n logout: () => {\n alepha.inject(ReactAuth).logout();\n },\n login: async (\n provider: keyof T,\n options: {\n username?: string;\n password?: string;\n redirect?: string;\n realm?: string;\n [extra: string]: any;\n } = {},\n ) => {\n await alepha.inject(ReactAuth).login(provider as string, options);\n },\n can: <Api extends object = any>(\n name: keyof HttpVirtualClient<Api>,\n ): boolean => {\n return alepha.inject(LinkProvider).can(name as string);\n },\n };\n};\n","import { $module } from \"alepha\";\nimport { AlephaReact } from \"alepha/react\";\nimport type { UserAccount } from \"alepha/security\";\nimport { $auth, AlephaServerAuth } from \"alepha/server/auth\";\nimport { AlephaServerLinks } from \"alepha/server/links\";\nimport { ReactAuthProvider } from \"./providers/ReactAuthProvider.ts\";\nimport { ReactAuth } from \"./services/ReactAuth.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./index.shared.ts\";\nexport * from \"./providers/ReactAuthProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha/react/router\" {\n interface ReactRouterState {\n user?: UserAccount;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * | type | quality | stability |\n * |------|---------|-----------|\n * | frontend | rare | stable |\n *\n * Auth-related React components and hooks.\n *\n * **Features:**\n * - Login/logout components\n * - Protected route wrappers\n * - Auth state hooks\n *\n * @module alepha.react.auth\n */\nexport const AlephaReactAuth = $module({\n name: \"alepha.react.auth\",\n primitives: [$auth],\n services: [\n AlephaReact,\n AlephaServerLinks,\n AlephaServerAuth,\n ReactAuthProvider,\n ReactAuth,\n ],\n});\n"],"mappings":";;;;;;;;;AAEA,IAAa,oBAAb,MAA+B;CAC7B,AAAmB,SAAS,QAAQ,OAAO;CAE3C,AAAgB,WAAW,MAAM;EAC/B,IAAI;EACJ,SAAS,OAAO,EAAE,SAAS,YAAY;AACrC,OAAI,SAAS,MAAM;IACjB,MAAM,EAAE,OAAO,OAAO,GAAG,SAAS,QAAQ;AAC1C,SAAK,OAAO,MAAM,IAAI,8BAA8B,KAAK;AACzD,UAAM,OAAO;;;EAGlB,CAAC;;;;;;;;ACEJ,IAAa,YAAb,MAAuB;CACrB,AAAmB,MAAM,SAAS;CAClC,AAAmB,SAAS,QAAQ,OAAO;CAC3C,AAAmB,aAAa,QAAQ,WAAW;CACnD,AAAmB,eAAe,QAAQ,aAAa;CAEvD,AAAmB,oBAAoB,MAAM;EAC3C,IAAI;EACJ,SAAS,OAAO,UAAU;AACxB,OAAI,KAAK,OAAO,WAAW,CACzB,QAAO,eAAe,MAAM,OAAO,QAAQ,EACzC,WAAW,KAAK,MACjB,CAAC;;EAGP,CAAC;CAEF,AAAmB,iBAAiB,MAAM;EACxC,IAAI;EACJ,SAAS,OAAO,EAAE,cAAc;AAC9B,OAAI,KAAK,OAAO,WAAW,IAAI,KAAK,KAElC,SAAQ,gBAAgB;;EAG7B,CAAC;;;;;;CAOF,IAAW,OAAqC;AAC9C,SAAO,KAAK,OAAO,MAAM,IAAI,6BAA6B;;CAG5D,MAAa,OAAO;EAClB,MAAM,EAAE,SAAS,MAAM,KAAK,WAAW,MACrC,uBAAuB,UACvB,EACE,QAAQ,EAAE,UAAU,wBAAwB,EAC7C,CACF;AAED,OAAK,OAAO,MAAM,IAAI,kCAAkC,KAAK,IAAI;AACjE,OAAK,OAAO,MAAM,IAAI,8BAA8B,KAAK,KAAK;AAE9D,SAAO,KAAK;;CAGd,AAAO,IAAI,QAAyB;AAClC,MAAI,CAAC,KAAK,KACR,QAAO;AAGT,SAAO,KAAK,aAAa,IAAI,OAAO;;CAGtC,MAAa,MACX,UACA,SAQiB;EACjB,MAAM,aAAa,QAAQ,QACvB,UAAU,mBAAmB,QAAQ,MAAM,KAC3C;AAEJ,MAAI,QAAQ,YAAY,QAAQ,UAAU;GACxC,MAAM,EAAE,SAAS,MAAM,KAAK,WAAW,MACrC,GAAG,QAAQ,YAAY,KAAK,uBAAuB,MAAM,YAAY,WAAW,cAChF;IACE,QAAQ;IACR,MAAM,KAAK,UAAU;KACnB,UAAU,QAAQ;KAClB,UAAU,QAAQ;KACnB,CAAC;IACF,QAAQ,EAAE,UAAU,qBAAqB;IAC1C,CACF;AAED,QAAK,OAAO,MAAM,IAAI,kCAAkC,KAAK,IAAI;AACjE,QAAK,OAAO,MAAM,IAAI,8BAA8B,KAAK,KAAK;AAE9D,UAAO;;AAGT,MAAI,KAAK,OAAO,WAAW,EAAE;GAC3B,MAAM,UAAU,KAAK,OAAO,OAAO,qBAAqB;GACxD,MAAM,WACJ,QAAQ,aACP,QAAQ,gBACL,OAAO,SAAS,SAAS,QAAQ,cAAc,KAC/C,OAAO,SAAS;GAEtB,MAAM,OAAO,GAAG,OAAO,SAAS,SAAS,uBAAuB,MAAM,YAAY,WAAW,WAAW,gBAAgB,mBAAmB,SAAS;AAEpJ,OAAI,QAAQ,cACV,OAAM,IAAI,YAAY,KAAK;QACtB;AACL,WAAO,SAAS,OAAO;AACvB,WAAO,EAAE;;;AAIb,QAAM,IAAI,YACR,GAAG,uBAAuB,MAAM,YAAY,WAAW,WAAW,gBAAgB,QAAQ,YAAY,MACvG;;CAGH,AAAO,SAAS;
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/react/auth/providers/ReactAuthProvider.ts","../../../src/react/auth/services/ReactAuth.ts","../../../src/react/auth/hooks/useAuth.ts","../../../src/react/auth/index.ts"],"sourcesContent":["import { $hook, $inject, Alepha } from \"alepha\";\n\nexport class ReactAuthProvider {\n protected readonly alepha = $inject(Alepha);\n\n public readonly onRender = $hook({\n on: \"react:server:render:begin\",\n handler: async ({ request, state }) => {\n if (request?.user) {\n const { token, realm, ...user } = request.user; // do not send token and realm to the client\n this.alepha.store.set(\"alepha.server.request.user\", user); // for hydration, browser, etc...\n state.user = user;\n }\n },\n });\n}\n","import { $hook, $inject, Alepha } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { ReactBrowserProvider, Redirection } from \"alepha/react/router\";\nimport type { UserAccountToken } from \"alepha/security\";\nimport { HttpClient } from \"alepha/server\";\nimport {\n alephaServerAuthRoutes,\n type Tokens,\n tokenResponseSchema,\n userinfoResponseSchema,\n} from \"alepha/server/auth\";\nimport { LinkProvider } from \"alepha/server/links\";\n\n/**\n * Browser, SSR friendly, service to handle authentication.\n */\nexport class ReactAuth {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly httpClient = $inject(HttpClient);\n protected readonly linkProvider = $inject(LinkProvider);\n\n protected readonly onBeginTransition = $hook({\n on: \"react:transition:begin\",\n handler: async (event) => {\n if (this.alepha.isBrowser()) {\n Object.defineProperty(event.state, \"user\", {\n get: () => this.user,\n });\n }\n },\n });\n\n protected readonly onFetchRequest = $hook({\n on: \"client:onRequest\",\n handler: async ({ request }) => {\n if (this.alepha.isBrowser() && this.user) {\n // ensure cookies are sent with requests and refresh-able\n request.credentials ??= \"include\";\n }\n },\n });\n\n /**\n * Get the current authenticated user.\n *\n * Alias for `alepha.state.get(\"user\")`\n */\n public get user(): UserAccountToken | undefined {\n return this.alepha.store.get(\"alepha.server.request.user\");\n }\n\n public async ping() {\n const { data } = await this.httpClient.fetch(\n alephaServerAuthRoutes.userinfo,\n {\n schema: { response: userinfoResponseSchema },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data.api);\n this.alepha.store.set(\"alepha.server.request.user\", data.user);\n\n return data.user;\n }\n\n public can(action: string): boolean {\n if (!this.user) {\n return false;\n }\n\n return this.linkProvider.can(action);\n }\n\n public async login(\n provider: string,\n options: {\n hostname?: string;\n username?: string;\n password?: string;\n redirect?: string;\n realm?: string;\n [extra: string]: any;\n },\n ): Promise<Tokens> {\n const realmParam = options.realm\n ? `&realm=${encodeURIComponent(options.realm)}`\n : \"\";\n\n if (options.username || options.password) {\n const { data } = await this.httpClient.fetch(\n `${options.hostname || \"\"}${alephaServerAuthRoutes.token}?provider=${provider}${realmParam}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n username: options.username,\n password: options.password,\n }),\n schema: { response: tokenResponseSchema },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data.api);\n this.alepha.store.set(\"alepha.server.request.user\", data.user);\n\n return data;\n }\n\n if (this.alepha.isBrowser()) {\n const browser = this.alepha.inject(ReactBrowserProvider);\n const redirect =\n options.redirect ||\n (browser.transitioning\n ? window.location.origin + browser.transitioning.to\n : window.location.href);\n\n const href = `${window.location.origin}${alephaServerAuthRoutes.login}?provider=${provider}${realmParam}&redirect_uri=${encodeURIComponent(redirect)}`;\n\n if (browser.transitioning) {\n throw new Redirection(href);\n } else {\n window.location.href = href;\n return {} as Tokens;\n }\n }\n\n throw new Redirection(\n `${alephaServerAuthRoutes.login}?provider=${provider}${realmParam}&redirect_uri=${options.redirect || \"/\"}`,\n );\n }\n\n public logout() {\n // Add cache-busting parameter to prevent browser from using cached redirect\n const cacheBuster = Date.now();\n window.location.href = `${alephaServerAuthRoutes.logout}?post_logout_redirect_uri=${encodeURIComponent(window.location.origin)}&_=${cacheBuster}`;\n }\n}\n","import { useAlepha, useStore } from \"alepha/react\";\nimport { type HttpVirtualClient, LinkProvider } from \"alepha/server/links\";\nimport { ReactAuth } from \"../services/ReactAuth.ts\";\n\nexport const useAuth = <T extends object = any>() => {\n const alepha = useAlepha();\n const [user] = useStore(\"alepha.server.request.user\");\n\n return {\n user,\n logout: () => {\n alepha.inject(ReactAuth).logout();\n },\n login: async (\n provider: keyof T,\n options: {\n username?: string;\n password?: string;\n redirect?: string;\n realm?: string;\n [extra: string]: any;\n } = {},\n ) => {\n await alepha.inject(ReactAuth).login(provider as string, options);\n },\n can: <Api extends object = any>(\n name: keyof HttpVirtualClient<Api>,\n ): boolean => {\n return alepha.inject(LinkProvider).can(name as string);\n },\n };\n};\n","import { $module } from \"alepha\";\nimport { AlephaReact } from \"alepha/react\";\nimport type { UserAccount } from \"alepha/security\";\nimport { $auth, AlephaServerAuth } from \"alepha/server/auth\";\nimport { AlephaServerLinks } from \"alepha/server/links\";\nimport { ReactAuthProvider } from \"./providers/ReactAuthProvider.ts\";\nimport { ReactAuth } from \"./services/ReactAuth.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./index.shared.ts\";\nexport * from \"./providers/ReactAuthProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha/react/router\" {\n interface ReactRouterState {\n user?: UserAccount;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * | type | quality | stability |\n * |------|---------|-----------|\n * | frontend | rare | stable |\n *\n * Auth-related React components and hooks.\n *\n * **Features:**\n * - Login/logout components\n * - Protected route wrappers\n * - Auth state hooks\n *\n * @module alepha.react.auth\n */\nexport const AlephaReactAuth = $module({\n name: \"alepha.react.auth\",\n primitives: [$auth],\n services: [\n AlephaReact,\n AlephaServerLinks,\n AlephaServerAuth,\n ReactAuthProvider,\n ReactAuth,\n ],\n});\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as alepha0 from "alepha";
|
|
2
2
|
import { Alepha, Async, Atom, Hook, Hooks, Service, State, Static, TAtomObject } from "alepha";
|
|
3
|
-
import * as
|
|
3
|
+
import * as react2 from "react";
|
|
4
4
|
import React, { DependencyList, ErrorInfo, PropsWithChildren, ReactNode } from "react";
|
|
5
5
|
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
6
6
|
import { DurationLike } from "alepha/datetime";
|
|
@@ -82,7 +82,7 @@ declare class ErrorBoundary extends React.Component<PropsWithChildren<ErrorBound
|
|
|
82
82
|
/**
|
|
83
83
|
* React context to provide the Alepha instance throughout the component tree.
|
|
84
84
|
*/
|
|
85
|
-
declare const AlephaContext:
|
|
85
|
+
declare const AlephaContext: react2.Context<Alepha | undefined>;
|
|
86
86
|
//#endregion
|
|
87
87
|
//#region ../../src/react/core/contexts/AlephaProvider.d.ts
|
|
88
88
|
interface AlephaProviderProps {
|
|
@@ -95,7 +95,7 @@ interface AlephaProviderProps {
|
|
|
95
95
|
*
|
|
96
96
|
* This isn't recommended for apps using `alepha/react/router`, as Router will handle this for you.
|
|
97
97
|
*/
|
|
98
|
-
declare const AlephaProvider: (props: AlephaProviderProps) => string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean |
|
|
98
|
+
declare const AlephaProvider: (props: AlephaProviderProps) => string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react2.ReactPortal | react2.ReactElement<unknown, string | react2.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime0.JSX.Element | null | undefined;
|
|
99
99
|
//#endregion
|
|
100
100
|
//#region ../../src/react/core/hooks/useAction.d.ts
|
|
101
101
|
/**
|
|
@@ -1135,6 +1135,12 @@ declare const ssrManifestAtomSchema: alepha6.TObject<{
|
|
|
1135
1135
|
imports: alepha6.TOptional<alepha6.TArray<alepha6.TString>>;
|
|
1136
1136
|
css: alepha6.TOptional<alepha6.TArray<alepha6.TString>>;
|
|
1137
1137
|
}>>>;
|
|
1138
|
+
/**
|
|
1139
|
+
* Dev mode head content.
|
|
1140
|
+
* Contains pre-transformed scripts injected by Vite and plugins (React, etc.).
|
|
1141
|
+
* Only set in dev mode via ViteDevServerProvider.
|
|
1142
|
+
*/
|
|
1143
|
+
devHead: alepha6.TOptional<alepha6.TString>;
|
|
1138
1144
|
}>;
|
|
1139
1145
|
/**
|
|
1140
1146
|
* Type for the SSR manifest schema.
|
|
@@ -1160,6 +1166,10 @@ declare class SSRManifestProvider {
|
|
|
1160
1166
|
* This ensures the manifest is available even when set after module load.
|
|
1161
1167
|
*/
|
|
1162
1168
|
protected get manifest(): Static<SsrManifestAtomSchema>;
|
|
1169
|
+
/**
|
|
1170
|
+
* Get the full manifest object.
|
|
1171
|
+
*/
|
|
1172
|
+
getManifest(): Static<SsrManifestAtomSchema>;
|
|
1163
1173
|
/**
|
|
1164
1174
|
* Get the base path for assets (from Vite's base config).
|
|
1165
1175
|
* Returns empty string if base is "/" (default), otherwise returns the base path.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/react/router/constants/PAGE_PRELOAD_KEY.ts","../../../src/react/router/errors/Redirection.ts","../../../src/react/router/providers/ReactPageProvider.ts","../../../src/react/router/services/ReactPageService.ts","../../../src/react/router/primitives/$page.ts","../../../src/react/router/services/ReactRouter.ts","../../../src/react/router/providers/ReactBrowserRouterProvider.ts","../../../src/react/router/providers/ReactBrowserProvider.ts","../../../src/react/router/components/ErrorViewer.tsx","../../../src/react/router/components/Link.tsx","../../../src/react/router/components/NestedView.tsx","../../../src/react/router/components/NotFound.tsx","../../../src/react/router/contexts/RouterLayerContext.ts","../../../src/react/router/hooks/useActive.ts","../../../src/react/router/hooks/useQueryParams.ts","../../../src/react/router/hooks/useRouter.ts","../../../src/react/router/hooks/useRouterState.ts","../../../src/react/router/atoms/ssrManifestAtom.ts","../../../src/react/router/providers/SSRManifestProvider.ts","../../../src/react/router/providers/ReactPreloadProvider.ts","../../../src/system/providers/FileSystemProvider.ts","../../../src/react/router/providers/ReactServerTemplateProvider.ts","../../../src/react/router/providers/ReactServerProvider.ts","../../../src/react/router/index.ts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/react/router/constants/PAGE_PRELOAD_KEY.ts","../../../src/react/router/errors/Redirection.ts","../../../src/react/router/providers/ReactPageProvider.ts","../../../src/react/router/services/ReactPageService.ts","../../../src/react/router/primitives/$page.ts","../../../src/react/router/services/ReactRouter.ts","../../../src/react/router/providers/ReactBrowserRouterProvider.ts","../../../src/react/router/providers/ReactBrowserProvider.ts","../../../src/react/router/components/ErrorViewer.tsx","../../../src/react/router/components/Link.tsx","../../../src/react/router/components/NestedView.tsx","../../../src/react/router/components/NotFound.tsx","../../../src/react/router/contexts/RouterLayerContext.ts","../../../src/react/router/hooks/useActive.ts","../../../src/react/router/hooks/useQueryParams.ts","../../../src/react/router/hooks/useRouter.ts","../../../src/react/router/hooks/useRouterState.ts","../../../src/react/router/atoms/ssrManifestAtom.ts","../../../src/react/router/providers/SSRManifestProvider.ts","../../../src/react/router/providers/ReactPreloadProvider.ts","../../../src/system/providers/FileSystemProvider.ts","../../../src/react/router/providers/ReactServerTemplateProvider.ts","../../../src/react/router/providers/ReactServerProvider.ts","../../../src/react/router/index.ts"],"mappings":"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"}
|
|
@@ -1452,7 +1452,8 @@ const ssrManifestAtomSchema = t.object({
|
|
|
1452
1452
|
isEntry: t.optional(t.boolean()),
|
|
1453
1453
|
imports: t.optional(t.array(t.string())),
|
|
1454
1454
|
css: t.optional(t.array(t.string()))
|
|
1455
|
-
})))
|
|
1455
|
+
}))),
|
|
1456
|
+
devHead: t.optional(t.string())
|
|
1456
1457
|
});
|
|
1457
1458
|
/**
|
|
1458
1459
|
* SSR Manifest atom containing all manifest data for SSR module preloading.
|
|
@@ -1495,6 +1496,12 @@ var SSRManifestProvider = class {
|
|
|
1495
1496
|
return this.alepha.store.get(ssrManifestAtom) ?? {};
|
|
1496
1497
|
}
|
|
1497
1498
|
/**
|
|
1499
|
+
* Get the full manifest object.
|
|
1500
|
+
*/
|
|
1501
|
+
getManifest() {
|
|
1502
|
+
return this.manifest;
|
|
1503
|
+
}
|
|
1504
|
+
/**
|
|
1498
1505
|
* Get the base path for assets (from Vite's base config).
|
|
1499
1506
|
* Returns empty string if base is "/" (default), otherwise returns the base path.
|
|
1500
1507
|
*/
|
|
@@ -3949,18 +3956,21 @@ var ReactServerProvider = class {
|
|
|
3949
3956
|
* allowing the browser to start downloading entry.js and CSS files early.
|
|
3950
3957
|
*/
|
|
3951
3958
|
setupEarlyHeadContent() {
|
|
3952
|
-
const assets = this.ssrManifestProvider.getEntryAssets();
|
|
3953
3959
|
const globalHead = this.serverHeadProvider.resolveGlobalHead();
|
|
3960
|
+
const manifest = this.ssrManifestProvider.getManifest();
|
|
3961
|
+
if (manifest.devHead) {
|
|
3962
|
+
this.templateProvider.setEarlyHeadContent(`${manifest.devHead}\n`, globalHead);
|
|
3963
|
+
this.log.debug("Early head content set (dev mode)");
|
|
3964
|
+
return;
|
|
3965
|
+
}
|
|
3954
3966
|
const parts = [];
|
|
3967
|
+
const assets = this.ssrManifestProvider.getEntryAssets();
|
|
3955
3968
|
if (assets) {
|
|
3956
3969
|
for (const css of assets.css) parts.push(`<link rel="stylesheet" href="${css}" crossorigin="">`);
|
|
3957
3970
|
if (assets.js) parts.push(`<script type="module" crossorigin="" src="${assets.js}"><\/script>`);
|
|
3958
3971
|
}
|
|
3959
3972
|
this.templateProvider.setEarlyHeadContent(parts.length > 0 ? `${parts.join("\n")}\n` : "", globalHead);
|
|
3960
|
-
this.log.debug("Early head content set", {
|
|
3961
|
-
css: assets?.css.length ?? 0,
|
|
3962
|
-
js: assets?.js ? 1 : 0
|
|
3963
|
-
});
|
|
3973
|
+
this.log.debug("Early head content set", { parts: parts.length });
|
|
3964
3974
|
}
|
|
3965
3975
|
/**
|
|
3966
3976
|
* Get the public directory path where static files are located.
|