fyflow-scheduler 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -2
- package/dist/browser/index.js +2 -2
- package/dist/node/index.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,8 +5,6 @@ Zero-dependency parallel task scheduler with resource management and cross-platf
|
|
|
5
5
|
[](https://badge.fury.io/js/fyflow-scheduler)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
|
|
8
|
-
> **Note**: This project was mostly "vibe coded" with [Claude Code](https://claude.ai/code) - it was an experiment, if such a complex library can be built with sufficient code quality.
|
|
9
|
-
|
|
10
8
|
> **Using this library from an AI agent?** [AGENTS.md](AGENTS.md) is a complete
|
|
11
9
|
> single-file reference: exact signatures, defaults, events, gotchas and recipes.
|
|
12
10
|
> Every snippet in it is executed by the test suite.
|
package/dist/browser/index.js
CHANGED
|
@@ -8,14 +8,14 @@ var __export = (target, all) => {
|
|
|
8
8
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
// worker
|
|
11
|
+
// worker:/home/runner/work/fyflow-scheduler/fyflow-scheduler/core/workerWrapper.ts
|
|
12
12
|
var workerWrapper_exports = {};
|
|
13
13
|
__export(workerWrapper_exports, {
|
|
14
14
|
default: () => workerWrapper_default
|
|
15
15
|
});
|
|
16
16
|
var url, blob, workerWrapper_default;
|
|
17
17
|
var init_workerWrapper = __esm({
|
|
18
|
-
"worker
|
|
18
|
+
"worker:/home/runner/work/fyflow-scheduler/fyflow-scheduler/core/workerWrapper.ts"() {
|
|
19
19
|
blob = new Blob(['// core/workerInterface.ts\nvar WorkerTerminationError = class extends Error {\n metadata;\n constructor(message, metadata = {}) {\n super(message);\n this.name = "WorkerTerminationError";\n this.metadata = metadata;\n }\n};\n\n// core/workerWrapper.ts\nvar WorkerClass = null;\nvar workerInstance = null;\nvar workerId = null;\nfunction sendMessage(message) {\n message.timestamp = Date.now();\n self.postMessage(message);\n}\nfunction createBaseWorkerContext() {\n return {\n workerId,\n terminateWithError: (error, metadata) => {\n sendMessage({\n type: "error",\n taskId: "worker_termination_request",\n data: {\n message: error.message,\n isWorkerTerminationRequest: true,\n metadata\n }\n });\n }\n };\n}\nfunction createWorkerContext(taskId) {\n const baseContext = createBaseWorkerContext();\n return {\n // Worker-level context\n workerId: baseContext.workerId,\n terminateWithError: baseContext.terminateWithError,\n // Task-level context\n taskId,\n sendProgress: (progress, message, details) => {\n const progressData = { progress, message, details };\n sendMessage({ type: "progress", taskId, data: progressData });\n },\n spawnTask: (config) => {\n sendMessage({ type: "spawn_task", taskId, data: config });\n }\n };\n}\nself.onmessage = async (e) => {\n const { taskId, payload, action, config, workerUrl, workerId: receivedWorkerId } = e.data;\n try {\n if (action === "init") {\n workerId = receivedWorkerId;\n const module = await import(workerUrl);\n WorkerClass = module.default;\n if (!WorkerClass || typeof WorkerClass !== "function") {\n throw new Error(`Worker script ${workerUrl} must export a default class`);\n }\n const baseWorkerContext = createBaseWorkerContext();\n workerInstance = new WorkerClass(config, baseWorkerContext);\n sendMessage({ type: "setup_started" });\n const setupStart = performance.now();\n await workerInstance.setup?.();\n sendMessage({ type: "setup_completed", data: { duration: performance.now() - setupStart } });\n sendMessage({ type: "init" });\n } else if (action === "run" && workerInstance && workerId) {\n const context = createWorkerContext(taskId);\n const result = await workerInstance.run(payload, context);\n sendMessage({ type: "result", taskId, data: result });\n } else if (action === "teardown" && workerInstance) {\n await workerInstance.teardown?.();\n workerInstance = null;\n WorkerClass = null;\n workerId = null;\n sendMessage({ type: "teardown" });\n } else {\n throw new Error(`Invalid action: ${action} or worker not initialized`);\n }\n } catch (error) {\n if (error instanceof WorkerTerminationError) {\n sendMessage({\n type: "error",\n taskId,\n data: {\n message: error.message,\n isWorkerTerminationRequest: true,\n metadata: error.metadata\n }\n });\n } else {\n sendMessage({ type: "error", taskId, data: error.message });\n }\n }\n};\n'], { type: "application/javascript" });
|
|
20
20
|
url = URL.createObjectURL(blob);
|
|
21
21
|
workerWrapper_default = new URL(url);
|
package/dist/node/index.js
CHANGED
|
@@ -8,14 +8,14 @@ var __export = (target, all) => {
|
|
|
8
8
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
// worker
|
|
11
|
+
// worker:/home/runner/work/fyflow-scheduler/fyflow-scheduler/core/workerWrapper.node.ts
|
|
12
12
|
var workerWrapper_node_exports = {};
|
|
13
13
|
__export(workerWrapper_node_exports, {
|
|
14
14
|
default: () => workerWrapper_node_default
|
|
15
15
|
});
|
|
16
16
|
var url, workerWrapper_node_default;
|
|
17
17
|
var init_workerWrapper_node = __esm({
|
|
18
|
-
"worker
|
|
18
|
+
"worker:/home/runner/work/fyflow-scheduler/fyflow-scheduler/core/workerWrapper.node.ts"() {
|
|
19
19
|
url = "data:text/javascript;base64,Ly8gY29yZS93b3JrZXJXcmFwcGVyLm5vZGUudHMKaW1wb3J0IHsgcGFyZW50UG9ydCwgaXNNYWluVGhyZWFkIH0gZnJvbSAibm9kZTp3b3JrZXJfdGhyZWFkcyI7CmlmIChpc01haW5UaHJlYWQpIHsKICB0aHJvdyBuZXcgRXJyb3IoIndvcmtlcldyYXBwZXIubm9kZS50cyBzaG91bGQgb25seSBiZSB1c2VkIGluIHdvcmtlciB0aHJlYWRzIik7Cn0KdmFyIFdvcmtlckNsYXNzID0gbnVsbDsKdmFyIHdvcmtlckluc3RhbmNlID0gbnVsbDsKdmFyIHdvcmtlcklkID0gbnVsbDsKZnVuY3Rpb24gc2VuZE1lc3NhZ2UobWVzc2FnZSkgewogIG1lc3NhZ2UudGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICBwYXJlbnRQb3J0Py5wb3N0TWVzc2FnZShtZXNzYWdlKTsKfQpmdW5jdGlvbiBjcmVhdGVCYXNlV29ya2VyQ29udGV4dCgpIHsKICByZXR1cm4gewogICAgd29ya2VySWQsCiAgICB0ZXJtaW5hdGVXaXRoRXJyb3I6IChlcnJvciwgbWV0YWRhdGEpID0+IHsKICAgICAgc2VuZE1lc3NhZ2UoewogICAgICAgIHR5cGU6ICJlcnJvciIsCiAgICAgICAgdGFza0lkOiAid29ya2VyX3Rlcm1pbmF0aW9uX3JlcXVlc3QiLAogICAgICAgIGRhdGE6IHsKICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsCiAgICAgICAgICBpc1dvcmtlclRlcm1pbmF0aW9uUmVxdWVzdDogdHJ1ZSwKICAgICAgICAgIG1ldGFkYXRhCiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Owp9CmZ1bmN0aW9uIGNyZWF0ZVdvcmtlckNvbnRleHQodGFza0lkKSB7CiAgY29uc3QgYmFzZUNvbnRleHQgPSBjcmVhdGVCYXNlV29ya2VyQ29udGV4dCgpOwogIHJldHVybiB7CiAgICAvLyBXb3JrZXItbGV2ZWwgY29udGV4dAogICAgd29ya2VySWQ6IGJhc2VDb250ZXh0LndvcmtlcklkLAogICAgdGVybWluYXRlV2l0aEVycm9yOiBiYXNlQ29udGV4dC50ZXJtaW5hdGVXaXRoRXJyb3IsCiAgICAvLyBUYXNrLWxldmVsIGNvbnRleHQKICAgIHRhc2tJZCwKICAgIHNlbmRQcm9ncmVzczogKHByb2dyZXNzLCBtZXNzYWdlLCBkZXRhaWxzKSA9PiB7CiAgICAgIGNvbnN0IHByb2dyZXNzRGF0YSA9IHsgcHJvZ3Jlc3MsIG1lc3NhZ2UsIGRldGFpbHMgfTsKICAgICAgc2VuZE1lc3NhZ2UoeyB0eXBlOiAicHJvZ3Jlc3MiLCB0YXNrSWQsIGRhdGE6IHByb2dyZXNzRGF0YSB9KTsKICAgIH0sCiAgICBzcGF3blRhc2s6IChjb25maWcpID0+IHsKICAgICAgc2VuZE1lc3NhZ2UoeyB0eXBlOiAic3Bhd25fdGFzayIsIHRhc2tJZCwgZGF0YTogY29uZmlnIH0pOwogICAgfQogIH07Cn0KcGFyZW50UG9ydD8ub24oIm1lc3NhZ2UiLCBhc3luYyAoZGF0YSkgPT4gewogIGNvbnN0IHsgdGFza0lkLCBwYXlsb2FkLCBhY3Rpb24sIGNvbmZpZywgd29ya2VyVXJsLCB3b3JrZXJJZDogcmVjZWl2ZWRXb3JrZXJJZCB9ID0gZGF0YTsKICB0cnkgewogICAgaWYgKGFjdGlvbiA9PT0gImluaXQiKSB7CiAgICAgIHdvcmtlcklkID0gcmVjZWl2ZWRXb3JrZXJJZDsKICAgICAgY29uc3Qgd29ya2VyTW9kdWxlID0gYXdhaXQgKHdvcmtlclVybC5zdGFydHNXaXRoKCJkYXRhIikgPyBpbXBvcnQobmV3IFVSTCh3b3JrZXJVcmwpKSA6IGltcG9ydCh3b3JrZXJVcmwpKTsKICAgICAgV29ya2VyQ2xhc3MgPSB3b3JrZXJNb2R1bGUuZGVmYXVsdDsKICAgICAgaWYgKCFXb3JrZXJDbGFzcyB8fCB0eXBlb2YgV29ya2VyQ2xhc3MgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdvcmtlciBzY3JpcHQgJHt3b3JrZXJVcmx9IG11c3QgZXhwb3J0IGEgZGVmYXVsdCBjbGFzc2ApOwogICAgICB9CiAgICAgIGNvbnN0IGJhc2VXb3JrZXJDb250ZXh0ID0gY3JlYXRlQmFzZVdvcmtlckNvbnRleHQoKTsKICAgICAgd29ya2VySW5zdGFuY2UgPSBuZXcgV29ya2VyQ2xhc3MoY29uZmlnLCBiYXNlV29ya2VyQ29udGV4dCk7CiAgICAgIHNlbmRNZXNzYWdlKHsgdHlwZTogInNldHVwX3N0YXJ0ZWQiIH0pOwogICAgICBjb25zdCBzZXR1cFN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgIGF3YWl0IHdvcmtlckluc3RhbmNlLnNldHVwPy4oKTsKICAgICAgc2VuZE1lc3NhZ2UoeyB0eXBlOiAic2V0dXBfY29tcGxldGVkIiwgZGF0YTogeyBkdXJhdGlvbjogcGVyZm9ybWFuY2Uubm93KCkgLSBzZXR1cFN0YXJ0IH0gfSk7CiAgICAgIHNlbmRNZXNzYWdlKHsgdHlwZTogImluaXQiIH0pOwogICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICJydW4iICYmIHdvcmtlckluc3RhbmNlICYmIHdvcmtlcklkKSB7CiAgICAgIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVXb3JrZXJDb250ZXh0KHRhc2tJZCk7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmtlckluc3RhbmNlLnJ1bihwYXlsb2FkLCBjb250ZXh0KTsKICAgICAgc2VuZE1lc3NhZ2UoeyB0eXBlOiAicmVzdWx0IiwgdGFza0lkLCBkYXRhOiByZXN1bHQgfSk7CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gInRlYXJkb3duIiAmJiB3b3JrZXJJbnN0YW5jZSkgewogICAgICBhd2FpdCB3b3JrZXJJbnN0YW5jZS50ZWFyZG93bj8uKCk7CiAgICAgIHdvcmtlckluc3RhbmNlID0gbnVsbDsKICAgICAgV29ya2VyQ2xhc3MgPSBudWxsOwogICAgICB3b3JrZXJJZCA9IG51bGw7CiAgICAgIHNlbmRNZXNzYWdlKHsgdHlwZTogInRlYXJkb3duIiB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhY3Rpb246ICIke2FjdGlvbn0iIG9yIHdvcmtlciBub3QgaW5pdGlhbGl6ZWRgKTsKICAgIH0KICB9IGNhdGNoIChlcnJvcikgewogICAgaWYgKGVycm9yLm5hbWUgPT09ICJXb3JrZXJUZXJtaW5hdGlvbkVycm9yIiAmJiBlcnJvci5tZXRhZGF0YSkgewogICAgICBzZW5kTWVzc2FnZSh7CiAgICAgICAgdHlwZTogImVycm9yIiwKICAgICAgICB0YXNrSWQsCiAgICAgICAgZGF0YTogewogICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSwKICAgICAgICAgIGlzV29ya2VyVGVybWluYXRpb25SZXF1ZXN0OiB0cnVlLAogICAgICAgICAgbWV0YWRhdGE6IGVycm9yLm1ldGFkYXRhCiAgICAgICAgfQogICAgICB9KTsKICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTApKTsKICAgICAgcHJvY2Vzcz8uZXhpdD8uKDApOwogICAgfSBlbHNlIHsKICAgICAgc2VuZE1lc3NhZ2UoeyB0eXBlOiAiZXJyb3IiLCB0YXNrSWQsIGRhdGE6IGVycm9yLm1lc3NhZ2UgfSk7CiAgICB9CiAgfQp9KTsK";
|
|
20
20
|
workerWrapper_node_default = new URL(url);
|
|
21
21
|
}
|
package/package.json
CHANGED