@t4h.framework/dev 0.0.0-experimental-29d0277 → 0.0.0-experimental-20261019200538

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.
Files changed (136) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +19 -95
  3. package/dist/AppProcess.d.ts +2 -16
  4. package/dist/AppProcess.js +4 -31
  5. package/dist/AppProcess.js.map +1 -1
  6. package/dist/Server.d.ts +0 -5
  7. package/dist/Server.js +0 -15
  8. package/dist/Server.js.map +1 -1
  9. package/dist/constants/server.d.ts +1 -14
  10. package/dist/constants/server.js +1 -14
  11. package/dist/constants/server.js.map +1 -1
  12. package/dist/index.d.ts +0 -6
  13. package/dist/index.js +0 -5
  14. package/dist/index.js.map +1 -1
  15. package/dist/integrations/orm.js +1 -12
  16. package/dist/integrations/orm.js.map +1 -1
  17. package/dist/models/FrameworkConfig.d.ts +0 -20
  18. package/dist/models/FrameworkConfig.js +0 -2
  19. package/dist/models/FrameworkConfig.js.map +1 -1
  20. package/dist/models/JSONRPCServer.d.ts +1 -0
  21. package/dist/models/JSONRPCServer.js +13 -10
  22. package/dist/models/JSONRPCServer.js.map +1 -1
  23. package/dist/models/claims/DevCacheClaim.d.ts +1 -2
  24. package/dist/models/claims/DevCacheClaim.js +6 -17
  25. package/dist/models/claims/DevCacheClaim.js.map +1 -1
  26. package/dist/models/claims/DevORMClaim.d.ts +8 -5
  27. package/dist/models/claims/DevORMClaim.js +67 -32
  28. package/dist/models/claims/DevORMClaim.js.map +1 -1
  29. package/dist/models/claims/DevSmtpSendEmailClaim.js +2 -1
  30. package/dist/models/claims/DevSmtpSendEmailClaim.js.map +1 -1
  31. package/dist/models/claims/DevWorkflowClaim.d.ts +1 -1
  32. package/dist/models/claims/DevWorkflowClaim.js +3 -2
  33. package/dist/models/claims/DevWorkflowClaim.js.map +1 -1
  34. package/dist/services/CallbackToken.service.d.ts +1 -4
  35. package/dist/services/CallbackToken.service.js +3 -10
  36. package/dist/services/CallbackToken.service.js.map +1 -1
  37. package/dist/services/Database.service.d.ts +0 -8
  38. package/dist/services/Database.service.js +3 -18
  39. package/dist/services/Database.service.js.map +1 -1
  40. package/dist/services/WorkflowRunAsyncActivityFacade.service.d.ts +0 -2
  41. package/dist/services/WorkflowRunAsyncActivityFacade.service.js +0 -6
  42. package/dist/services/WorkflowRunAsyncActivityFacade.service.js.map +1 -1
  43. package/dist/services/WorkflowRunEvents.service.d.ts +0 -9
  44. package/dist/services/WorkflowRunEvents.service.js +2 -13
  45. package/dist/services/WorkflowRunEvents.service.js.map +1 -1
  46. package/dist/services/WorkflowRunFacade.service.d.ts +0 -1
  47. package/dist/services/WorkflowRunFacade.service.js +0 -3
  48. package/dist/services/WorkflowRunFacade.service.js.map +1 -1
  49. package/dist/tools/find-workflow-by-id.d.ts +1 -1
  50. package/dist/transport/AppProcessJsonRpc.js +4 -17
  51. package/dist/transport/AppProcessJsonRpc.js.map +1 -1
  52. package/dist/use-cases/BuildWorkflowRunActivityHistory.usecase.js +1 -7
  53. package/dist/use-cases/BuildWorkflowRunActivityHistory.usecase.js.map +1 -1
  54. package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.d.ts +5 -3
  55. package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.js +10 -6
  56. package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.js.map +1 -1
  57. package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.d.ts +9 -3
  58. package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.js +39 -7
  59. package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.js.map +1 -1
  60. package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.d.ts +5 -5
  61. package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js +15 -29
  62. package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js.map +1 -1
  63. package/dist/use-cases/NextTickWorkflowRun.usecase.d.ts +1 -6
  64. package/dist/use-cases/NextTickWorkflowRun.usecase.js +3 -54
  65. package/dist/use-cases/NextTickWorkflowRun.usecase.js.map +1 -1
  66. package/dist/use-cases/ReceiveWorkflowEvent.usecase.d.ts +3 -10
  67. package/dist/use-cases/ReceiveWorkflowEvent.usecase.js +18 -45
  68. package/dist/use-cases/ReceiveWorkflowEvent.usecase.js.map +1 -1
  69. package/dist/workers/app-process.d.ts +0 -8
  70. package/dist/workers/app-process.js +21 -119
  71. package/dist/workers/app-process.js.map +1 -1
  72. package/package.json +25 -27
  73. package/LICENSE +0 -21
  74. package/dist/HeadlessApp.d.ts +0 -65
  75. package/dist/HeadlessApp.js +0 -166
  76. package/dist/HeadlessApp.js.map +0 -1
  77. package/dist/models/DevORMStore.d.ts +0 -18
  78. package/dist/models/DevORMStore.js +0 -7
  79. package/dist/models/DevORMStore.js.map +0 -1
  80. package/dist/models/LocalWorkflowRunJobExecutor.d.ts +0 -10
  81. package/dist/models/LocalWorkflowRunJobExecutor.js +0 -23
  82. package/dist/models/LocalWorkflowRunJobExecutor.js.map +0 -1
  83. package/dist/models/PostgresDevORMStore.d.ts +0 -23
  84. package/dist/models/PostgresDevORMStore.js +0 -94
  85. package/dist/models/PostgresDevORMStore.js.map +0 -1
  86. package/dist/models/RuntimeControlServer.d.ts +0 -32
  87. package/dist/models/RuntimeControlServer.js +0 -75
  88. package/dist/models/RuntimeControlServer.js.map +0 -1
  89. package/dist/models/RuntimeDebugLog.d.ts +0 -10
  90. package/dist/models/RuntimeDebugLog.js +0 -32
  91. package/dist/models/RuntimeDebugLog.js.map +0 -1
  92. package/dist/models/RuntimeEvent.d.ts +0 -95
  93. package/dist/models/RuntimeEvent.js +0 -2
  94. package/dist/models/RuntimeEvent.js.map +0 -1
  95. package/dist/models/SqliteDevORMStore.d.ts +0 -16
  96. package/dist/models/SqliteDevORMStore.js +0 -69
  97. package/dist/models/SqliteDevORMStore.js.map +0 -1
  98. package/dist/models/WorkflowRunJob.d.ts +0 -95
  99. package/dist/models/WorkflowRunJob.js +0 -2
  100. package/dist/models/WorkflowRunJob.js.map +0 -1
  101. package/dist/models/WorkflowWorkerPool.d.ts +0 -39
  102. package/dist/models/WorkflowWorkerPool.js +0 -154
  103. package/dist/models/WorkflowWorkerPool.js.map +0 -1
  104. package/dist/services/RuntimeEvents.service.d.ts +0 -16
  105. package/dist/services/RuntimeEvents.service.js +0 -35
  106. package/dist/services/RuntimeEvents.service.js.map +0 -1
  107. package/dist/services/WorkflowRunScheduler.service.d.ts +0 -62
  108. package/dist/services/WorkflowRunScheduler.service.js +0 -278
  109. package/dist/services/WorkflowRunScheduler.service.js.map +0 -1
  110. package/dist/tools/format-runtime-event.d.ts +0 -3
  111. package/dist/tools/format-runtime-event.js +0 -51
  112. package/dist/tools/format-runtime-event.js.map +0 -1
  113. package/dist/tools/run-workflow-run-job.d.ts +0 -3
  114. package/dist/tools/run-workflow-run-job.js +0 -25
  115. package/dist/tools/run-workflow-run-job.js.map +0 -1
  116. package/dist/tools/runtime-control-client.d.ts +0 -15
  117. package/dist/tools/runtime-control-client.js +0 -54
  118. package/dist/tools/runtime-control-client.js.map +0 -1
  119. package/dist/tools/runtime-registry.d.ts +0 -28
  120. package/dist/tools/runtime-registry.js +0 -57
  121. package/dist/tools/runtime-registry.js.map +0 -1
  122. package/dist/tools/start-runtime-monitor.d.ts +0 -13
  123. package/dist/tools/start-runtime-monitor.js +0 -70
  124. package/dist/tools/start-runtime-monitor.js.map +0 -1
  125. package/dist/tools/to-orm-config.d.ts +0 -3
  126. package/dist/tools/to-orm-config.js +0 -13
  127. package/dist/tools/to-orm-config.js.map +0 -1
  128. package/dist/tools/to-runtime-config.d.ts +0 -3
  129. package/dist/tools/to-runtime-config.js +0 -13
  130. package/dist/tools/to-runtime-config.js.map +0 -1
  131. package/dist/use-cases/RejectAbandonedWorkflowRuns.usecase.d.ts +0 -14
  132. package/dist/use-cases/RejectAbandonedWorkflowRuns.usecase.js +0 -55
  133. package/dist/use-cases/RejectAbandonedWorkflowRuns.usecase.js.map +0 -1
  134. package/dist/workers/workflow-worker.d.ts +0 -1
  135. package/dist/workers/workflow-worker.js +0 -58
  136. package/dist/workers/workflow-worker.js.map +0 -1
@@ -1,166 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { pathToFileURL } from 'node:url';
4
- import { stripVTControlCharacters } from 'node:util';
5
- import { AppProcess } from './AppProcess.js';
6
- import { JSONRPCError } from './models/JSONRPCError.js';
7
- import { loadFrameworkConfig } from './tools/load-framework-config.js';
8
- import { mkdirOutDirProjectFromTsConfigPathAndJsonPackagePath } from './tools/mkdir-out-dir-project-from-ts-config-path-and-json-package-path.js';
9
- import { resolvePackageJsonPath } from './tools/resolve-package-json-path.js';
10
- import { resolveTsconfigFromPackageJsonPath } from './tools/resolve-tsconfig-path-from-package-json-path.js';
11
- import { toORMConfig } from './tools/to-orm-config.js';
12
- import { toRuntimeConfig } from './tools/to-runtime-config.js';
13
- import { tsBuild } from './tools/ts-build.js';
14
- const PAGE_LIMIT = 100;
15
- export const DEFAULT_HEADLESS_RUN_TIMEOUT_IN_MS = 60_000;
16
- export class HeadlessAppError extends Error {
17
- status;
18
- details;
19
- name = 'HeadlessAppError';
20
- constructor(message, status, details) {
21
- super(message);
22
- this.status = status;
23
- this.details = details;
24
- }
25
- }
26
- /**
27
- * Builds the project once and loads it in an app process without the HTTP
28
- * server or the panel, to start workflows from code or a terminal.
29
- */
30
- export class HeadlessApp {
31
- appProcess;
32
- manifest;
33
- outDir;
34
- constructor(appProcess, manifest, outDir = null) {
35
- this.appProcess = appProcess;
36
- this.manifest = manifest;
37
- this.outDir = outDir;
38
- }
39
- static async up({ entrypoint, env = {}, debugLog, }) {
40
- const packageJsonPath = await resolvePackageJsonPath(entrypoint);
41
- const tsConfigPath = await resolveTsconfigFromPackageJsonPath(packageJsonPath);
42
- const projectDir = path.dirname(packageJsonPath);
43
- const config = await loadFrameworkConfig(projectDir);
44
- const runtime = toRuntimeConfig(config.runtime);
45
- const orm = toORMConfig(config.orm);
46
- const { outDir } = await mkdirOutDirProjectFromTsConfigPathAndJsonPackagePath(tsConfigPath, packageJsonPath);
47
- const removeOutDir = () => fs.promises.rm(outDir, { recursive: true, force: true });
48
- try {
49
- const build = tsBuild(tsConfigPath, {
50
- outDir: path.join(outDir, 'dist'),
51
- sourceMap: true,
52
- declaration: false,
53
- declarationMap: false,
54
- });
55
- if (!build.ok)
56
- throw new HeadlessAppError('Build failed', undefined, {
57
- diagnostics: build.diagnostics.map(stripVTControlCharacters),
58
- });
59
- const { default: packageJson } = await import(packageJsonPath, {
60
- with: { type: 'json' },
61
- });
62
- if (typeof packageJson.main !== 'string')
63
- throw new Error('Main is not a string');
64
- const appProcess = new AppProcess({ stdout: 'stderr' });
65
- const manifest = await appProcess
66
- .up(pathToFileURL(path.join(outDir, 'dist', packageJson.main)).href, env, { runtime, orm, kind: 'headless', projectDir, debugLog })
67
- .catch(async (error) => {
68
- await appProcess.down();
69
- throw error;
70
- });
71
- return new HeadlessApp(appProcess, manifest, outDir);
72
- }
73
- catch (error) {
74
- await removeOutDir();
75
- throw error;
76
- }
77
- }
78
- get workflows() {
79
- return this.manifest.workflows;
80
- }
81
- /** Starts a run and waits until it settles or `timeoutInMs` elapses. */
82
- async run(workflowId, input, { timeoutInMs = DEFAULT_HEADLESS_RUN_TIMEOUT_IN_MS, trace = false, } = {}) {
83
- const settled = new Set();
84
- const waiters = new Map();
85
- const onUpdated = (payload) => {
86
- if (payload.status === 'running')
87
- return;
88
- settled.add(payload.id);
89
- waiters.get(payload.id)?.();
90
- };
91
- this.appProcess.on('run:updated', onUpdated);
92
- try {
93
- const { id } = await this.call('workflow.run', workflowId, input);
94
- const timedOut = !(await this.waitUntilSettled(id, settled, waiters, timeoutInMs));
95
- const run = await this.call('workflow.runs.findById', id);
96
- const activities = await this.findActivities(id);
97
- return {
98
- run,
99
- timedOut,
100
- waiting: activities.filter(isWaiting),
101
- ...(trace ? { trace: await this.trace(id, activities) } : {}),
102
- };
103
- }
104
- finally {
105
- this.appProcess.off('run:updated', onUpdated);
106
- }
107
- }
108
- async down() {
109
- await this.appProcess.down();
110
- if (this.outDir)
111
- await fs.promises.rm(this.outDir, { recursive: true, force: true });
112
- }
113
- async waitUntilSettled(id, settled, waiters, timeoutInMs) {
114
- const done = Promise.withResolvers();
115
- waiters.set(id, () => done.resolve(true));
116
- const timer = setTimeout(() => done.resolve(false), timeoutInMs);
117
- try {
118
- // The run may have settled before `workflow.run` answered.
119
- if (settled.has(id))
120
- return true;
121
- const current = await this.call('workflow.runs.findById', id);
122
- if (current.status !== 'running')
123
- return true;
124
- return await done.promise;
125
- }
126
- finally {
127
- clearTimeout(timer);
128
- waiters.delete(id);
129
- }
130
- }
131
- async trace(runId, activities) {
132
- const detailed = await Promise.all(activities.map(activity => this.call('workflow.runs.activities.findById', runId, activity.id)));
133
- const logs = await this.findAll('workflow.runs.logs.find', 'logs', runId);
134
- const children = await this.findAll('workflow.runs.find', 'runs', undefined, { parentRun: runId });
135
- return { activities: detailed, logs: logs.reverse(), children };
136
- }
137
- /** Activities in the order they ran. */
138
- async findActivities(runId) {
139
- const activities = await this.findAll('workflow.runs.activities.find', 'activities', runId);
140
- return activities.reverse();
141
- }
142
- async findAll(method, key, runId, query = {}) {
143
- const items = [];
144
- for (let offset = 0;; offset += PAGE_LIMIT) {
145
- const page = { ...query, limit: PAGE_LIMIT, offset };
146
- const result = await this.call(method, ...(runId === undefined ? [page] : [runId, page]));
147
- items.push(...result[key]);
148
- if (offset + PAGE_LIMIT >= result.count)
149
- return items;
150
- }
151
- }
152
- async call(method, ...params) {
153
- try {
154
- return await this.appProcess.call(method, ...params);
155
- }
156
- catch (error) {
157
- if (!(error instanceof JSONRPCError))
158
- throw error;
159
- throw new HeadlessAppError(error.message, error.data?.status, error.data?.details);
160
- }
161
- }
162
- }
163
- function isWaiting(activity) {
164
- return activity.kind === 'async' && activity.pendingStatus === 'pending';
165
- }
166
- //# sourceMappingURL=HeadlessApp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HeadlessApp.js","sourceRoot":"","sources":["../src/HeadlessApp.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- export interface DevORMStoredRow {
2
- id: string;
3
- /** The row encoded by the dev JSON codec. */
4
- data: string;
5
- }
6
- /** Where `DevORMClaim` keeps its rows: one `(id, data)` table per entity. */
7
- export interface DevORMStore {
8
- insert(table: string, rows: DevORMStoredRow[]): Promise<void>;
9
- get(table: string, id: string): Promise<string | null>;
10
- getMany(table: string, ids: string[]): Promise<DevORMStoredRow[]>;
11
- /** Replaces the row with what `apply` returns; a missing row is skipped. */
12
- update(table: string, id: string, apply: (data: string) => Promise<string>): Promise<void>;
13
- delete(table: string, ids: string[]): Promise<void>;
14
- /** Every row of the table, ordered by id. */
15
- scan(table: string): Promise<string[]>;
16
- close(): Promise<void>;
17
- }
18
- export declare function quoteTableName(name: string): string;
@@ -1,7 +0,0 @@
1
- const TABLE_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
2
- export function quoteTableName(name) {
3
- if (!TABLE_NAME.test(name))
4
- throw new Error(`Invalid table name: ${name}`);
5
- return `"${name}"`;
6
- }
7
- //# sourceMappingURL=DevORMStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DevORMStore.js","sourceRoot":"","sources":["../../src/models/DevORMStore.ts"],"names":[],"mappings":"AA6BA,MAAM,UAAU,GAAG,0BAA0B,CAAA;AAE7C,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAA;IAE1E,OAAO,IAAI,IAAI,GAAG,CAAA;AACpB,CAAC"}
@@ -1,10 +0,0 @@
1
- import type { WorkflowRunJob } from './WorkflowRunJob.js';
2
- import type { WorkflowRunJobExecutor } from '../services/WorkflowRunScheduler.service.js';
3
- /** Runs jobs on the current thread, one lane, `concurrency` at a time. */
4
- export declare class LocalWorkflowRunJobExecutor implements WorkflowRunJobExecutor {
5
- readonly concurrency: number;
6
- readonly lanes = 1;
7
- constructor(concurrency?: number);
8
- execute(_lane: number, job: WorkflowRunJob): Promise<unknown>;
9
- broadcast(job: WorkflowRunJob): Promise<unknown[]>;
10
- }
@@ -1,23 +0,0 @@
1
- import { setImmediate } from 'node:timers/promises';
2
- import { container } from 'pleroma';
3
- import { WORKFLOW_RUN_JOB_CONCURRENCY } from '../constants/server.js';
4
- import { WorkflowRunLockService } from '../services/WorkflowRunLock.service.js';
5
- import { runWorkflowRunJob } from '../tools/run-workflow-run-job.js';
6
- /** Runs jobs on the current thread, one lane, `concurrency` at a time. */
7
- export class LocalWorkflowRunJobExecutor {
8
- concurrency;
9
- lanes = 1;
10
- constructor(concurrency = WORKFLOW_RUN_JOB_CONCURRENCY) {
11
- this.concurrency = concurrency;
12
- }
13
- execute(_lane, job) {
14
- return container.resolve(WorkflowRunLockService).detach(async () => {
15
- await setImmediate();
16
- return runWorkflowRunJob(job);
17
- });
18
- }
19
- async broadcast(job) {
20
- return [await this.execute(0, job)];
21
- }
22
- }
23
- //# sourceMappingURL=LocalWorkflowRunJobExecutor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LocalWorkflowRunJobExecutor.js","sourceRoot":"","sources":["../../src/models/LocalWorkflowRunJobExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAGnC,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAA;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAEpE,0EAA0E;AAC1E,MAAM,OAAO,2BAA2B;IAGV;IAFZ,KAAK,GAAG,CAAC,CAAA;IAEzB,YAA4B,cAAc,4BAA4B;QAA1C,gBAAW,GAAX,WAAW,CAA+B;IAAG,CAAC;IAEnE,OAAO,CAAC,KAAa,EAAE,GAAmB;QAC/C,OAAO,SAAS,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YACjE,MAAM,YAAY,EAAE,CAAA;YAEpB,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAA;QAC/B,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,GAAmB;QACxC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IACrC,CAAC;CACF"}
@@ -1,23 +0,0 @@
1
- import { type DevORMStore, type DevORMStoredRow } from './DevORMStore.js';
2
- /**
3
- * Stores the dev ORM rows in Postgres, one `(id text, data jsonb)` table per
4
- * entity. Every workflow worker opens its own pool, sized to the jobs it runs
5
- * at once, and writes from different workers no longer wait on a file lock.
6
- */
7
- export declare class PostgresDevORMStore implements DevORMStore {
8
- private readonly pool;
9
- private readonly tables;
10
- constructor(connectionString: string, { max }?: {
11
- max?: number;
12
- });
13
- insert(table: string, rows: DevORMStoredRow[]): Promise<void>;
14
- get(table: string, id: string): Promise<string | null>;
15
- getMany(table: string, ids: string[]): Promise<DevORMStoredRow[]>;
16
- update(table: string, id: string, apply: (data: string) => Promise<string>): Promise<void>;
17
- delete(table: string, ids: string[]): Promise<void>;
18
- scan(table: string): Promise<string[]>;
19
- close(): Promise<void>;
20
- private table;
21
- private createTable;
22
- private transaction;
23
- }
@@ -1,94 +0,0 @@
1
- import pg from 'pg';
2
- import { quoteTableName, } from './DevORMStore.js';
3
- import { WORKFLOW_RUN_JOB_CONCURRENCY } from '../constants/server.js';
4
- /**
5
- * Stores the dev ORM rows in Postgres, one `(id text, data jsonb)` table per
6
- * entity. Every workflow worker opens its own pool, sized to the jobs it runs
7
- * at once, and writes from different workers no longer wait on a file lock.
8
- */
9
- export class PostgresDevORMStore {
10
- pool;
11
- tables = new Map();
12
- constructor(connectionString, { max = WORKFLOW_RUN_JOB_CONCURRENCY } = {}) {
13
- this.pool = new pg.Pool({ connectionString, max });
14
- // An idle connection dropped by the server must not crash the process.
15
- this.pool.on('error', error => console.error('[orm] Postgres connection error:', error.message));
16
- }
17
- async insert(table, rows) {
18
- if (rows.length === 0)
19
- return;
20
- await this.pool.query(`INSERT INTO ${await this.table(table)} (id, data)
21
- SELECT * FROM unnest($1::text[], $2::jsonb[])`, [rows.map(row => row.id), rows.map(row => row.data)]);
22
- }
23
- async get(table, id) {
24
- const { rows } = await this.pool.query(`SELECT data::text AS data FROM ${await this.table(table)} WHERE id = $1`, [id]);
25
- return rows[0]?.data ?? null;
26
- }
27
- async getMany(table, ids) {
28
- const { rows } = await this.pool.query(`SELECT id, data::text AS data FROM ${await this.table(table)} WHERE id = ANY($1::text[])`, [ids]);
29
- return rows;
30
- }
31
- async update(table, id, apply) {
32
- const quoted = await this.table(table);
33
- await this.transaction(async (client) => {
34
- // Locks the row so concurrent updates from other workers merge in turn.
35
- const { rows } = await client.query(`SELECT data::text AS data FROM ${quoted} WHERE id = $1 FOR UPDATE`, [id]);
36
- if (!rows[0])
37
- return;
38
- await client.query(`UPDATE ${quoted} SET data = $2::jsonb WHERE id = $1`, [id, await apply(rows[0].data)]);
39
- });
40
- }
41
- async delete(table, ids) {
42
- if (ids.length === 0)
43
- return;
44
- await this.pool.query(`DELETE FROM ${await this.table(table)} WHERE id = ANY($1::text[])`, [ids]);
45
- }
46
- async scan(table) {
47
- const { rows } = await this.pool.query(`SELECT data::text AS data FROM ${await this.table(table)} ORDER BY id`);
48
- return rows.map(row => row.data);
49
- }
50
- async close() {
51
- this.tables.clear();
52
- await this.pool.end();
53
- }
54
- table(name) {
55
- let table = this.tables.get(name);
56
- if (!table) {
57
- table = this.createTable(name);
58
- table.catch(() => this.tables.delete(name));
59
- this.tables.set(name, table);
60
- }
61
- return table;
62
- }
63
- async createTable(name) {
64
- const quoted = quoteTableName(name);
65
- await this.transaction(async (client) => {
66
- // Workers creating the same table at once would race on the catalog.
67
- await client.query('SELECT pg_advisory_xact_lock(hashtext($1))', [name]);
68
- await client.query(`CREATE TABLE IF NOT EXISTS ${quoted} (id TEXT PRIMARY KEY, data JSONB NOT NULL)`);
69
- const { rows } = await client.query(`SELECT column_name AS name, data_type AS type
70
- FROM information_schema.columns
71
- WHERE table_schema = current_schema() AND table_name = $1`, [name]);
72
- const columns = new Map(rows.map(row => [row.name, row.type]));
73
- if (columns.get('id') !== 'text' || columns.get('data') !== 'jsonb')
74
- throw new Error(`Table ${quoted} already exists without the dev ORM layout (id text, data jsonb); point orm.connectionString in framework.config at a database of its own`);
75
- });
76
- return quoted;
77
- }
78
- async transaction(fn) {
79
- const client = await this.pool.connect();
80
- try {
81
- await client.query('BEGIN');
82
- await fn(client);
83
- await client.query('COMMIT');
84
- }
85
- catch (error) {
86
- await client.query('ROLLBACK').catch(() => { });
87
- throw error;
88
- }
89
- finally {
90
- client.release();
91
- }
92
- }
93
- }
94
- //# sourceMappingURL=PostgresDevORMStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PostgresDevORMStore.js","sourceRoot":"","sources":["../../src/models/PostgresDevORMStore.ts"],"names":[],"mappings":"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"}
@@ -1,32 +0,0 @@
1
- import type { RuntimeEvent } from './RuntimeEvent.js';
2
- import type { RuntimeEventsService } from '../services/RuntimeEvents.service.js';
3
- import { type RuntimeInfo, type RuntimeStatus } from '../tools/runtime-registry.js';
4
- /** First line a client sends; the server answers with NDJSON lines. */
5
- export interface RuntimeControlRequest {
6
- method: 'status' | 'watch';
7
- }
8
- export type RuntimeControlMessage = ({
9
- type: 'status';
10
- } & RuntimeStatus) | {
11
- type: 'event';
12
- event: RuntimeEvent;
13
- } | {
14
- type: 'error';
15
- message: string;
16
- };
17
- /**
18
- * Local socket (named pipe on Windows) through which `framework runtime`
19
- * reads the status of this app process and follows its events.
20
- */
21
- export declare class RuntimeControlServer {
22
- private readonly info;
23
- private readonly status;
24
- private readonly events;
25
- private readonly server;
26
- constructor(info: RuntimeInfo, status: () => Promise<RuntimeStatus>, events: RuntimeEventsService);
27
- start(): Promise<void>;
28
- /** Synchronous so it can run in a process `exit` handler. */
29
- close(): void;
30
- private onConnection;
31
- private handle;
32
- }
@@ -1,75 +0,0 @@
1
- import fs from 'node:fs';
2
- import net from 'node:net';
3
- import { runtimeRegistryDir, runtimeRegistryFile, } from '../tools/runtime-registry.js';
4
- const send = (socket, message) => socket.write(`${JSON.stringify(message)}\n`);
5
- /**
6
- * Local socket (named pipe on Windows) through which `framework runtime`
7
- * reads the status of this app process and follows its events.
8
- */
9
- export class RuntimeControlServer {
10
- info;
11
- status;
12
- events;
13
- server;
14
- constructor(info, status, events) {
15
- this.info = info;
16
- this.status = status;
17
- this.events = events;
18
- this.server = net.createServer(socket => this.onConnection(socket));
19
- }
20
- async start() {
21
- fs.mkdirSync(runtimeRegistryDir(), { recursive: true, mode: 0o700 });
22
- if (process.platform !== 'win32')
23
- fs.rmSync(this.info.socket, { force: true });
24
- await new Promise((resolve, reject) => {
25
- this.server.once('error', reject);
26
- this.server.listen(this.info.socket, () => {
27
- this.server.off('error', reject);
28
- resolve();
29
- });
30
- });
31
- fs.writeFileSync(runtimeRegistryFile(this.info.pid), JSON.stringify(this.info, null, 2));
32
- }
33
- /** Synchronous so it can run in a process `exit` handler. */
34
- close() {
35
- this.server.close();
36
- fs.rmSync(runtimeRegistryFile(this.info.pid), { force: true });
37
- if (process.platform !== 'win32')
38
- fs.rmSync(this.info.socket, { force: true });
39
- }
40
- onConnection(socket) {
41
- let buffer = '';
42
- socket.setEncoding('utf8');
43
- socket.on('error', () => socket.destroy());
44
- const onData = (chunk) => {
45
- buffer += chunk;
46
- const end = buffer.indexOf('\n');
47
- if (end === -1)
48
- return;
49
- socket.off('data', onData);
50
- void this.handle(socket, buffer.slice(0, end));
51
- };
52
- socket.on('data', onData);
53
- }
54
- async handle(socket, line) {
55
- let request;
56
- try {
57
- request = JSON.parse(line);
58
- }
59
- catch {
60
- send(socket, { type: 'error', message: 'Invalid request' });
61
- return void socket.end();
62
- }
63
- if (request.method !== 'status' && request.method !== 'watch') {
64
- send(socket, { type: 'error', message: 'Unknown method' });
65
- return void socket.end();
66
- }
67
- send(socket, { type: 'status', ...(await this.status()) });
68
- if (request.method === 'status')
69
- return void socket.end();
70
- const forward = (event) => send(socket, { type: 'event', event });
71
- this.events.on('event', forward);
72
- socket.once('close', () => this.events.off('event', forward));
73
- }
74
- }
75
- //# sourceMappingURL=RuntimeControlServer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RuntimeControlServer.js","sourceRoot":"","sources":["../../src/models/RuntimeControlServer.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type { RuntimeEvent } from './RuntimeEvent.js';
2
- /** `-` writes readable lines to stderr; a path appends NDJSON to that file. */
3
- export declare const DEBUG_LOG_STDERR = "-";
4
- export declare class RuntimeDebugLog {
5
- private readonly toStderr;
6
- private fd;
7
- constructor(target: string);
8
- readonly write: (event: RuntimeEvent) => void;
9
- close(): void;
10
- }
@@ -1,32 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { formatRuntimeEvent } from '../tools/format-runtime-event.js';
4
- /** `-` writes readable lines to stderr; a path appends NDJSON to that file. */
5
- export const DEBUG_LOG_STDERR = '-';
6
- export class RuntimeDebugLog {
7
- toStderr;
8
- // Written synchronously: the app process may exit right after an event.
9
- fd = null;
10
- constructor(target) {
11
- this.toStderr = target === DEBUG_LOG_STDERR;
12
- if (this.toStderr)
13
- return;
14
- fs.mkdirSync(path.dirname(target), { recursive: true });
15
- this.fd = fs.openSync(target, 'a');
16
- }
17
- write = (event) => {
18
- if (this.toStderr) {
19
- process.stderr.write(`[runtime] ${formatRuntimeEvent(event)}\n`);
20
- return;
21
- }
22
- if (this.fd !== null)
23
- fs.writeSync(this.fd, `${JSON.stringify(event)}\n`);
24
- };
25
- close() {
26
- if (this.fd === null)
27
- return;
28
- fs.closeSync(this.fd);
29
- this.fd = null;
30
- }
31
- }
32
- //# sourceMappingURL=RuntimeDebugLog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RuntimeDebugLog.js","sourceRoot":"","sources":["../../src/models/RuntimeDebugLog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AAErE,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAEnC,MAAM,OAAO,eAAe;IACT,QAAQ,CAAS;IAElC,wEAAwE;IAChE,EAAE,GAAkB,IAAI,CAAA;IAEhC,YAAY,MAAc;QACxB,IAAI,CAAC,QAAQ,GAAG,MAAM,KAAK,gBAAgB,CAAA;QAE3C,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAM;QAEzB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEvD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC;IAEe,KAAK,GAAG,CAAC,KAAmB,EAAQ,EAAE;QACpD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAEhE,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI;YAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC3E,CAAC,CAAA;IAEM,KAAK;QACV,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI;YAAE,OAAM;QAE5B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAErB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA;IAChB,CAAC;CACF"}
@@ -1,95 +0,0 @@
1
- import type { WorkflowRunJobKind } from './WorkflowRunJob.js';
2
- /** A job as runtime events describe it: what it is, never its payload. */
3
- export interface RuntimeJobSummary {
4
- kind: WorkflowRunJobKind;
5
- runId: string | null;
6
- /** The activity, pending or child run the job is about, when there is one. */
7
- target: string | null;
8
- }
9
- export interface RuntimeLaneStats {
10
- lane: number;
11
- inFlight: number;
12
- pinnedRuns: number;
13
- }
14
- export interface RuntimeQueueStats {
15
- workers: number;
16
- concurrency: number;
17
- capacity: number;
18
- queued: number;
19
- urgent: number;
20
- inFlight: number;
21
- lanes: RuntimeLaneStats[];
22
- }
23
- export interface RuntimeRunningJob extends RuntimeJobSummary {
24
- lane: number;
25
- startedAt: string;
26
- }
27
- export interface RuntimeQueueSnapshot extends RuntimeQueueStats {
28
- running: RuntimeRunningJob[];
29
- waiting: RuntimeJobSummary[];
30
- }
31
- /** Something the runtime did, published on the coordinator. */
32
- export type RuntimeEventBody = {
33
- type: 'job:queued';
34
- job: RuntimeJobSummary;
35
- queue: RuntimeQueueStats;
36
- } | {
37
- type: 'job:started';
38
- job: RuntimeJobSummary;
39
- lane: number;
40
- queue: RuntimeQueueStats;
41
- } | {
42
- type: 'job:finished';
43
- job: RuntimeJobSummary;
44
- lane: number;
45
- durationInMs: number;
46
- error: string | null;
47
- queue: RuntimeQueueStats;
48
- } | {
49
- type: 'run:created';
50
- runId: string;
51
- workflow: string;
52
- parentRunId: string | null;
53
- } | {
54
- type: 'run:settled';
55
- runId: string;
56
- workflow: string;
57
- status: 'fulfilled' | 'rejected';
58
- } | {
59
- type: 'activity:started';
60
- runId: string;
61
- activityId: string;
62
- activityType: string;
63
- kind: 'sync' | 'async';
64
- } | {
65
- type: 'activity:waiting';
66
- runId: string;
67
- activityId: string;
68
- activityType: string;
69
- timeoutAt: string | null;
70
- } | {
71
- type: 'activity:settled';
72
- runId: string;
73
- activityId: string;
74
- activityType: string;
75
- status: 'fulfilled' | 'rejected';
76
- /** Why a sync activity or a bootstrap threw, when it did. */
77
- error?: string;
78
- } | {
79
- type: 'timeout:scheduled';
80
- runId: string;
81
- pendingId: string;
82
- timeoutAt: string;
83
- } | {
84
- type: 'timeout:fired';
85
- runId: string;
86
- pendingId: string;
87
- } | {
88
- type: 'worker:lost';
89
- lane: number;
90
- error: string;
91
- };
92
- export type RuntimeEvent = RuntimeEventBody & {
93
- at: string;
94
- };
95
- export type RuntimeEventType = RuntimeEvent['type'];
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=RuntimeEvent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RuntimeEvent.js","sourceRoot":"","sources":["../../src/models/RuntimeEvent.ts"],"names":[],"mappings":""}