@dbos-inc/dbos-sdk 4.28.8-preview → 4.28.11-preview

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 (45) hide show
  1. package/README.md +20 -7
  2. package/dist/schemas/system_db_schema.d.ts +0 -8
  3. package/dist/schemas/system_db_schema.d.ts.map +1 -1
  4. package/dist/schemas/system_db_schema.js.map +1 -1
  5. package/dist/src/adminserver.d.ts.map +1 -1
  6. package/dist/src/adminserver.js +5 -19
  7. package/dist/src/adminserver.js.map +1 -1
  8. package/dist/src/client.js +4 -4
  9. package/dist/src/client.js.map +1 -1
  10. package/dist/src/dbos-executor.d.ts +5 -36
  11. package/dist/src/dbos-executor.d.ts.map +1 -1
  12. package/dist/src/dbos-executor.js +0 -24
  13. package/dist/src/dbos-executor.js.map +1 -1
  14. package/dist/src/dbos.d.ts +1 -40
  15. package/dist/src/dbos.d.ts.map +1 -1
  16. package/dist/src/dbos.js +11 -89
  17. package/dist/src/dbos.js.map +1 -1
  18. package/dist/src/eventreceiver.d.ts +5 -11
  19. package/dist/src/eventreceiver.d.ts.map +1 -1
  20. package/dist/src/eventreceiver.js +10 -18
  21. package/dist/src/eventreceiver.js.map +1 -1
  22. package/dist/src/index.d.ts +2 -3
  23. package/dist/src/index.d.ts.map +1 -1
  24. package/dist/src/index.js +1 -5
  25. package/dist/src/index.js.map +1 -1
  26. package/dist/src/sysdb_migrations/internal/migrations.js +11 -0
  27. package/dist/src/sysdb_migrations/internal/migrations.js.map +1 -1
  28. package/dist/src/system_database.d.ts +0 -3
  29. package/dist/src/system_database.d.ts.map +1 -1
  30. package/dist/src/system_database.js +12 -53
  31. package/dist/src/system_database.js.map +1 -1
  32. package/dist/src/utils.d.ts +1 -0
  33. package/dist/src/utils.d.ts.map +1 -1
  34. package/dist/src/utils.js +4 -2
  35. package/dist/src/utils.js.map +1 -1
  36. package/dist/src/wfqueue.d.ts +37 -21
  37. package/dist/src/wfqueue.d.ts.map +1 -1
  38. package/dist/src/wfqueue.js +74 -105
  39. package/dist/src/wfqueue.js.map +1 -1
  40. package/dist/tsconfig.tsbuildinfo +1 -1
  41. package/package.json +1 -1
  42. package/dist/src/scheduler/scheduler_decorator.d.ts +0 -41
  43. package/dist/src/scheduler/scheduler_decorator.d.ts.map +0 -1
  44. package/dist/src/scheduler/scheduler_decorator.js +0 -174
  45. package/dist/src/scheduler/scheduler_decorator.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dbos-inc/dbos-sdk",
3
- "version": "4.28.8-preview",
3
+ "version": "4.28.11-preview",
4
4
  "description": "A Typescript framework built on the database",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,41 +0,0 @@
1
- import { DBOSLifecycleCallback, FunctionName } from '../decorators';
2
- /**
3
- * Choices for scheduler mode for `@DBOS.scheduled` workflows
4
- */
5
- export declare enum SchedulerMode {
6
- /**
7
- * Using `ExactlyOncePerInterval` causes the scheduler to add "make-up work" for any
8
- * schedule slots that occurred when the app was not running
9
- */
10
- ExactlyOncePerInterval = "ExactlyOncePerInterval",
11
- /**
12
- * Using `ExactlyOncePerIntervalWhenActive` causes the scheduler to run the workflow once
13
- * per interval when the application is active. If the app is not running at a time
14
- * otherwise indicated by the schedule, no workflow will be run.
15
- */
16
- ExactlyOncePerIntervalWhenActive = "ExactlyOncePerIntervalWhenActive"
17
- }
18
- /**
19
- * Configuration for a `@DBOS.scheduled` workflow
20
- */
21
- export interface SchedulerConfig {
22
- /** Schedule, in 5- or 6-spot crontab format */
23
- crontab: string;
24
- /**
25
- * Indicates whether or not to retroactively start workflows that were scheduled during
26
- * times when the app was not running. @see `SchedulerMode`.
27
- */
28
- mode?: SchedulerMode;
29
- /** If set, workflows will be enqueued on the named queue, rather than being started immediately */
30
- queueName?: string;
31
- }
32
- export type ScheduledArgs = [Date, Date];
33
- export declare class ScheduledReceiver implements DBOSLifecycleCallback {
34
- #private;
35
- constructor();
36
- initialize(): Promise<void>;
37
- destroy(): Promise<void>;
38
- logRegisteredEndpoints(): void;
39
- static registerScheduled<This, Return>(func: (this: This, ...args: ScheduledArgs) => Promise<Return>, config: SchedulerConfig & FunctionName): void;
40
- }
41
- //# sourceMappingURL=scheduler_decorator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scheduler_decorator.d.ts","sourceRoot":"","sources":["../../../src/scheduler/scheduler_decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAA0B,MAAM,eAAe,CAAC;AAQ5F;;GAEG;AACH,oBAAY,aAAa;IACvB;;;OAGG;IACH,sBAAsB,2BAA2B;IACjD;;;;OAIG;IACH,gCAAgC,qCAAqC;CACtE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,mGAAmG;IACnG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AASzC,qBAAa,iBAAkB,YAAW,qBAAqB;;;IASvD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,sBAAsB,IAAI,IAAI;IAyH9B,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EACnC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,EAC7D,MAAM,EAAE,eAAe,GAAG,YAAY;CAazC"}
@@ -1,174 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ScheduledReceiver = exports.SchedulerMode = void 0;
4
- const __1 = require("..");
5
- const utils_1 = require("../utils");
6
- const crontab_1 = require("./crontab");
7
- ////
8
- // Configuration
9
- ////
10
- /**
11
- * Choices for scheduler mode for `@DBOS.scheduled` workflows
12
- */
13
- var SchedulerMode;
14
- (function (SchedulerMode) {
15
- /**
16
- * Using `ExactlyOncePerInterval` causes the scheduler to add "make-up work" for any
17
- * schedule slots that occurred when the app was not running
18
- */
19
- SchedulerMode["ExactlyOncePerInterval"] = "ExactlyOncePerInterval";
20
- /**
21
- * Using `ExactlyOncePerIntervalWhenActive` causes the scheduler to run the workflow once
22
- * per interval when the application is active. If the app is not running at a time
23
- * otherwise indicated by the schedule, no workflow will be run.
24
- */
25
- SchedulerMode["ExactlyOncePerIntervalWhenActive"] = "ExactlyOncePerIntervalWhenActive";
26
- })(SchedulerMode || (exports.SchedulerMode = SchedulerMode = {}));
27
- ///////////////////////////
28
- // Scheduler Management
29
- ///////////////////////////
30
- const SCHEDULER_EVENT_SERVICE_NAME = 'dbos.scheduler';
31
- class ScheduledReceiver {
32
- #controller = new AbortController();
33
- #disposables = new Array();
34
- constructor() {
35
- __1.DBOS.registerLifecycleCallback(this);
36
- }
37
- // eslint-disable-next-line @typescript-eslint/require-await
38
- async initialize() {
39
- for (const regOp of __1.DBOS.getAssociatedInfo(SCHEDULER_EVENT_SERVICE_NAME)) {
40
- if (regOp.methodReg.registeredFunction === undefined) {
41
- __1.DBOS.logger.warn(`Scheduled workflow ${regOp.methodReg.className}.${regOp.methodReg.name} is missing registered function; skipping`);
42
- continue;
43
- }
44
- const { crontab, mode, queueName } = regOp.methodConfig;
45
- if (!crontab) {
46
- __1.DBOS.logger.warn(`Scheduled workflow ${regOp.methodReg.className}.${regOp.methodReg.name} is missing crontab; skipping`);
47
- continue;
48
- }
49
- const timeMatcher = new crontab_1.TimeMatcher(crontab);
50
- const promise = ScheduledReceiver.#schedulerLoop(regOp.methodReg, timeMatcher, mode ?? SchedulerMode.ExactlyOncePerIntervalWhenActive, queueName, this.#controller.signal);
51
- this.#disposables.push(promise);
52
- }
53
- }
54
- async destroy() {
55
- this.#controller.abort();
56
- const promises = this.#disposables.splice(0);
57
- await Promise.allSettled(promises);
58
- }
59
- logRegisteredEndpoints() {
60
- __1.DBOS.logger.info('Scheduled endpoints:');
61
- for (const regOp of __1.DBOS.getAssociatedInfo(SCHEDULER_EVENT_SERVICE_NAME)) {
62
- const name = `${regOp.methodReg.className}.${regOp.methodReg.name}`;
63
- const { crontab, mode } = regOp.methodConfig;
64
- if (crontab) {
65
- __1.DBOS.logger.info(` ${name} @ ${crontab}; ${mode ?? SchedulerMode.ExactlyOncePerIntervalWhenActive}`);
66
- }
67
- else {
68
- __1.DBOS.logger.info(` ${name} is missing crontab; skipping`);
69
- }
70
- }
71
- }
72
- static async #schedulerLoop(methodReg, timeMatcher, mode, queueName, signal) {
73
- const name = `${methodReg.className}.${methodReg.name}`;
74
- let lastExec = new Date().setMilliseconds(0);
75
- if (mode === SchedulerMode.ExactlyOncePerInterval) {
76
- const lastState = await __1.DBOS.getEventDispatchState(SCHEDULER_EVENT_SERVICE_NAME, name, 'lastState');
77
- if (lastState?.value) {
78
- lastExec = parseFloat(lastState.value);
79
- }
80
- }
81
- while (!signal.aborted) {
82
- const nextExec = timeMatcher.nextWakeupTime(lastExec).getTime();
83
- let sleepTime = nextExec - Date.now();
84
- // To prevent a "thundering herd" problem in a distributed setting,
85
- // apply jitter of up to 10% the sleep time, capped at 10 seconds
86
- if (sleepTime > 0) {
87
- const maxJitter = Math.min(sleepTime / 10, 10000);
88
- const jitter = Math.random() * maxJitter;
89
- sleepTime += jitter;
90
- }
91
- if (sleepTime > 0) {
92
- await new Promise((resolve, reject) => {
93
- // eslint-disable-next-line prefer-const
94
- let timeoutID;
95
- const onAbort = () => {
96
- clearTimeout(timeoutID);
97
- reject(new Error('Abort signal received'));
98
- };
99
- signal.addEventListener('abort', onAbort, { once: true });
100
- if (signal.aborted) {
101
- signal.removeEventListener('abort', onAbort);
102
- reject(new Error('Abort signal received'));
103
- }
104
- timeoutID = setTimeout(() => {
105
- signal.removeEventListener('abort', onAbort);
106
- resolve();
107
- }, sleepTime);
108
- });
109
- }
110
- if (signal.aborted) {
111
- break;
112
- }
113
- // If TimeMatcher did not find the next occurrence of the schedule yet,
114
- // we must have it determine the next wakeup time.
115
- if (!timeMatcher.match(nextExec)) {
116
- lastExec = nextExec;
117
- continue;
118
- }
119
- const date = new Date(nextExec);
120
- if (methodReg.workflowConfig && methodReg.registeredFunction) {
121
- const workflowID = `sched-${name}-${date.toISOString()}`;
122
- const wfParams = { workflowID, queueName: queueName ?? utils_1.INTERNAL_QUEUE_NAME };
123
- __1.DBOS.logger.debug(`Executing scheduled workflow ${workflowID}`);
124
- await __1.DBOS.startWorkflow(methodReg.registeredFunction, wfParams)(date, new Date());
125
- }
126
- else {
127
- __1.DBOS.logger.error(`${name} is @scheduled but not a workflow`);
128
- }
129
- lastExec = await ScheduledReceiver.#setLastExecTime(name, nextExec);
130
- }
131
- }
132
- static async #setLastExecTime(name, time) {
133
- // Record the time of the wf kicked off
134
- try {
135
- const state = {
136
- service: SCHEDULER_EVENT_SERVICE_NAME,
137
- workflowFnName: name,
138
- key: 'lastState',
139
- value: `${time}`,
140
- updateTime: time,
141
- };
142
- const newState = await __1.DBOS.upsertEventDispatchState(state);
143
- const dbTime = parseFloat(newState.value);
144
- if (dbTime && dbTime > time) {
145
- return dbTime;
146
- }
147
- }
148
- catch (e) {
149
- // This write is not strictly essential and the scheduler is often the "canary in the coal mine"
150
- // We will simply continue after giving full details.
151
- const err = e;
152
- __1.DBOS.logger.warn(`Scheduler caught an error writing to system DB: ${err.message}`);
153
- __1.DBOS.logger.error(e);
154
- }
155
- return time;
156
- }
157
- // registerScheduled is static so it can be called before an instance is created during DBOS.launch.
158
- // This means we can't use the instance as the external info key for associateFunctionWithInfo below
159
- // or in getAssociatedInfo above...which means we can only have one scheduled receiver instance.
160
- // However, since this is an internal receiver, it's safe to assume there is ever only one instnace.
161
- static registerScheduled(func, config) {
162
- const { regInfo } = __1.DBOS.associateFunctionWithInfo(SCHEDULER_EVENT_SERVICE_NAME, func, {
163
- ctorOrProto: config.ctorOrProto,
164
- className: config.className,
165
- name: config.name ?? func.name,
166
- });
167
- const schedRegInfo = regInfo;
168
- schedRegInfo.crontab = config.crontab;
169
- schedRegInfo.mode = config.mode;
170
- schedRegInfo.queueName = config.queueName;
171
- }
172
- }
173
- exports.ScheduledReceiver = ScheduledReceiver;
174
- //# sourceMappingURL=scheduler_decorator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scheduler_decorator.js","sourceRoot":"","sources":["../../../src/scheduler/scheduler_decorator.ts"],"names":[],"mappings":"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"}