@forgehive/task 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -10
- package/dist/index.d.ts +18 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -10
- package/dist/index.js.map +1 -1
- package/dist/test/execution-record-boundaries.test.d.ts +2 -0
- package/dist/test/execution-record-boundaries.test.d.ts.map +1 -0
- package/dist/test/execution-record-boundaries.test.js +220 -0
- package/dist/test/execution-record-boundaries.test.js.map +1 -0
- package/dist/test/listen-execution-records.test.d.ts +2 -0
- package/dist/test/listen-execution-records.test.d.ts.map +1 -0
- package/dist/test/listen-execution-records.test.js +223 -0
- package/dist/test/listen-execution-records.test.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +104 -14
- package/src/test/execution-record-boundaries.test.ts +266 -0
- package/src/test/listen-execution-records.test.ts +295 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_1 = require("../index");
|
|
4
|
+
describe('execution-record-boundaries', () => {
|
|
5
|
+
describe('setMetadata boundary', () => {
|
|
6
|
+
it('should add metadata to execution record when setMetadata is called', async () => {
|
|
7
|
+
// Create a schema
|
|
8
|
+
const schema = new index_1.Schema({
|
|
9
|
+
value: index_1.Schema.number()
|
|
10
|
+
});
|
|
11
|
+
// Create a task that uses setMetadata
|
|
12
|
+
const task = (0, index_1.createTask)({
|
|
13
|
+
name: 'metadata-test-task',
|
|
14
|
+
schema,
|
|
15
|
+
boundaries: {
|
|
16
|
+
multiply: async (value) => value * 2
|
|
17
|
+
},
|
|
18
|
+
fn: async ({ value }, { multiply, setMetadata }) => {
|
|
19
|
+
await setMetadata('userId', '12345');
|
|
20
|
+
await setMetadata('executionType', 'background');
|
|
21
|
+
const result = await multiply(value);
|
|
22
|
+
return { result };
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
// Run the task with safeRun
|
|
26
|
+
const [result, error, record] = await task.safeRun({ value: 5 });
|
|
27
|
+
// Verify the execution was successful
|
|
28
|
+
expect(error).toBeNull();
|
|
29
|
+
expect(result).toEqual({ result: 10 });
|
|
30
|
+
// Verify the metadata is included in the record
|
|
31
|
+
expect(record.metadata).toEqual({
|
|
32
|
+
userId: '12345',
|
|
33
|
+
executionType: 'background'
|
|
34
|
+
});
|
|
35
|
+
// Verify the task name and other fields are correct
|
|
36
|
+
expect(record.taskName).toBe('metadata-test-task');
|
|
37
|
+
expect(record.input).toEqual({ value: 5 });
|
|
38
|
+
expect(record.output).toEqual({ result: 10 });
|
|
39
|
+
expect(record.type).toBe('success');
|
|
40
|
+
});
|
|
41
|
+
it('should not include setMetadata calls in boundary logs', async () => {
|
|
42
|
+
// Create a schema
|
|
43
|
+
const schema = new index_1.Schema({
|
|
44
|
+
value: index_1.Schema.number()
|
|
45
|
+
});
|
|
46
|
+
// Create a task that uses setMetadata and other boundaries
|
|
47
|
+
const task = (0, index_1.createTask)({
|
|
48
|
+
name: 'boundary-log-test',
|
|
49
|
+
schema,
|
|
50
|
+
boundaries: {
|
|
51
|
+
multiply: async (value) => value * 2,
|
|
52
|
+
fetchData: async (data) => `fetched-${data}`
|
|
53
|
+
},
|
|
54
|
+
fn: async ({ value }, { multiply, fetchData, setMetadata }) => {
|
|
55
|
+
await setMetadata('step', 'start');
|
|
56
|
+
const multiplied = await multiply(value);
|
|
57
|
+
await setMetadata('step', 'multiplied');
|
|
58
|
+
const fetched = await fetchData('test');
|
|
59
|
+
await setMetadata('step', 'completed');
|
|
60
|
+
return { multiplied, fetched };
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
// Run the task with safeRun
|
|
64
|
+
const [result, error, record] = await task.safeRun({ value: 3 });
|
|
65
|
+
// Verify the execution was successful
|
|
66
|
+
expect(error).toBeNull();
|
|
67
|
+
expect(result).toEqual({ multiplied: 6, fetched: 'fetched-test' });
|
|
68
|
+
// Verify the metadata is updated to the final value
|
|
69
|
+
expect(record.metadata).toEqual({
|
|
70
|
+
step: 'completed'
|
|
71
|
+
});
|
|
72
|
+
// Verify that only the actual boundaries appear in the logs
|
|
73
|
+
expect(record.boundaries).toHaveProperty('multiply');
|
|
74
|
+
expect(record.boundaries).toHaveProperty('fetchData');
|
|
75
|
+
expect(record.boundaries).not.toHaveProperty('setMetadata');
|
|
76
|
+
// Verify the boundary logs contain the expected calls
|
|
77
|
+
expect(record.boundaries.multiply).toHaveLength(1);
|
|
78
|
+
expect(record.boundaries.multiply[0]).toEqual({
|
|
79
|
+
input: [3],
|
|
80
|
+
output: 6
|
|
81
|
+
});
|
|
82
|
+
expect(record.boundaries.fetchData).toHaveLength(1);
|
|
83
|
+
expect(record.boundaries.fetchData[0]).toEqual({
|
|
84
|
+
input: ['test'],
|
|
85
|
+
output: 'fetched-test'
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
it('should preserve metadata in error scenarios', async () => {
|
|
89
|
+
// Create a schema
|
|
90
|
+
const schema = new index_1.Schema({
|
|
91
|
+
value: index_1.Schema.number()
|
|
92
|
+
});
|
|
93
|
+
// Create a task that sets metadata before throwing an error
|
|
94
|
+
const task = (0, index_1.createTask)({
|
|
95
|
+
name: 'error-metadata-test',
|
|
96
|
+
schema,
|
|
97
|
+
boundaries: {},
|
|
98
|
+
fn: async ({ value }, { setMetadata }) => {
|
|
99
|
+
await setMetadata('errorContext', 'validation');
|
|
100
|
+
await setMetadata('userId', '67890');
|
|
101
|
+
if (value < 0) {
|
|
102
|
+
throw new Error('Value cannot be negative');
|
|
103
|
+
}
|
|
104
|
+
return { result: value };
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
// Run the task with a value that will cause an error
|
|
108
|
+
const [result, error, record] = await task.safeRun({ value: -1 });
|
|
109
|
+
// Verify the execution failed as expected
|
|
110
|
+
expect(result).toBeNull();
|
|
111
|
+
expect(error).not.toBeNull();
|
|
112
|
+
expect(error === null || error === void 0 ? void 0 : error.message).toBe('Value cannot be negative');
|
|
113
|
+
// Verify the metadata is preserved in the error record
|
|
114
|
+
expect(record.metadata).toEqual({
|
|
115
|
+
errorContext: 'validation',
|
|
116
|
+
userId: '67890'
|
|
117
|
+
});
|
|
118
|
+
// Verify other record fields
|
|
119
|
+
expect(record.taskName).toBe('error-metadata-test');
|
|
120
|
+
expect(record.input).toEqual({ value: -1 });
|
|
121
|
+
expect(record.error).toBe('Value cannot be negative');
|
|
122
|
+
expect(record.type).toBe('error');
|
|
123
|
+
});
|
|
124
|
+
it('should preserve existing metadata when adding new metadata', async () => {
|
|
125
|
+
// Create a schema
|
|
126
|
+
const schema = new index_1.Schema({
|
|
127
|
+
value: index_1.Schema.number()
|
|
128
|
+
});
|
|
129
|
+
// Create a task that uses setMetadata
|
|
130
|
+
const task = (0, index_1.createTask)({
|
|
131
|
+
name: 'preserve-metadata-test',
|
|
132
|
+
schema,
|
|
133
|
+
boundaries: {},
|
|
134
|
+
fn: async ({ value }, { setMetadata }) => {
|
|
135
|
+
await setMetadata('step1', 'completed');
|
|
136
|
+
await setMetadata('step2', 'in-progress');
|
|
137
|
+
await setMetadata('step1', 'updated'); // Overwrite step1
|
|
138
|
+
return { result: value * 2 };
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
// Run the task with initial metadata context
|
|
142
|
+
const [result, error, record] = await task.safeRun({ value: 4 });
|
|
143
|
+
// Verify the execution was successful
|
|
144
|
+
expect(error).toBeNull();
|
|
145
|
+
expect(result).toEqual({ result: 8 });
|
|
146
|
+
// Verify the metadata contains the final values
|
|
147
|
+
expect(record.metadata).toEqual({
|
|
148
|
+
step1: 'updated',
|
|
149
|
+
step2: 'in-progress'
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
it('should work with setMetadata in safeReplay', async () => {
|
|
153
|
+
var _a, _b, _c, _d;
|
|
154
|
+
// Create a schema
|
|
155
|
+
const schema = new index_1.Schema({
|
|
156
|
+
value: index_1.Schema.number()
|
|
157
|
+
});
|
|
158
|
+
// Use a counter to ensure different values between original and replay
|
|
159
|
+
let executionCounter = 0;
|
|
160
|
+
// Create a task with boundaries and metadata
|
|
161
|
+
const task = (0, index_1.createTask)({
|
|
162
|
+
name: 'replay-metadata-test',
|
|
163
|
+
schema,
|
|
164
|
+
boundaries: {
|
|
165
|
+
fetchData: async (value) => value * 3
|
|
166
|
+
},
|
|
167
|
+
fn: async ({ value }, { fetchData, setMetadata }) => {
|
|
168
|
+
executionCounter++;
|
|
169
|
+
await setMetadata('replayTest', 'true');
|
|
170
|
+
await setMetadata('executionNumber', executionCounter.toString());
|
|
171
|
+
const result = await fetchData(value);
|
|
172
|
+
return { result };
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
// First, run the task normally to get an execution record
|
|
176
|
+
const [, , originalRecord] = await task.safeRun({ value: 2 });
|
|
177
|
+
// Verify original metadata was set
|
|
178
|
+
expect(originalRecord.metadata).toHaveProperty('replayTest', 'true');
|
|
179
|
+
expect(originalRecord.metadata).toHaveProperty('executionNumber', '1');
|
|
180
|
+
// Now replay the task
|
|
181
|
+
const [replayResult, replayError, replayRecord] = await task.safeReplay(originalRecord, { boundaries: { fetchData: 'replay' } });
|
|
182
|
+
// Verify the replay was successful
|
|
183
|
+
expect(replayError).toBeNull();
|
|
184
|
+
expect(replayResult).toEqual({ result: 6 });
|
|
185
|
+
// Verify that the replay has its own metadata (setMetadata was called again)
|
|
186
|
+
expect(replayRecord.metadata).toHaveProperty('replayTest', 'true');
|
|
187
|
+
expect(replayRecord.metadata).toHaveProperty('executionNumber', '2');
|
|
188
|
+
// The execution numbers should be different since setMetadata was called again
|
|
189
|
+
expect((_a = replayRecord.metadata) === null || _a === void 0 ? void 0 : _a.executionNumber).not.toBe((_b = originalRecord.metadata) === null || _b === void 0 ? void 0 : _b.executionNumber);
|
|
190
|
+
expect((_c = originalRecord.metadata) === null || _c === void 0 ? void 0 : _c.executionNumber).toBe('1');
|
|
191
|
+
expect((_d = replayRecord.metadata) === null || _d === void 0 ? void 0 : _d.executionNumber).toBe('2');
|
|
192
|
+
});
|
|
193
|
+
it('should handle empty metadata gracefully', async () => {
|
|
194
|
+
// Create a schema
|
|
195
|
+
const schema = new index_1.Schema({
|
|
196
|
+
value: index_1.Schema.number()
|
|
197
|
+
});
|
|
198
|
+
// Create a task that doesn't use setMetadata
|
|
199
|
+
const task = (0, index_1.createTask)({
|
|
200
|
+
name: 'no-metadata-test',
|
|
201
|
+
schema,
|
|
202
|
+
boundaries: {
|
|
203
|
+
multiply: async (value) => value * 2
|
|
204
|
+
},
|
|
205
|
+
fn: async ({ value }, { multiply }) => {
|
|
206
|
+
const result = await multiply(value);
|
|
207
|
+
return { result };
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// Run the task without using setMetadata
|
|
211
|
+
const [result, error, record] = await task.safeRun({ value: 7 });
|
|
212
|
+
// Verify the execution was successful
|
|
213
|
+
expect(error).toBeNull();
|
|
214
|
+
expect(result).toEqual({ result: 14 });
|
|
215
|
+
// Verify the metadata is empty but defined
|
|
216
|
+
expect(record.metadata).toEqual({});
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
//# sourceMappingURL=execution-record-boundaries.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-record-boundaries.test.js","sourceRoot":"","sources":["../../src/test/execution-record-boundaries.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen-execution-records.test.d.ts","sourceRoot":"","sources":["../../src/test/listen-execution-records.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_1 = require("../index");
|
|
4
|
+
describe('Task.listenExecutionRecords', () => {
|
|
5
|
+
let mockListener;
|
|
6
|
+
let consoleErrorSpy;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
mockListener = jest.fn();
|
|
9
|
+
consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
10
|
+
// Clear any existing global listener
|
|
11
|
+
index_1.Task.globalListener = undefined;
|
|
12
|
+
});
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
// Clean up global listener after each test
|
|
15
|
+
index_1.Task.globalListener = undefined;
|
|
16
|
+
consoleErrorSpy.mockRestore();
|
|
17
|
+
});
|
|
18
|
+
describe('static listenExecutionRecords method', () => {
|
|
19
|
+
it('should set global listener', () => {
|
|
20
|
+
index_1.Task.listenExecutionRecords(mockListener);
|
|
21
|
+
expect(index_1.Task.globalListener).toBe(mockListener);
|
|
22
|
+
});
|
|
23
|
+
it('should replace existing global listener', () => {
|
|
24
|
+
const firstListener = jest.fn();
|
|
25
|
+
const secondListener = jest.fn();
|
|
26
|
+
index_1.Task.listenExecutionRecords(firstListener);
|
|
27
|
+
expect(index_1.Task.globalListener).toBe(firstListener);
|
|
28
|
+
index_1.Task.listenExecutionRecords(secondListener);
|
|
29
|
+
expect(index_1.Task.globalListener).toBe(secondListener);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('global listener execution', () => {
|
|
33
|
+
it('should call global listener when task is executed via safeRun', async () => {
|
|
34
|
+
index_1.Task.listenExecutionRecords(mockListener);
|
|
35
|
+
const schema = new index_1.Schema({
|
|
36
|
+
value: index_1.Schema.number()
|
|
37
|
+
});
|
|
38
|
+
const testTask = (0, index_1.createTask)({
|
|
39
|
+
schema,
|
|
40
|
+
boundaries: {},
|
|
41
|
+
fn: async (input) => ({ result: input.value * 2 })
|
|
42
|
+
});
|
|
43
|
+
await testTask.safeRun({ value: 5 });
|
|
44
|
+
await new Promise(resolve => process.nextTick(resolve));
|
|
45
|
+
expect(mockListener).toHaveBeenCalledTimes(1);
|
|
46
|
+
expect(mockListener).toHaveBeenCalledWith(expect.objectContaining({
|
|
47
|
+
input: { value: 5 },
|
|
48
|
+
output: { result: 10 },
|
|
49
|
+
type: 'success'
|
|
50
|
+
}));
|
|
51
|
+
});
|
|
52
|
+
it('should call global listener when task is executed via run', async () => {
|
|
53
|
+
index_1.Task.listenExecutionRecords(mockListener);
|
|
54
|
+
const schema = new index_1.Schema({
|
|
55
|
+
value: index_1.Schema.number()
|
|
56
|
+
});
|
|
57
|
+
const testTask = (0, index_1.createTask)({
|
|
58
|
+
schema,
|
|
59
|
+
boundaries: {},
|
|
60
|
+
fn: async (input) => ({ result: input.value * 2 })
|
|
61
|
+
});
|
|
62
|
+
await testTask.run({ value: 3 });
|
|
63
|
+
await new Promise(resolve => process.nextTick(resolve));
|
|
64
|
+
expect(mockListener).toHaveBeenCalledTimes(1);
|
|
65
|
+
expect(mockListener).toHaveBeenCalledWith(expect.objectContaining({
|
|
66
|
+
input: { value: 3 },
|
|
67
|
+
output: { result: 6 },
|
|
68
|
+
type: 'success'
|
|
69
|
+
}));
|
|
70
|
+
});
|
|
71
|
+
it('should call global listener when task fails', async () => {
|
|
72
|
+
index_1.Task.listenExecutionRecords(mockListener);
|
|
73
|
+
const schema = new index_1.Schema({});
|
|
74
|
+
const errorTask = (0, index_1.createTask)({
|
|
75
|
+
schema,
|
|
76
|
+
boundaries: {},
|
|
77
|
+
fn: async () => {
|
|
78
|
+
throw new Error('Test error');
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
await errorTask.safeRun({});
|
|
82
|
+
await new Promise(resolve => process.nextTick(resolve));
|
|
83
|
+
expect(mockListener).toHaveBeenCalledTimes(1);
|
|
84
|
+
expect(mockListener).toHaveBeenCalledWith(expect.objectContaining({
|
|
85
|
+
input: {},
|
|
86
|
+
error: 'Test error',
|
|
87
|
+
type: 'error'
|
|
88
|
+
}));
|
|
89
|
+
});
|
|
90
|
+
it('should call both instance and global listeners', async () => {
|
|
91
|
+
const instanceListener = jest.fn();
|
|
92
|
+
index_1.Task.listenExecutionRecords(mockListener);
|
|
93
|
+
const schema = new index_1.Schema({
|
|
94
|
+
value: index_1.Schema.number()
|
|
95
|
+
});
|
|
96
|
+
const testTask = (0, index_1.createTask)({
|
|
97
|
+
schema,
|
|
98
|
+
boundaries: {},
|
|
99
|
+
fn: async (input) => ({ result: input.value * 2 })
|
|
100
|
+
});
|
|
101
|
+
testTask.addListener(instanceListener);
|
|
102
|
+
await testTask.safeRun({ value: 7 });
|
|
103
|
+
await new Promise(resolve => process.nextTick(resolve));
|
|
104
|
+
expect(instanceListener).toHaveBeenCalledTimes(1);
|
|
105
|
+
expect(mockListener).toHaveBeenCalledTimes(1);
|
|
106
|
+
const expectedRecord = expect.objectContaining({
|
|
107
|
+
input: { value: 7 },
|
|
108
|
+
output: { result: 14 },
|
|
109
|
+
type: 'success'
|
|
110
|
+
});
|
|
111
|
+
expect(instanceListener).toHaveBeenCalledWith(expectedRecord);
|
|
112
|
+
expect(mockListener).toHaveBeenCalledWith(expectedRecord);
|
|
113
|
+
});
|
|
114
|
+
it('should work when no global listener is set', async () => {
|
|
115
|
+
// No global listener set
|
|
116
|
+
const schema = new index_1.Schema({
|
|
117
|
+
value: index_1.Schema.number()
|
|
118
|
+
});
|
|
119
|
+
const testTask = (0, index_1.createTask)({
|
|
120
|
+
schema,
|
|
121
|
+
boundaries: {},
|
|
122
|
+
fn: async (input) => ({ result: input.value * 2 })
|
|
123
|
+
});
|
|
124
|
+
// Should not throw error
|
|
125
|
+
await expect(testTask.safeRun({ value: 1 })).resolves.toBeDefined();
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe('async listener support', () => {
|
|
129
|
+
it('should support async global listeners', async () => {
|
|
130
|
+
const asyncListener = jest.fn().mockImplementation(async (_record) => {
|
|
131
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
132
|
+
return Promise.resolve();
|
|
133
|
+
});
|
|
134
|
+
index_1.Task.listenExecutionRecords(asyncListener);
|
|
135
|
+
const schema = new index_1.Schema({
|
|
136
|
+
value: index_1.Schema.number()
|
|
137
|
+
});
|
|
138
|
+
const testTask = (0, index_1.createTask)({
|
|
139
|
+
schema,
|
|
140
|
+
boundaries: {},
|
|
141
|
+
fn: async (input) => ({ result: input.value * 2 })
|
|
142
|
+
});
|
|
143
|
+
await testTask.safeRun({ value: 4 });
|
|
144
|
+
await new Promise(resolve => process.nextTick(resolve));
|
|
145
|
+
expect(asyncListener).toHaveBeenCalledTimes(1);
|
|
146
|
+
expect(asyncListener).toHaveBeenCalledWith(expect.objectContaining({
|
|
147
|
+
input: { value: 4 },
|
|
148
|
+
output: { result: 8 },
|
|
149
|
+
type: 'success'
|
|
150
|
+
}));
|
|
151
|
+
});
|
|
152
|
+
it('should handle long-running async listeners without blocking task execution', async () => {
|
|
153
|
+
const slowListener = jest.fn().mockImplementation(async () => {
|
|
154
|
+
await new Promise(resolve => setTimeout(resolve, 100)); // 100ms
|
|
155
|
+
});
|
|
156
|
+
index_1.Task.listenExecutionRecords(slowListener);
|
|
157
|
+
const schema = new index_1.Schema({
|
|
158
|
+
value: index_1.Schema.number()
|
|
159
|
+
});
|
|
160
|
+
const testTask = (0, index_1.createTask)({
|
|
161
|
+
schema,
|
|
162
|
+
boundaries: {},
|
|
163
|
+
fn: async (input) => ({ result: input.value * 2 })
|
|
164
|
+
});
|
|
165
|
+
const startTime = Date.now();
|
|
166
|
+
await testTask.safeRun({ value: 1 });
|
|
167
|
+
const endTime = Date.now();
|
|
168
|
+
// Task should complete quickly without waiting for listener
|
|
169
|
+
expect(endTime - startTime).toBeLessThan(50); // Should complete in under 50ms
|
|
170
|
+
// Wait for next tick to ensure listener was called
|
|
171
|
+
await new Promise(resolve => process.nextTick(resolve));
|
|
172
|
+
expect(slowListener).toHaveBeenCalledTimes(1);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe('error handling', () => {
|
|
176
|
+
it('should catch and log listener errors without affecting task execution', async () => {
|
|
177
|
+
const errorListener = jest.fn().mockImplementation(() => {
|
|
178
|
+
throw new Error('Listener error');
|
|
179
|
+
});
|
|
180
|
+
index_1.Task.listenExecutionRecords(errorListener);
|
|
181
|
+
const schema = new index_1.Schema({
|
|
182
|
+
value: index_1.Schema.number()
|
|
183
|
+
});
|
|
184
|
+
const testTask = (0, index_1.createTask)({
|
|
185
|
+
schema,
|
|
186
|
+
boundaries: {},
|
|
187
|
+
fn: async (input) => ({ result: input.value * 2 })
|
|
188
|
+
});
|
|
189
|
+
const [result, error] = await testTask.safeRun({ value: 5 });
|
|
190
|
+
await new Promise(resolve => process.nextTick(resolve));
|
|
191
|
+
// Task should complete successfully despite listener error
|
|
192
|
+
expect(result).toEqual({ result: 10 });
|
|
193
|
+
expect(error).toBeNull();
|
|
194
|
+
// Listener should have been called
|
|
195
|
+
expect(errorListener).toHaveBeenCalledTimes(1);
|
|
196
|
+
// Error should have been logged
|
|
197
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('ExecutionRecord listener error:', expect.any(Error));
|
|
198
|
+
});
|
|
199
|
+
it('should catch and log async listener errors', async () => {
|
|
200
|
+
const asyncErrorListener = jest.fn().mockImplementation(async () => {
|
|
201
|
+
throw new Error('Async listener error');
|
|
202
|
+
});
|
|
203
|
+
index_1.Task.listenExecutionRecords(asyncErrorListener);
|
|
204
|
+
const schema = new index_1.Schema({
|
|
205
|
+
value: index_1.Schema.number()
|
|
206
|
+
});
|
|
207
|
+
const testTask = (0, index_1.createTask)({
|
|
208
|
+
schema,
|
|
209
|
+
boundaries: {},
|
|
210
|
+
fn: async (input) => ({ result: input.value * 2 })
|
|
211
|
+
});
|
|
212
|
+
const [result, error] = await testTask.safeRun({ value: 3 });
|
|
213
|
+
// Wait a bit for the async error to be logged
|
|
214
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
215
|
+
// Task should complete successfully
|
|
216
|
+
expect(result).toEqual({ result: 6 });
|
|
217
|
+
expect(error).toBeNull();
|
|
218
|
+
// Error should have been logged
|
|
219
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('ExecutionRecord listener error:', expect.any(Error));
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
//# sourceMappingURL=listen-execution-records.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen-execution-records.test.js","sourceRoot":"","sources":["../../src/test/listen-execution-records.test.ts"],"names":[],"mappings":"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"}
|