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 CHANGED
@@ -5,8 +5,6 @@ Zero-dependency parallel task scheduler with resource management and cross-platf
5
5
  [![npm version](https://badge.fury.io/js/fyflow-scheduler.svg)](https://badge.fury.io/js/fyflow-scheduler)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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.
@@ -8,14 +8,14 @@ var __export = (target, all) => {
8
8
  __defProp(target, name, { get: all[name], enumerable: true });
9
9
  };
10
10
 
11
- // worker:C:\Users\matij\Documents\dev\fyflow-scheduler-public\core\workerWrapper.ts
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:C:\\Users\\matij\\Documents\\dev\\fyflow-scheduler-public\\core\\workerWrapper.ts"() {
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);
@@ -8,14 +8,14 @@ var __export = (target, all) => {
8
8
  __defProp(target, name, { get: all[name], enumerable: true });
9
9
  };
10
10
 
11
- // worker:C:\Users\matij\Documents\dev\fyflow-scheduler-public\core\workerWrapper.node.ts
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:C:\\Users\\matij\\Documents\\dev\\fyflow-scheduler-public\\core\\workerWrapper.node.ts"() {
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fyflow-scheduler",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Parallel task scheduler with resource management, worker pools, and cross-platform support",
5
5
  "main": "./dist/node/index.js",
6
6
  "browser": "./dist/browser/index.js",