@porulle/core 0.9.0 → 0.10.1
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/config/defaults.js +1 -1
- package/dist/config/types.d.ts +4 -3
- package/dist/config/types.d.ts.map +1 -1
- package/dist/generated/plugin-manifest.d.ts +3 -0
- package/dist/generated/plugin-manifest.d.ts.map +1 -1
- package/dist/generated/plugin-manifest.js +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/interfaces/rest/router.d.ts.map +1 -1
- package/dist/interfaces/rest/router.js +2 -0
- package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/checkout.js +1 -0
- package/dist/interfaces/rest/schemas/catalog.d.ts +391 -0
- package/dist/interfaces/rest/schemas/catalog.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/responses.d.ts +51 -0
- package/dist/interfaces/rest/schemas/responses.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/search.d.ts +17 -0
- package/dist/interfaces/rest/schemas/search.d.ts.map +1 -1
- package/dist/kernel/database/adapter.d.ts +8 -0
- package/dist/kernel/database/adapter.d.ts.map +1 -1
- package/dist/kernel/database/migrate.d.ts +1 -1
- package/dist/kernel/database/migrate.d.ts.map +1 -1
- package/dist/kernel/database/migrate.js +5 -2
- package/dist/kernel/database/scoped-db.d.ts.map +1 -1
- package/dist/kernel/database/scoped-db.js +21 -23
- package/dist/kernel/errors.d.ts +12 -0
- package/dist/kernel/errors.d.ts.map +1 -1
- package/dist/kernel/errors.js +16 -0
- package/dist/kernel/jobs/adapter.d.ts +27 -8
- package/dist/kernel/jobs/adapter.d.ts.map +1 -1
- package/dist/kernel/jobs/adapter.js +1 -2
- package/dist/kernel/jobs/drizzle-adapter.d.ts +13 -3
- package/dist/kernel/jobs/drizzle-adapter.d.ts.map +1 -1
- package/dist/kernel/jobs/drizzle-adapter.js +46 -5
- package/dist/kernel/jobs/runner.d.ts +2 -1
- package/dist/kernel/jobs/runner.d.ts.map +1 -1
- package/dist/kernel/jobs/runner.js +100 -15
- package/dist/kernel/jobs/types.d.ts +13 -0
- package/dist/kernel/jobs/types.d.ts.map +1 -1
- package/dist/kernel/plugin/manifest.d.ts +2 -0
- package/dist/kernel/plugin/manifest.d.ts.map +1 -1
- package/dist/kernel/plugin/manifest.js +9 -0
- package/dist/modules/catalog/entity-service.d.ts +1 -0
- package/dist/modules/catalog/entity-service.d.ts.map +1 -1
- package/dist/modules/catalog/entity-service.js +15 -1
- package/dist/modules/catalog/repository/index.d.ts +2 -2
- package/dist/modules/catalog/repository/index.d.ts.map +1 -1
- package/dist/modules/catalog/repository/index.js +9 -1
- package/dist/modules/catalog/schema.d.ts +51 -0
- package/dist/modules/catalog/schema.d.ts.map +1 -1
- package/dist/modules/catalog/schema.js +12 -1
- package/dist/modules/catalog/schemas.d.ts +3 -1
- package/dist/modules/catalog/schemas.d.ts.map +1 -1
- package/dist/modules/channels/adapter.d.ts +117 -0
- package/dist/modules/channels/adapter.d.ts.map +1 -0
- package/dist/modules/channels/adapter.js +3 -0
- package/dist/modules/inventory/repository/index.js +4 -4
- package/dist/modules/inventory/service.d.ts.map +1 -1
- package/dist/modules/inventory/service.js +7 -3
- package/dist/modules/orders/service.d.ts.map +1 -1
- package/dist/modules/orders/service.js +7 -4
- package/dist/modules/orders/stale-order-cleanup.d.ts.map +1 -1
- package/dist/modules/orders/stale-order-cleanup.js +25 -16
- package/dist/modules/promotions/repository/index.d.ts +1 -1
- package/dist/modules/promotions/repository/index.d.ts.map +1 -1
- package/dist/modules/promotions/repository/index.js +6 -3
- package/dist/modules/promotions/service.d.ts +1 -0
- package/dist/modules/promotions/service.d.ts.map +1 -1
- package/dist/modules/promotions/service.js +1 -1
- package/dist/modules/webhooks/repository/index.d.ts +1 -1
- package/dist/modules/webhooks/repository/index.d.ts.map +1 -1
- package/dist/modules/webhooks/repository/index.js +16 -10
- package/dist/runtime/commerce.d.ts.map +1 -1
- package/dist/runtime/commerce.js +9 -0
- package/dist/runtime/kernel.d.ts.map +1 -1
- package/dist/runtime/kernel.js +14 -2
- package/dist/runtime/server.d.ts +1 -4
- package/dist/runtime/server.d.ts.map +1 -1
- package/dist/runtime/server.js +16 -34
- package/package.json +3 -3
- package/src/config/defaults.ts +1 -1
- package/src/config/types.ts +7 -3
- package/src/generated/plugin-capabilities.d.ts +1 -0
- package/src/generated/plugin-manifest.ts +1 -0
- package/src/generated/plugin-repositories.d.ts +1 -0
- package/src/index.ts +31 -1
- package/src/interfaces/rest/router.ts +2 -0
- package/src/interfaces/rest/routes/checkout.ts +1 -0
- package/src/kernel/database/adapter.ts +8 -0
- package/src/kernel/database/migrate.ts +8 -2
- package/src/kernel/database/scoped-db.ts +25 -26
- package/src/kernel/errors.ts +20 -0
- package/src/kernel/jobs/adapter.ts +39 -8
- package/src/kernel/jobs/drizzle-adapter.ts +72 -9
- package/src/kernel/jobs/runner.ts +194 -72
- package/src/kernel/jobs/types.ts +25 -0
- package/src/kernel/plugin/manifest.ts +12 -0
- package/src/modules/catalog/entity-service.ts +9 -1
- package/src/modules/catalog/repository/index.ts +13 -3
- package/src/modules/catalog/schema.ts +33 -18
- package/src/modules/catalog/schemas.ts +3 -1
- package/src/modules/channels/adapter.ts +139 -0
- package/src/modules/inventory/repository/index.ts +4 -4
- package/src/modules/inventory/service.ts +12 -2
- package/src/modules/orders/service.ts +8 -12
- package/src/modules/orders/stale-order-cleanup.ts +35 -24
- package/src/modules/promotions/repository/index.ts +6 -2
- package/src/modules/promotions/service.ts +2 -0
- package/src/modules/webhooks/repository/index.ts +16 -14
- package/src/runtime/commerce.ts +10 -0
- package/src/runtime/kernel.ts +16 -2
- package/src/runtime/server.ts +22 -42
package/src/runtime/kernel.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { withTiming } from "../kernel/service-timing.js";
|
|
|
11
11
|
import { setBootDefaultOrgId } from "../auth/org.js";
|
|
12
12
|
import { setBootStrictOrgResolution } from "../auth/strict-org-resolution.js";
|
|
13
13
|
import { DrizzleJobsAdapter } from "../kernel/jobs/drizzle-adapter.js";
|
|
14
|
+
import type { ExecutionEngine } from "../kernel/jobs/adapter.js";
|
|
14
15
|
import { CompensationFailuresRepository } from "../kernel/compensation/repository.js";
|
|
15
16
|
|
|
16
17
|
import {
|
|
@@ -72,8 +73,21 @@ export function createKernel(config: CommerceConfig): Kernel {
|
|
|
72
73
|
const jobsTaskMap = new Map(
|
|
73
74
|
(config.jobs?.tasks ?? []).map((t) => [t.slug, t]),
|
|
74
75
|
);
|
|
75
|
-
const
|
|
76
|
-
|
|
76
|
+
const jobsEngine: ExecutionEngine =
|
|
77
|
+
config.jobs?.adapter ?? new DrizzleJobsAdapter(db);
|
|
78
|
+
const jobLogger = {
|
|
79
|
+
info: (message: string, data?: unknown) => logger.info(message, data),
|
|
80
|
+
warn: (message: string, data?: unknown) => logger.warn(message, data),
|
|
81
|
+
error: (message: string, data?: unknown) => logger.error(message, data),
|
|
82
|
+
};
|
|
83
|
+
jobsEngine.register({
|
|
84
|
+
tasks: jobsTaskMap,
|
|
85
|
+
context: { logger: jobLogger, db, services: serviceContainer },
|
|
86
|
+
...(config.jobs?.processingOrder !== undefined
|
|
87
|
+
? { processingOrder: config.jobs.processingOrder }
|
|
88
|
+
: {}),
|
|
89
|
+
});
|
|
90
|
+
serviceContainer.jobs = jobsEngine;
|
|
77
91
|
|
|
78
92
|
const topoGraph = kernelModulesForTopoSort();
|
|
79
93
|
const order = topoSortModules(topoGraph);
|
package/src/runtime/server.ts
CHANGED
|
@@ -17,7 +17,6 @@ import { createCustomerPortalRoutes } from "../interfaces/rest/customer-portal.j
|
|
|
17
17
|
import { createKernel } from "./kernel.js";
|
|
18
18
|
import { ensureDefaultOrg } from "../auth/org.js";
|
|
19
19
|
import { createLogger, type Logger } from "./logger.js";
|
|
20
|
-
import type { DrizzleDatabase } from "../kernel/database/drizzle-db.js";
|
|
21
20
|
import { createCommerce, type CommerceInstance } from "./commerce.js";
|
|
22
21
|
import { rewriteCommerceAliasRequest } from "./url-alias-rewrite.js";
|
|
23
22
|
import { mapErrorToResponse } from "../kernel/error-mapper.js";
|
|
@@ -408,48 +407,18 @@ export async function createServer(config: CommerceConfig) {
|
|
|
408
407
|
// 2. GET /api/jobs/run: cron endpoint (serverless — Vercel, Cloudflare)
|
|
409
408
|
// 3. runPendingJobs() export (custom worker process)
|
|
410
409
|
|
|
411
|
-
const
|
|
412
|
-
|
|
413
|
-
await import("../kernel/jobs/reaper.js");
|
|
414
|
-
const taskMap = new Map<string, unknown>();
|
|
415
|
-
for (const task of config.jobs?.tasks ?? []) {
|
|
416
|
-
const t = task as { slug?: string; name?: string };
|
|
417
|
-
taskMap.set(t.slug ?? t.name ?? "", task);
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
const jobLogger = {
|
|
421
|
-
info: (msg: string, data?: unknown) => logger.info(data != null ? { data } : {}, msg),
|
|
422
|
-
warn: (msg: string, data?: unknown) => logger.warn(data != null ? { data } : {}, msg),
|
|
423
|
-
error: (msg: string, data?: unknown) => logger.error(data != null ? { data } : {}, msg),
|
|
424
|
-
};
|
|
425
|
-
|
|
426
|
-
let lastStaleJobReaperAt = 0;
|
|
410
|
+
const jobsEngine = (kernel.services as Record<string, unknown>)
|
|
411
|
+
.jobs as import("../kernel/jobs/adapter.js").ExecutionEngine;
|
|
427
412
|
|
|
428
|
-
const
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
lastStaleJobReaperAt = now;
|
|
433
|
-
try {
|
|
434
|
-
await runStaleJobReaper(
|
|
435
|
-
kernel.database.db as DrizzleDatabase,
|
|
436
|
-
getJobReapThresholdMs(),
|
|
437
|
-
jobLogger,
|
|
413
|
+
const runJobs = async (queue?: string, limit?: number) => {
|
|
414
|
+
if (jobsEngine.execution.mode !== "pull") {
|
|
415
|
+
throw new Error(
|
|
416
|
+
"The configured push execution engine is driven by its native runtime and cannot be polled with runJobs().",
|
|
438
417
|
);
|
|
439
|
-
} catch (err) {
|
|
440
|
-
logger.error({ err }, "Stale job reaper failed");
|
|
441
418
|
}
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
const runJobs = async (queue?: string, limit?: number) => {
|
|
445
|
-
await maybeRunStaleJobReaper();
|
|
446
|
-
return runPendingJobs({
|
|
447
|
-
db: kernel.database.db as DrizzleDatabase,
|
|
448
|
-
tasks: taskMap as Parameters<typeof runPendingJobs>[0]["tasks"],
|
|
419
|
+
return jobsEngine.execution.run({
|
|
449
420
|
queue: queue ?? "default",
|
|
450
421
|
limit: limit ?? 10,
|
|
451
|
-
logger: jobLogger,
|
|
452
|
-
services: kernel.services as Parameters<typeof runPendingJobs>[0]["services"],
|
|
453
422
|
});
|
|
454
423
|
};
|
|
455
424
|
|
|
@@ -478,6 +447,11 @@ export async function createServer(config: CommerceConfig) {
|
|
|
478
447
|
// Strategy 2: In-process polling for long-running servers (ECS, Cloud Run, Docker).
|
|
479
448
|
// Enable via config.jobs.autorun.enabled = true
|
|
480
449
|
if (config.jobs?.autorun?.enabled) {
|
|
450
|
+
if (jobsEngine.execution.mode !== "pull") {
|
|
451
|
+
throw new Error(
|
|
452
|
+
"jobs.autorun is only valid for pull execution engines. Serve the configured push engine through its native runtime.",
|
|
453
|
+
);
|
|
454
|
+
}
|
|
481
455
|
const intervalMs = config.jobs.autorun.intervalMs ?? 10_000;
|
|
482
456
|
|
|
483
457
|
const jobInterval = setInterval(async () => {
|
|
@@ -494,10 +468,16 @@ export async function createServer(config: CommerceConfig) {
|
|
|
494
468
|
|
|
495
469
|
logger.info({ intervalMs }, "Job queue autorun started (in-process polling)");
|
|
496
470
|
} else {
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
471
|
+
if (jobsEngine.execution.mode === "push") {
|
|
472
|
+
logger.info(
|
|
473
|
+
"Push job engine registered. Serve it through its native runtime.",
|
|
474
|
+
);
|
|
475
|
+
} else {
|
|
476
|
+
logger.info(
|
|
477
|
+
"Job queue autorun disabled. Use GET /api/jobs/run for serverless cron, " +
|
|
478
|
+
"or set config.jobs.autorun.enabled = true for in-process polling.",
|
|
479
|
+
);
|
|
480
|
+
}
|
|
501
481
|
}
|
|
502
482
|
|
|
503
483
|
const dispatchFetch = app.fetch.bind(app);
|