@xemahq/temporal-runtime 0.5.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +154 -11
  2. package/dist/bin/controller-token-publisher.d.ts +3 -0
  3. package/dist/bin/controller-token-publisher.d.ts.map +1 -0
  4. package/dist/bin/controller-token-publisher.js +18 -0
  5. package/dist/bin/controller-token-publisher.js.map +1 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +12 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/lib/access-token.d.ts +11 -0
  11. package/dist/lib/access-token.d.ts.map +1 -0
  12. package/dist/lib/access-token.js +30 -0
  13. package/dist/lib/access-token.js.map +1 -0
  14. package/dist/lib/base-temporal-client.service.d.ts +3 -2
  15. package/dist/lib/base-temporal-client.service.d.ts.map +1 -1
  16. package/dist/lib/base-temporal-client.service.js +5 -5
  17. package/dist/lib/base-temporal-client.service.js.map +1 -1
  18. package/dist/lib/biome-worker.d.ts +83 -0
  19. package/dist/lib/biome-worker.d.ts.map +1 -0
  20. package/dist/lib/biome-worker.js +253 -0
  21. package/dist/lib/biome-worker.js.map +1 -0
  22. package/dist/lib/bounded-retry.d.ts +22 -0
  23. package/dist/lib/bounded-retry.d.ts.map +1 -0
  24. package/dist/lib/bounded-retry.js +67 -0
  25. package/dist/lib/bounded-retry.js.map +1 -0
  26. package/dist/lib/client-credentials-token-source.d.ts +23 -0
  27. package/dist/lib/client-credentials-token-source.d.ts.map +1 -0
  28. package/dist/lib/client-credentials-token-source.js +108 -0
  29. package/dist/lib/client-credentials-token-source.js.map +1 -0
  30. package/dist/lib/connection.d.ts +48 -9
  31. package/dist/lib/connection.d.ts.map +1 -1
  32. package/dist/lib/connection.js +153 -41
  33. package/dist/lib/connection.js.map +1 -1
  34. package/dist/lib/controller-token-publisher.d.ts +51 -0
  35. package/dist/lib/controller-token-publisher.d.ts.map +1 -0
  36. package/dist/lib/controller-token-publisher.js +116 -0
  37. package/dist/lib/controller-token-publisher.js.map +1 -0
  38. package/dist/lib/fairness-constants.d.ts +3 -0
  39. package/dist/lib/fairness-constants.d.ts.map +1 -0
  40. package/dist/lib/fairness-constants.js +6 -0
  41. package/dist/lib/fairness-constants.js.map +1 -0
  42. package/dist/lib/fairness.d.ts +13 -0
  43. package/dist/lib/fairness.d.ts.map +1 -0
  44. package/dist/lib/fairness.js +56 -0
  45. package/dist/lib/fairness.js.map +1 -0
  46. package/dist/lib/namespace.d.ts +4 -0
  47. package/dist/lib/namespace.d.ts.map +1 -0
  48. package/dist/lib/namespace.js +18 -0
  49. package/dist/lib/namespace.js.map +1 -0
  50. package/dist/lib/org-erasure.d.ts +13 -0
  51. package/dist/lib/org-erasure.d.ts.map +1 -0
  52. package/dist/lib/org-erasure.js +68 -0
  53. package/dist/lib/org-erasure.js.map +1 -0
  54. package/dist/lib/proactive-token-refresher.d.ts +47 -0
  55. package/dist/lib/proactive-token-refresher.d.ts.map +1 -0
  56. package/dist/lib/proactive-token-refresher.js +147 -0
  57. package/dist/lib/proactive-token-refresher.js.map +1 -0
  58. package/dist/lib/search-attribute-constants.d.ts +3 -0
  59. package/dist/lib/search-attribute-constants.d.ts.map +1 -0
  60. package/dist/lib/search-attribute-constants.js +6 -0
  61. package/dist/lib/search-attribute-constants.js.map +1 -0
  62. package/dist/lib/search-attributes.d.ts +4 -18
  63. package/dist/lib/search-attributes.d.ts.map +1 -1
  64. package/dist/lib/search-attributes.js +33 -40
  65. package/dist/lib/search-attributes.js.map +1 -1
  66. package/dist/lib/standalone-activity.d.ts +23 -0
  67. package/dist/lib/standalone-activity.d.ts.map +1 -0
  68. package/dist/lib/standalone-activity.js +48 -0
  69. package/dist/lib/standalone-activity.js.map +1 -0
  70. package/dist/lib/versioned-worker.d.ts +26 -0
  71. package/dist/lib/versioned-worker.d.ts.map +1 -0
  72. package/dist/lib/versioned-worker.js +60 -0
  73. package/dist/lib/versioned-worker.js.map +1 -0
  74. package/dist/lib/worker-deployment-version.d.ts +8 -0
  75. package/dist/lib/worker-deployment-version.d.ts.map +1 -0
  76. package/dist/lib/worker-deployment-version.js +45 -0
  77. package/dist/lib/worker-deployment-version.js.map +1 -0
  78. package/dist/lib/worker.d.ts +7 -7
  79. package/dist/lib/worker.d.ts.map +1 -1
  80. package/dist/lib/worker.js +33 -37
  81. package/dist/lib/worker.js.map +1 -1
  82. package/dist/lib/workflow-interceptors/fairness-guard.d.ts +4 -0
  83. package/dist/lib/workflow-interceptors/fairness-guard.d.ts.map +1 -0
  84. package/dist/lib/workflow-interceptors/fairness-guard.js +65 -0
  85. package/dist/lib/workflow-interceptors/fairness-guard.js.map +1 -0
  86. package/dist/lib/workflow-interceptors/fairness-propagation.d.ts +3 -0
  87. package/dist/lib/workflow-interceptors/fairness-propagation.d.ts.map +1 -0
  88. package/dist/lib/workflow-interceptors/fairness-propagation.js +6 -0
  89. package/dist/lib/workflow-interceptors/fairness-propagation.js.map +1 -0
  90. package/dist/lib/workflow-interceptors/org-fairness-required.d.ts +3 -0
  91. package/dist/lib/workflow-interceptors/org-fairness-required.d.ts.map +1 -0
  92. package/dist/lib/workflow-interceptors/org-fairness-required.js +6 -0
  93. package/dist/lib/workflow-interceptors/org-fairness-required.js.map +1 -0
  94. package/dist/lib/workflow-interceptors/org-search-attribute.d.ts +3 -0
  95. package/dist/lib/workflow-interceptors/org-search-attribute.d.ts.map +1 -0
  96. package/dist/lib/workflow-interceptors/org-search-attribute.js +49 -0
  97. package/dist/lib/workflow-interceptors/org-search-attribute.js.map +1 -0
  98. package/dist/lib/workflow-purity.d.ts +27 -0
  99. package/dist/lib/workflow-purity.d.ts.map +1 -0
  100. package/dist/lib/workflow-purity.js +115 -0
  101. package/dist/lib/workflow-purity.js.map +1 -0
  102. package/package.json +21 -10
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createVersionedWorker = createVersionedWorker;
4
+ exports.platformWorkerIdentity = platformWorkerIdentity;
5
+ const node_crypto_1 = require("node:crypto");
6
+ const worker_1 = require("@temporalio/worker");
7
+ const on_behalf_of_interceptor_1 = require("./on-behalf-of-interceptor");
8
+ const worker_deployment_version_1 = require("./worker-deployment-version");
9
+ async function createVersionedWorker(params) {
10
+ const version = (0, worker_deployment_version_1.assertWorkerDeploymentVersion)(params.version);
11
+ return worker_1.Worker.create({
12
+ connection: params.connection,
13
+ namespace: params.namespace,
14
+ taskQueue: params.taskQueue,
15
+ identity: params.identity,
16
+ ...(params.workflowBundle !== undefined
17
+ ? { workflowBundle: params.workflowBundle }
18
+ : {}),
19
+ ...(params.activities !== undefined
20
+ ? { activities: params.activities }
21
+ : {}),
22
+ ...(params.nexusServices !== undefined && params.nexusServices.length > 0
23
+ ? { nexusServices: [...params.nexusServices] }
24
+ : {}),
25
+ interceptors: {
26
+ activity: [
27
+ () => ({ inbound: new on_behalf_of_interceptor_1.OnBehalfOfActivityInterceptor() }),
28
+ ...(params.activityInterceptors ?? []),
29
+ ],
30
+ },
31
+ ...(params.sinks !== undefined ? { sinks: params.sinks } : {}),
32
+ workerDeploymentOptions: {
33
+ version,
34
+ useWorkerVersioning: true,
35
+ defaultVersioningBehavior: 'PINNED',
36
+ },
37
+ ...(params.payloadCodec
38
+ ? { dataConverter: { payloadCodecs: [params.payloadCodec] } }
39
+ : {}),
40
+ ...(params.maxConcurrentActivityTaskExecutions !== undefined
41
+ ? {
42
+ maxConcurrentActivityTaskExecutions: params.maxConcurrentActivityTaskExecutions,
43
+ }
44
+ : {}),
45
+ ...(params.maxConcurrentWorkflowTaskExecutions !== undefined
46
+ ? {
47
+ maxConcurrentWorkflowTaskExecutions: params.maxConcurrentWorkflowTaskExecutions,
48
+ }
49
+ : {}),
50
+ ...(params.maxConcurrentNexusTaskExecutions !== undefined
51
+ ? {
52
+ maxConcurrentNexusTaskExecutions: params.maxConcurrentNexusTaskExecutions,
53
+ }
54
+ : {}),
55
+ });
56
+ }
57
+ function platformWorkerIdentity(role, namespace, taskQueue) {
58
+ return `${role}-${namespace}-${taskQueue}-${(0, node_crypto_1.randomUUID)().slice(0, 8)}`;
59
+ }
60
+ //# sourceMappingURL=versioned-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioned-worker.js","sourceRoot":"","sources":["../../src/lib/versioned-worker.ts"],"names":[],"mappings":";;AA4DA,sDAoDC;AAGD,wDAMC;AApHD,6CAAyC;AAEzC,+CAM4B;AAE5B,yEAA2E;AAC3E,2EAGqC;AAyC9B,KAAK,UAAU,qBAAqB,CACzC,MAA6B;IAE7B,MAAM,OAAO,GAAG,IAAA,yDAA6B,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9D,OAAO,eAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,CAAC,MAAM,CAAC,cAAc,KAAK,SAAS;YACrC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE;YAC3C,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS;YACjC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;YACnC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YACvE,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,EAAE;YAC9C,CAAC,CAAC,EAAE,CAAC;QACP,YAAY,EAAE;YACZ,QAAQ,EAAE;gBACR,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,wDAA6B,EAAE,EAAE,CAAC;gBACxD,GAAG,CAAC,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAAC;aACvC;SACF;QACD,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,uBAAuB,EAAE;YACvB,OAAO;YACP,mBAAmB,EAAE,IAAI;YACzB,yBAAyB,EAAE,QAAQ;SACpC;QACD,GAAG,CAAC,MAAM,CAAC,YAAY;YACrB,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,aAAa,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE;YAC7D,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,mCAAmC,KAAK,SAAS;YAC1D,CAAC,CAAC;gBACE,mCAAmC,EACjC,MAAM,CAAC,mCAAmC;aAC7C;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,mCAAmC,KAAK,SAAS;YAC1D,CAAC,CAAC;gBACE,mCAAmC,EACjC,MAAM,CAAC,mCAAmC;aAC7C;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,gCAAgC,KAAK,SAAS;YACvD,CAAC,CAAC;gBACE,gCAAgC,EAC9B,MAAM,CAAC,gCAAgC;aAC1C;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;AACL,CAAC;AAGD,SAAgB,sBAAsB,CACpC,IAAY,EACZ,SAAiB,EACjB,SAAiB;IAEjB,OAAO,GAAG,IAAI,IAAI,SAAS,IAAI,SAAS,IAAI,IAAA,wBAAU,GAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACzE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { TemporalEnvReader } from './namespace';
2
+ import type { WorkerDeploymentVersion } from '@temporalio/common';
3
+ export type { WorkerDeploymentVersion } from '@temporalio/common';
4
+ export declare const TEMPORAL_DEPLOYMENT_NAME_ENV = "TEMPORAL_DEPLOYMENT_NAME";
5
+ export declare const TEMPORAL_WORKER_BUILD_ID_ENV = "TEMPORAL_WORKER_BUILD_ID";
6
+ export declare function assertWorkerDeploymentVersion(version: WorkerDeploymentVersion): WorkerDeploymentVersion;
7
+ export declare function resolveWorkerDeploymentVersionFromEnv(env: TemporalEnvReader): WorkerDeploymentVersion;
8
+ //# sourceMappingURL=worker-deployment-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-deployment-version.d.ts","sourceRoot":"","sources":["../../src/lib/worker-deployment-version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAMlE,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AAQvE,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AAMvE,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,uBAAuB,GAC/B,uBAAuB,CAiBzB;AAUD,wBAAgB,qCAAqC,CACnD,GAAG,EAAE,iBAAiB,GACrB,uBAAuB,CAwBzB"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TEMPORAL_WORKER_BUILD_ID_ENV = exports.TEMPORAL_DEPLOYMENT_NAME_ENV = void 0;
4
+ exports.assertWorkerDeploymentVersion = assertWorkerDeploymentVersion;
5
+ exports.resolveWorkerDeploymentVersionFromEnv = resolveWorkerDeploymentVersionFromEnv;
6
+ exports.TEMPORAL_DEPLOYMENT_NAME_ENV = 'TEMPORAL_DEPLOYMENT_NAME';
7
+ exports.TEMPORAL_WORKER_BUILD_ID_ENV = 'TEMPORAL_WORKER_BUILD_ID';
8
+ function assertWorkerDeploymentVersion(version) {
9
+ for (const [field, value] of [
10
+ ['deploymentName', version.deploymentName],
11
+ ['buildId', version.buildId],
12
+ ]) {
13
+ if (typeof value !== 'string' ||
14
+ value.length === 0 ||
15
+ value.trim() !== value) {
16
+ throw new Error(`Worker Deployment version ${field} must be a non-empty string without ` +
17
+ `surrounding whitespace; got ${JSON.stringify(value)}.`);
18
+ }
19
+ }
20
+ return { deploymentName: version.deploymentName, buildId: version.buildId };
21
+ }
22
+ function resolveWorkerDeploymentVersionFromEnv(env) {
23
+ const deploymentName = env(exports.TEMPORAL_DEPLOYMENT_NAME_ENV);
24
+ const buildId = env(exports.TEMPORAL_WORKER_BUILD_ID_ENV);
25
+ const missing = [
26
+ deploymentName === undefined || deploymentName.length === 0
27
+ ? exports.TEMPORAL_DEPLOYMENT_NAME_ENV
28
+ : undefined,
29
+ buildId === undefined || buildId.length === 0
30
+ ? exports.TEMPORAL_WORKER_BUILD_ID_ENV
31
+ : undefined,
32
+ ].filter((name) => name !== undefined);
33
+ if (missing.length > 0) {
34
+ throw new Error(`${missing.join(' and ')} ${missing.length === 1 ? 'is' : 'are'} required: ` +
35
+ 'the Worker Deployment version is written into the pod by the Temporal ' +
36
+ 'Worker Controller from the digest-pinned pod template. There is no ' +
37
+ 'default and no unversioned mode — an unversioned worker would pick up ' +
38
+ 'runs that were started on a different version.');
39
+ }
40
+ return assertWorkerDeploymentVersion({
41
+ deploymentName: deploymentName,
42
+ buildId: buildId,
43
+ });
44
+ }
45
+ //# sourceMappingURL=worker-deployment-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-deployment-version.js","sourceRoot":"","sources":["../../src/lib/worker-deployment-version.ts"],"names":[],"mappings":";;;AAuBA,sEAmBC;AAUD,sFA0BC;AArEY,QAAA,4BAA4B,GAAG,0BAA0B,CAAC;AAQ1D,QAAA,4BAA4B,GAAG,0BAA0B,CAAC;AAMvE,SAAgB,6BAA6B,CAC3C,OAAgC;IAEhC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;QAC3B,CAAC,gBAAgB,EAAE,OAAO,CAAC,cAAc,CAAC;QAC1C,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC;KACpB,EAAE,CAAC;QACX,IACE,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,CAAC,MAAM,KAAK,CAAC;YAClB,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK,EACtB,CAAC;YACD,MAAM,IAAI,KAAK,CACb,6BAA6B,KAAK,sCAAsC;gBACtE,+BAA+B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;AAC9E,CAAC;AAUD,SAAgB,qCAAqC,CACnD,GAAsB;IAEtB,MAAM,cAAc,GAAG,GAAG,CAAC,oCAA4B,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,GAAG,CAAC,oCAA4B,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG;QACd,cAAc,KAAK,SAAS,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;YACzD,CAAC,CAAC,oCAA4B;YAC9B,CAAC,CAAC,SAAS;QACb,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAC3C,CAAC,CAAC,oCAA4B;YAC9B,CAAC,CAAC,SAAS;KACd,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACvD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa;YAC1E,wEAAwE;YACxE,qEAAqE;YACrE,wEAAwE;YACxE,gDAAgD,CACnD,CAAC;IACJ,CAAC;IACD,OAAO,6BAA6B,CAAC;QACnC,cAAc,EAAE,cAAwB;QACxC,OAAO,EAAE,OAAiB;KAC3B,CAAC,CAAC;AACL,CAAC"}
@@ -1,21 +1,21 @@
1
- import { Worker, type ActivityInterceptorsFactory, type NativeConnection, type WorkerOptions, type WorkflowBundle } from '@temporalio/worker';
1
+ import { type ActivityInterceptorsFactory, type NativeConnection, type Worker, type WorkflowBundle } from '@temporalio/worker';
2
+ import { type PlatformWorkerSinks, type PlatformWorkerTuning } from './versioned-worker';
3
+ import type { WorkerDeploymentVersion } from './worker-deployment-version';
2
4
  import type { PayloadCodec } from '@temporalio/common';
3
- export type PlatformWorkerSinks = NonNullable<WorkerOptions['sinks']>;
5
+ export type { PlatformNexusServiceHandler, PlatformWorkerSinks, PlatformWorkerTuning, } from './versioned-worker';
4
6
  export interface BundlePlatformWorkflowsOptions {
5
7
  readonly workflowInterceptorModules?: readonly string[];
6
8
  }
7
9
  export declare function bundlePlatformWorkflows(workflowsPath: string, options?: BundlePlatformWorkflowsOptions): Promise<WorkflowBundle>;
8
- export interface PlatformWorkerOptions {
10
+ export declare function assertWorkflowsBundle(workflowsPath: string, options?: BundlePlatformWorkflowsOptions): Promise<void>;
11
+ export interface PlatformWorkerOptions extends PlatformWorkerTuning {
9
12
  readonly connection: NativeConnection;
10
13
  readonly namespace: string;
11
14
  readonly taskQueue: string;
12
15
  readonly workflowBundle: WorkflowBundle;
13
16
  readonly activities: object;
14
- readonly buildId: string;
15
- readonly useVersioning?: boolean;
17
+ readonly version: WorkerDeploymentVersion;
16
18
  readonly payloadCodec?: PayloadCodec;
17
- readonly maxConcurrentActivityTaskExecutions?: number;
18
- readonly maxConcurrentWorkflowTaskExecutions?: number;
19
19
  readonly activityInterceptors?: readonly ActivityInterceptorsFactory[];
20
20
  readonly sinks?: PlatformWorkerSinks;
21
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/lib/worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,MAAM,EACN,KAAK,2BAA2B,EAChC,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMvD,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;AAEtE,MAAM,WAAW,8BAA8B;IAM7C,QAAQ,CAAC,0BAA0B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzD;AAOD,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,8BAA8B,GACvC,OAAO,CAAC,cAAc,CAAC,CAOzB;AAED,MAAM,WAAW,qBAAqB;IAEpC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAEtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IAExC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAK5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAKjC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,MAAM,CAAC;IACtD,QAAQ,CAAC,mCAAmC,CAAC,EAAE,MAAM,CAAC;IAKtD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAEvE,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;CACtC;AAYD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAiCjB"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/lib/worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,2BAA2B,EAChC,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACX,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,YAAY,EACV,2BAA2B,EAC3B,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAa5B,MAAM,WAAW,8BAA8B;IAM7C,QAAQ,CAAC,0BAA0B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzD;AAaD,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,8BAA8B,GACvC,OAAO,CAAC,cAAc,CAAC,CAsBzB;AAQD,wBAAsB,qBAAqB,CACzC,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,8BAA8B,GACvC,OAAO,CAAC,IAAI,CAAC,CAEf;AAGD,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAEjE,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAEtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IAExC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAO5B,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;IAK1C,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IAKrC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAEvE,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;CACtC;AAYD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CASjB"}
@@ -1,48 +1,44 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.bundlePlatformWorkflows = bundlePlatformWorkflows;
4
+ exports.assertWorkflowsBundle = assertWorkflowsBundle;
4
5
  exports.createPlatformWorker = createPlatformWorker;
5
- const node_crypto_1 = require("node:crypto");
6
+ const node_path_1 = require("node:path");
6
7
  const worker_1 = require("@temporalio/worker");
7
- const on_behalf_of_interceptor_1 = require("./on-behalf-of-interceptor");
8
+ const versioned_worker_1 = require("./versioned-worker");
9
+ const workflow_purity_1 = require("./workflow-purity");
10
+ const ORG_SEARCH_ATTRIBUTE_INTERCEPTOR_MODULE = (0, node_path_1.join)(__dirname, 'workflow-interceptors', 'org-search-attribute');
8
11
  async function bundlePlatformWorkflows(workflowsPath, options) {
9
- return (0, worker_1.bundleWorkflowCode)({
10
- workflowsPath,
11
- ...(options?.workflowInterceptorModules !== undefined
12
- ? { workflowInterceptorModules: [...options.workflowInterceptorModules] }
13
- : {}),
14
- });
12
+ const violations = [];
13
+ let bundle;
14
+ try {
15
+ bundle = await (0, worker_1.bundleWorkflowCode)({
16
+ workflowsPath,
17
+ webpackConfigHook: (0, workflow_purity_1.workflowPurityWebpackHook)(violations),
18
+ workflowInterceptorModules: [
19
+ ORG_SEARCH_ATTRIBUTE_INTERCEPTOR_MODULE,
20
+ ...(options?.workflowInterceptorModules ?? []),
21
+ ],
22
+ });
23
+ }
24
+ catch (error) {
25
+ if (violations.length > 0) {
26
+ throw new workflow_purity_1.WorkflowPurityError(workflowsPath, violations, { cause: error });
27
+ }
28
+ throw error;
29
+ }
30
+ if (violations.length > 0) {
31
+ throw new workflow_purity_1.WorkflowPurityError(workflowsPath, violations);
32
+ }
33
+ return bundle;
34
+ }
35
+ async function assertWorkflowsBundle(workflowsPath, options) {
36
+ await bundlePlatformWorkflows(workflowsPath, options);
15
37
  }
16
38
  async function createPlatformWorker(options) {
17
- return worker_1.Worker.create({
18
- connection: options.connection,
19
- namespace: options.namespace,
20
- taskQueue: options.taskQueue,
21
- workflowBundle: options.workflowBundle,
22
- activities: options.activities,
23
- identity: `xema-platform-worker-${options.namespace}-${options.taskQueue}-${(0, node_crypto_1.randomUUID)().slice(0, 8)}`,
24
- interceptors: {
25
- activity: [
26
- () => ({ inbound: new on_behalf_of_interceptor_1.OnBehalfOfActivityInterceptor() }),
27
- ...(options.activityInterceptors ?? []),
28
- ],
29
- },
30
- ...(options.sinks !== undefined ? { sinks: options.sinks } : {}),
31
- buildId: options.buildId,
32
- useVersioning: options.useVersioning ?? false,
33
- ...(options.payloadCodec
34
- ? { dataConverter: { payloadCodecs: [options.payloadCodec] } }
35
- : {}),
36
- ...(options.maxConcurrentActivityTaskExecutions !== undefined
37
- ? {
38
- maxConcurrentActivityTaskExecutions: options.maxConcurrentActivityTaskExecutions,
39
- }
40
- : {}),
41
- ...(options.maxConcurrentWorkflowTaskExecutions !== undefined
42
- ? {
43
- maxConcurrentWorkflowTaskExecutions: options.maxConcurrentWorkflowTaskExecutions,
44
- }
45
- : {}),
39
+ return (0, versioned_worker_1.createVersionedWorker)({
40
+ ...options,
41
+ identity: (0, versioned_worker_1.platformWorkerIdentity)('xema-platform-worker', options.namespace, options.taskQueue),
46
42
  });
47
43
  }
48
44
  //# sourceMappingURL=worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/lib/worker.ts"],"names":[],"mappings":";;AAmCA,0DAUC;AA6CD,oDAmCC;AA7HD,6CAAyC;AAEzC,+CAO4B;AAE5B,yEAA2E;AAwBpE,KAAK,UAAU,uBAAuB,CAC3C,aAAqB,EACrB,OAAwC;IAExC,OAAO,IAAA,2BAAkB,EAAC;QACxB,aAAa;QACb,GAAG,CAAC,OAAO,EAAE,0BAA0B,KAAK,SAAS;YACnD,CAAC,CAAC,EAAE,0BAA0B,EAAE,CAAC,GAAG,OAAO,CAAC,0BAA0B,CAAC,EAAE;YACzE,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;AACL,CAAC;AA6CM,KAAK,UAAU,oBAAoB,CACxC,OAA8B;IAE9B,OAAO,eAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,wBAAwB,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,IAAI,IAAA,wBAAU,GAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QACtG,YAAY,EAAE;YACZ,QAAQ,EAAE;gBACR,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,wDAA6B,EAAE,EAAE,CAAC;gBACxD,GAAG,CAAC,OAAO,CAAC,oBAAoB,IAAI,EAAE,CAAC;aACxC;SACF;QACD,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,KAAK;QAC7C,GAAG,CAAC,OAAO,CAAC,YAAY;YACtB,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,aAAa,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE;YAC9D,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,mCAAmC,KAAK,SAAS;YAC3D,CAAC,CAAC;gBACE,mCAAmC,EACjC,OAAO,CAAC,mCAAmC;aAC9C;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,mCAAmC,KAAK,SAAS;YAC3D,CAAC,CAAC;gBACE,mCAAmC,EACjC,OAAO,CAAC,mCAAmC;aAC9C;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/lib/worker.ts"],"names":[],"mappings":";;AA+DA,0DAyBC;AAQD,sDAKC;AA6CD,oDAWC;AA7JD,yCAAiC;AAEjC,+CAM4B;AAE5B,yDAK4B;AAE5B,uDAI2B;AAgB3B,MAAM,uCAAuC,GAAG,IAAA,gBAAI,EAClD,SAAS,EACT,uBAAuB,EACvB,sBAAsB,CACvB,CAAC;AAsBK,KAAK,UAAU,uBAAuB,CAC3C,aAAqB,EACrB,OAAwC;IAExC,MAAM,UAAU,GAA8B,EAAE,CAAC;IACjD,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAA,2BAAkB,EAAC;YAChC,aAAa;YACb,iBAAiB,EAAE,IAAA,2CAAyB,EAAC,UAAU,CAAC;YACxD,0BAA0B,EAAE;gBAC1B,uCAAuC;gBACvC,GAAG,CAAC,OAAO,EAAE,0BAA0B,IAAI,EAAE,CAAC;aAC/C;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,qCAAmB,CAAC,aAAa,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,qCAAmB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAQM,KAAK,UAAU,qBAAqB,CACzC,aAAqB,EACrB,OAAwC;IAExC,MAAM,uBAAuB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC;AA6CM,KAAK,UAAU,oBAAoB,CACxC,OAA8B;IAE9B,OAAO,IAAA,wCAAqB,EAAC;QAC3B,GAAG,OAAO;QACV,QAAQ,EAAE,IAAA,yCAAsB,EAC9B,sBAAsB,EACtB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,SAAS,CAClB;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type WorkflowInterceptors } from '@temporalio/workflow';
2
+ export declare function fairnessPropagationInterceptors(): WorkflowInterceptors;
3
+ export declare function orgFairnessRequiredInterceptors(): WorkflowInterceptors;
4
+ //# sourceMappingURL=fairness-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fairness-guard.d.ts","sourceRoot":"","sources":["../../../src/lib/workflow-interceptors/fairness-guard.ts"],"names":[],"mappings":"AAIA,OAAO,EAOL,KAAK,oBAAoB,EAE1B,MAAM,sBAAsB,CAAC;AAmG9B,wBAAgB,+BAA+B,IAAI,oBAAoB,CAEtE;AAGD,wBAAgB,+BAA+B,IAAI,oBAAoB,CAKtE"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fairnessPropagationInterceptors = fairnessPropagationInterceptors;
4
+ exports.orgFairnessRequiredInterceptors = orgFairnessRequiredInterceptors;
5
+ const workflow_1 = require("@temporalio/workflow");
6
+ const fairness_constants_1 = require("../fairness-constants");
7
+ function ownFairnessKey() {
8
+ const key = (0, workflow_1.workflowInfo)().priority?.fairnessKey;
9
+ return key === undefined || key.length === 0 ? undefined : key;
10
+ }
11
+ function propagatedKey(requested, what) {
12
+ const own = ownFairnessKey();
13
+ if (requested !== undefined && requested.length > 0 && requested !== own) {
14
+ throw workflow_1.ApplicationFailure.nonRetryable(`${what} was scheduled under fairness key ${JSON.stringify(requested)}, but ` +
15
+ `this run's key is ${JSON.stringify(own ?? '')}. Work carries its run's ` +
16
+ 'key; it may not be re-billed to another one.', fairness_constants_1.ORG_FAIRNESS_KEY_OVERRIDDEN);
17
+ }
18
+ return own;
19
+ }
20
+ class FairnessPropagationOutbound {
21
+ async scheduleActivity(input, next) {
22
+ const key = propagatedKey(input.options.priority?.fairnessKey, `Activity ${input.activityType}`);
23
+ return next(key === undefined
24
+ ? input
25
+ : {
26
+ ...input,
27
+ options: {
28
+ ...input.options,
29
+ priority: { ...input.options.priority, fairnessKey: key },
30
+ },
31
+ });
32
+ }
33
+ async startChildWorkflowExecution(input, next) {
34
+ const key = propagatedKey(input.options.priority?.fairnessKey, `Child workflow ${input.workflowType}`);
35
+ return next(key === undefined
36
+ ? input
37
+ : {
38
+ ...input,
39
+ options: {
40
+ ...input.options,
41
+ priority: { ...input.options.priority, fairnessKey: key },
42
+ },
43
+ });
44
+ }
45
+ }
46
+ class OrgFairnessRequiredInbound {
47
+ async execute(input, next) {
48
+ if (ownFairnessKey() === undefined) {
49
+ const info = (0, workflow_1.workflowInfo)();
50
+ throw workflow_1.ApplicationFailure.nonRetryable(`Workflow ${info.workflowType} started on org-fair task queue ` +
51
+ `${info.taskQueue} with no fairness key. Start it with startWorkflowForOrg.`, fairness_constants_1.ORG_FAIRNESS_KEY_MISSING);
52
+ }
53
+ return next(input);
54
+ }
55
+ }
56
+ function fairnessPropagationInterceptors() {
57
+ return { outbound: [new FairnessPropagationOutbound()] };
58
+ }
59
+ function orgFairnessRequiredInterceptors() {
60
+ return {
61
+ inbound: [new OrgFairnessRequiredInbound()],
62
+ outbound: [new FairnessPropagationOutbound()],
63
+ };
64
+ }
65
+ //# sourceMappingURL=fairness-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fairness-guard.js","sourceRoot":"","sources":["../../../src/lib/workflow-interceptors/fairness-guard.ts"],"names":[],"mappings":";;AAgHA,0EAEC;AAGD,0EAKC;AAtHD,mDAS8B;AAE9B,8DAG+B;AAE/B,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,IAAA,uBAAY,GAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;IACjD,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;AACjE,CAAC;AASD,SAAS,aAAa,CACpB,SAA6B,EAC7B,IAAY;IAEZ,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACzE,MAAM,6BAAkB,CAAC,YAAY,CACnC,GAAG,IAAI,qCAAqC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ;YAC3E,qBAAqB,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,2BAA2B;YACzE,8CAA8C,EAChD,gDAA2B,CAC5B,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,2BAA2B;IAC/B,KAAK,CAAC,gBAAgB,CACpB,KAAoB,EACpB,IAAgE;QAEhE,MAAM,GAAG,GAAG,aAAa,CACvB,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,EACnC,YAAY,KAAK,CAAC,YAAY,EAAE,CACjC,CAAC;QACF,OAAO,IAAI,CACT,GAAG,KAAK,SAAS;YACf,CAAC,CAAC,KAAK;YACP,CAAC,CAAC;gBACE,GAAG,KAAK;gBACR,OAAO,EAAE;oBACP,GAAG,KAAK,CAAC,OAAO;oBAChB,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE;iBAC1D;aACF,CACN,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,2BAA2B,CAC/B,KAAuC,EACvC,IAA2E;QAE3E,MAAM,GAAG,GAAG,aAAa,CACvB,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,EACnC,kBAAkB,KAAK,CAAC,YAAY,EAAE,CACvC,CAAC;QACF,OAAO,IAAI,CACT,GAAG,KAAK,SAAS;YACf,CAAC,CAAC,KAAK;YACP,CAAC,CAAC;gBACE,GAAG,KAAK;gBACR,OAAO,EAAE;oBACP,GAAG,KAAK,CAAC,OAAO;oBAChB,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE;iBAC1D;aACF,CACN,CAAC;IACJ,CAAC;CACF;AAED,MAAM,0BAA0B;IAC9B,KAAK,CAAC,OAAO,CACX,KAEI,EACJ,IAAsD;QAEtD,IAAI,cAAc,EAAE,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,IAAA,uBAAY,GAAE,CAAC;YAC5B,MAAM,6BAAkB,CAAC,YAAY,CACnC,YAAY,IAAI,CAAC,YAAY,kCAAkC;gBAC7D,GAAG,IAAI,CAAC,SAAS,2DAA2D,EAC9E,6CAAwB,CACzB,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;CACF;AAGD,SAAgB,+BAA+B;IAC7C,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,2BAA2B,EAAE,CAAC,EAAE,CAAC;AAC3D,CAAC;AAGD,SAAgB,+BAA+B;IAC7C,OAAO;QACL,OAAO,EAAE,CAAC,IAAI,0BAA0B,EAAE,CAAC;QAC3C,QAAQ,EAAE,CAAC,IAAI,2BAA2B,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { fairnessPropagationInterceptors } from './fairness-guard';
2
+ export declare const interceptors: typeof fairnessPropagationInterceptors;
3
+ //# sourceMappingURL=fairness-propagation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fairness-propagation.d.ts","sourceRoot":"","sources":["../../../src/lib/workflow-interceptors/fairness-propagation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AAEnE,eAAO,MAAM,YAAY,wCAAkC,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.interceptors = void 0;
4
+ const fairness_guard_1 = require("./fairness-guard");
5
+ exports.interceptors = fairness_guard_1.fairnessPropagationInterceptors;
6
+ //# sourceMappingURL=fairness-propagation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fairness-propagation.js","sourceRoot":"","sources":["../../../src/lib/workflow-interceptors/fairness-propagation.ts"],"names":[],"mappings":";;;AAEA,qDAAmE;AAEtD,QAAA,YAAY,GAAG,gDAA+B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { orgFairnessRequiredInterceptors } from './fairness-guard';
2
+ export declare const interceptors: typeof orgFairnessRequiredInterceptors;
3
+ //# sourceMappingURL=org-fairness-required.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-fairness-required.d.ts","sourceRoot":"","sources":["../../../src/lib/workflow-interceptors/org-fairness-required.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AAEnE,eAAO,MAAM,YAAY,wCAAkC,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.interceptors = void 0;
4
+ const fairness_guard_1 = require("./fairness-guard");
5
+ exports.interceptors = fairness_guard_1.orgFairnessRequiredInterceptors;
6
+ //# sourceMappingURL=org-fairness-required.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-fairness-required.js","sourceRoot":"","sources":["../../../src/lib/workflow-interceptors/org-fairness-required.ts"],"names":[],"mappings":";;;AAEA,qDAAmE;AAEtD,QAAA,YAAY,GAAG,gDAA+B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type WorkflowInterceptors } from '@temporalio/workflow';
2
+ export declare const interceptors: () => WorkflowInterceptors;
3
+ //# sourceMappingURL=org-search-attribute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-search-attribute.d.ts","sourceRoot":"","sources":["../../../src/lib/workflow-interceptors/org-search-attribute.ts"],"names":[],"mappings":"AAeA,OAAO,EAKL,KAAK,oBAAoB,EAE1B,MAAM,sBAAsB,CAAC;AA6D9B,eAAO,MAAM,YAAY,QAAO,oBAE9B,CAAC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.interceptors = void 0;
4
+ const common_1 = require("@temporalio/common");
5
+ const workflow_1 = require("@temporalio/workflow");
6
+ const search_attribute_constants_1 = require("../search-attribute-constants");
7
+ const ORG_ID_KEY = (0, common_1.defineSearchAttributeKey)(search_attribute_constants_1.SEARCH_ATTR_ORG_ID, common_1.SearchAttributeType.KEYWORD);
8
+ function pairsOf(typed) {
9
+ if (typed === undefined)
10
+ return [];
11
+ return typed instanceof common_1.TypedSearchAttributes ? typed.getAll() : [...typed];
12
+ }
13
+ function requestedOrgIds(input) {
14
+ const requested = [];
15
+ for (const pair of pairsOf(input.options.typedSearchAttributes)) {
16
+ if (pair.key.name === search_attribute_constants_1.SEARCH_ATTR_ORG_ID)
17
+ requested.push(String(pair.value));
18
+ }
19
+ const untyped = input.options.searchAttributes?.[search_attribute_constants_1.SEARCH_ATTR_ORG_ID];
20
+ for (const value of untyped ?? [])
21
+ requested.push(String(value));
22
+ return requested;
23
+ }
24
+ class OrgSearchAttributeOutbound {
25
+ async startChildWorkflowExecution(input, next) {
26
+ const own = (0, workflow_1.workflowInfo)().typedSearchAttributes.get(ORG_ID_KEY);
27
+ const requested = requestedOrgIds(input);
28
+ if (own === undefined) {
29
+ return next(input);
30
+ }
31
+ const foreign = requested.find((value) => value !== own);
32
+ if (foreign !== undefined) {
33
+ throw workflow_1.ApplicationFailure.nonRetryable(`Child workflow ${input.workflowType} was started with OrgId ` +
34
+ `${JSON.stringify(foreign)}, but this run belongs to ${JSON.stringify(own)}. ` +
35
+ "A child belongs to its parent's org.", search_attribute_constants_1.ORG_SEARCH_ATTRIBUTE_OVERRIDDEN);
36
+ }
37
+ const typed = pairsOf(input.options.typedSearchAttributes).filter((pair) => pair.key.name !== search_attribute_constants_1.SEARCH_ATTR_ORG_ID);
38
+ typed.push({ key: ORG_ID_KEY, value: own });
39
+ return next({
40
+ ...input,
41
+ options: { ...input.options, typedSearchAttributes: typed },
42
+ });
43
+ }
44
+ }
45
+ const interceptors = () => ({
46
+ outbound: [new OrgSearchAttributeOutbound()],
47
+ });
48
+ exports.interceptors = interceptors;
49
+ //# sourceMappingURL=org-search-attribute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-search-attribute.js","sourceRoot":"","sources":["../../../src/lib/workflow-interceptors/org-search-attribute.ts"],"names":[],"mappings":";;;AASA,+CAK4B;AAC5B,mDAO8B;AAE9B,8EAGuC;AAEvC,MAAM,UAAU,GAAG,IAAA,iCAAwB,EACzC,+CAAkB,EAClB,4BAAmB,CAAC,OAAO,CAC5B,CAAC;AAEF,SAAS,OAAO,CACd,KAAgE;IAEhE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,KAAK,YAAY,8BAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,eAAe,CAAC,KAAuC;IAC9D,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAChE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,+CAAkB;YAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,+CAAkB,CAAC,CAAC;IACrE,KAAK,MAAM,KAAK,IAAI,OAAO,IAAI,EAAE;QAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,0BAA0B;IAC9B,KAAK,CAAC,2BAA2B,CAC/B,KAAuC,EACvC,IAA2E;QAE3E,MAAM,GAAG,GAAG,IAAA,uBAAY,GAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;QACzD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,6BAAkB,CAAC,YAAY,CACnC,kBAAkB,KAAK,CAAC,YAAY,0BAA0B;gBAC5D,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI;gBAC9E,sCAAsC,EACxC,4DAA+B,CAChC,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,MAAM,CAC/D,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,+CAAkB,CAC/C,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;YACV,GAAG,KAAK;YACR,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE;SAC5D,CAAC,CAAC;IACL,CAAC;CACF;AAGM,MAAM,YAAY,GAAG,GAAyB,EAAE,CAAC,CAAC;IACvD,QAAQ,EAAE,CAAC,IAAI,0BAA0B,EAAE,CAAC;CAC7C,CAAC,CAAC;AAFU,QAAA,YAAY,gBAEtB"}
@@ -0,0 +1,27 @@
1
+ import type { BundleOptions } from '@temporalio/worker';
2
+ export declare enum WorkflowForbiddenModuleCategory {
3
+ Database = "database",
4
+ Network = "network",
5
+ Filesystem = "filesystem",
6
+ Redis = "redis",
7
+ OpenFga = "openfga",
8
+ Nest = "nest",
9
+ Activity = "activity"
10
+ }
11
+ export declare function workflowForbiddenModuleCategory(request: string): WorkflowForbiddenModuleCategory | undefined;
12
+ export interface WorkflowPurityViolation {
13
+ readonly request: string;
14
+ readonly category: WorkflowForbiddenModuleCategory;
15
+ readonly issuer: string | undefined;
16
+ }
17
+ export declare class WorkflowPurityError extends Error {
18
+ readonly workflowsPath: string;
19
+ readonly violations: readonly WorkflowPurityViolation[];
20
+ constructor(workflowsPath: string, violations: readonly WorkflowPurityViolation[], options?: {
21
+ cause?: unknown;
22
+ });
23
+ }
24
+ type WebpackConfig = Parameters<NonNullable<BundleOptions['webpackConfigHook']>>[0];
25
+ export declare function workflowPurityWebpackHook(violations: WorkflowPurityViolation[]): (config: WebpackConfig) => WebpackConfig;
26
+ export {};
27
+ //# sourceMappingURL=workflow-purity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-purity.d.ts","sourceRoot":"","sources":["../../src/lib/workflow-purity.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,oBAAY,+BAA+B;IACzC,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,QAAQ,aAAa;CACtB;AAkCD,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,MAAM,GACd,+BAA+B,GAAG,SAAS,CAiC7C;AAGD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,+BAA+B,CAAC;IAEnD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAE1C,QAAQ,CAAC,aAAa,EAAE,MAAM;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,uBAAuB,EAAE;gBAD9C,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,SAAS,uBAAuB,EAAE,EACvD,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAgBhC;AAED,KAAK,aAAa,GAAG,UAAU,CAC7B,WAAW,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAChD,CAAC,CAAC,CAAC,CAAC;AAmBL,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,uBAAuB,EAAE,GACpC,CAAC,MAAM,EAAE,aAAa,KAAK,aAAa,CA+B1C"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkflowPurityError = exports.WorkflowForbiddenModuleCategory = void 0;
4
+ exports.workflowForbiddenModuleCategory = workflowForbiddenModuleCategory;
5
+ exports.workflowPurityWebpackHook = workflowPurityWebpackHook;
6
+ var WorkflowForbiddenModuleCategory;
7
+ (function (WorkflowForbiddenModuleCategory) {
8
+ WorkflowForbiddenModuleCategory["Database"] = "database";
9
+ WorkflowForbiddenModuleCategory["Network"] = "network";
10
+ WorkflowForbiddenModuleCategory["Filesystem"] = "filesystem";
11
+ WorkflowForbiddenModuleCategory["Redis"] = "redis";
12
+ WorkflowForbiddenModuleCategory["OpenFga"] = "openfga";
13
+ WorkflowForbiddenModuleCategory["Nest"] = "nest";
14
+ WorkflowForbiddenModuleCategory["Activity"] = "activity";
15
+ })(WorkflowForbiddenModuleCategory || (exports.WorkflowForbiddenModuleCategory = WorkflowForbiddenModuleCategory = {}));
16
+ const EXACT = new Map([
17
+ ['prisma', WorkflowForbiddenModuleCategory.Database],
18
+ ['axios', WorkflowForbiddenModuleCategory.Network],
19
+ ['node-fetch', WorkflowForbiddenModuleCategory.Network],
20
+ ['undici', WorkflowForbiddenModuleCategory.Network],
21
+ ['got', WorkflowForbiddenModuleCategory.Network],
22
+ ['ky', WorkflowForbiddenModuleCategory.Network],
23
+ ['superagent', WorkflowForbiddenModuleCategory.Network],
24
+ ['cross-fetch', WorkflowForbiddenModuleCategory.Network],
25
+ ['isomorphic-fetch', WorkflowForbiddenModuleCategory.Network],
26
+ ['fs-extra', WorkflowForbiddenModuleCategory.Filesystem],
27
+ ['graceful-fs', WorkflowForbiddenModuleCategory.Filesystem],
28
+ ['redis', WorkflowForbiddenModuleCategory.Redis],
29
+ ['ioredis', WorkflowForbiddenModuleCategory.Redis],
30
+ ['openfga', WorkflowForbiddenModuleCategory.OpenFga],
31
+ ]);
32
+ const SCOPES = new Map([
33
+ ['@prisma', WorkflowForbiddenModuleCategory.Database],
34
+ ['@redis', WorkflowForbiddenModuleCategory.Redis],
35
+ ['@openfga', WorkflowForbiddenModuleCategory.OpenFga],
36
+ ['@nestjs', WorkflowForbiddenModuleCategory.Nest],
37
+ ]);
38
+ const GENERATED_CLIENT = /^@xemahq\/[a-z0-9-]+-client$/;
39
+ const ACTIVITY_MODULE = /\.activit(y|ies)(\.[cm]?[jt]s)?$/;
40
+ function workflowForbiddenModuleCategory(request) {
41
+ if (request.length === 0) {
42
+ return undefined;
43
+ }
44
+ if (request.startsWith('.') || request.startsWith('/')) {
45
+ if (/(^|\/)\.prisma(\/|$)/.test(request)) {
46
+ return WorkflowForbiddenModuleCategory.Database;
47
+ }
48
+ return ACTIVITY_MODULE.test(request.split('/').pop() ?? '')
49
+ ? WorkflowForbiddenModuleCategory.Activity
50
+ : undefined;
51
+ }
52
+ const parts = request.split('/');
53
+ const pkg = request.startsWith('@')
54
+ ? parts.slice(0, 2).join('/')
55
+ : parts[0];
56
+ if (pkg === '.prisma') {
57
+ return WorkflowForbiddenModuleCategory.Database;
58
+ }
59
+ const exact = EXACT.get(pkg);
60
+ if (exact !== undefined) {
61
+ return exact;
62
+ }
63
+ if (pkg.startsWith('@')) {
64
+ const scoped = SCOPES.get(parts[0]);
65
+ if (scoped !== undefined) {
66
+ return scoped;
67
+ }
68
+ if (GENERATED_CLIENT.test(pkg)) {
69
+ return WorkflowForbiddenModuleCategory.Network;
70
+ }
71
+ }
72
+ return undefined;
73
+ }
74
+ class WorkflowPurityError extends Error {
75
+ workflowsPath;
76
+ violations;
77
+ constructor(workflowsPath, violations, options) {
78
+ super(`the workflow bundle for ${workflowsPath} loads modules that cannot replay deterministically:\n` +
79
+ violations
80
+ .map((v) => ` - '${v.request}' (${v.category})` +
81
+ (v.issuer !== undefined ? `, imported by ${v.issuer}` : ''))
82
+ .join('\n') +
83
+ '\nWorkflow code performs no I/O: move this to an activity, and import activity signatures with `import type`.', options);
84
+ this.workflowsPath = workflowsPath;
85
+ this.violations = violations;
86
+ this.name = 'WorkflowPurityError';
87
+ }
88
+ }
89
+ exports.WorkflowPurityError = WorkflowPurityError;
90
+ function workflowPurityWebpackHook(violations) {
91
+ return (config) => {
92
+ const sdkExternals = config.externals;
93
+ if (typeof sdkExternals !== 'function') {
94
+ throw new Error('workflow purity: the Temporal bundler no longer installs an externals function; the purity probe cannot be composed with it.');
95
+ }
96
+ const inner = sdkExternals;
97
+ const externals = (data, callback) => {
98
+ const request = data.request ?? '';
99
+ const category = workflowForbiddenModuleCategory(request);
100
+ if (category !== undefined) {
101
+ const issuer = data.contextInfo?.issuer;
102
+ if (!violations.some((v) => v.request === request && v.issuer === issuer)) {
103
+ violations.push({ request, category, issuer });
104
+ }
105
+ return Promise.resolve(`commonjs ${request}`);
106
+ }
107
+ return inner(data, callback);
108
+ };
109
+ return {
110
+ ...config,
111
+ externals: externals,
112
+ };
113
+ };
114
+ }
115
+ //# sourceMappingURL=workflow-purity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-purity.js","sourceRoot":"","sources":["../../src/lib/workflow-purity.ts"],"names":[],"mappings":"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"}