{"id":15416569,"url":"https://github.com/remcohaszing/monaco-worker-manager","last_synced_at":"2025-07-29T21:11:16.261Z","repository":{"id":57687543,"uuid":"477335300","full_name":"remcohaszing/monaco-worker-manager","owner":"remcohaszing","description":"Easily deal with monaco workers","archived":false,"fork":false,"pushed_at":"2025-06-20T07:16:18.000Z","size":180,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-07-07T09:02:13.040Z","etag":null,"topics":["monaco","monaco-editor","webworker"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/remcohaszing.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-03T12:30:04.000Z","updated_at":"2025-06-20T07:16:21.000Z","dependencies_parsed_at":"2024-06-18T20:12:24.462Z","dependency_job_id":null,"html_url":"https://github.com/remcohaszing/monaco-worker-manager","commit_stats":{"total_commits":10,"total_committers":1,"mean_commits":10.0,"dds":0.0,"last_synced_commit":"1d87a5548add6572d79aa5b67c28665cf55e3881"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/remcohaszing/monaco-worker-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remcohaszing%2Fmonaco-worker-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remcohaszing%2Fmonaco-worker-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remcohaszing%2Fmonaco-worker-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remcohaszing%2Fmonaco-worker-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/remcohaszing","download_url":"https://codeload.github.com/remcohaszing/monaco-worker-manager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remcohaszing%2Fmonaco-worker-manager/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267759334,"owners_count":24140048,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-29T02:00:12.549Z","response_time":2574,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["monaco","monaco-editor","webworker"],"created_at":"2024-10-01T17:12:27.739Z","updated_at":"2025-07-29T21:11:16.248Z","avatar_url":"https://github.com/remcohaszing.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Monaco Worker Manager\n\n[![ci workflow](https://github.com/remcohaszing/monaco-worker-manager/actions/workflows/ci.yaml/badge.svg)](https://github.com/remcohaszing/monaco-worker-manager/actions/workflows/ci.yaml)\n[![npm version](https://img.shields.io/npm/v/monaco-worker-manager)](https://www.npmjs.com/package/monaco-worker-manager)\n[![npm downloads](https://img.shields.io/npm/dm/monaco-worker-manager)](https://www.npmjs.com/package/monaco-worker-manager)\n\nA Monaco worker manager handles workers in a type safe manner.\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [API](#api)\n  - [`monaco-worker-manager#createWorkerManager(options)`](#monaco-worker-managercreateworkermanageroptions)\n  - [`monaco-worker-manager/worker#initialize(fn)`](#monaco-worker-managerworkerinitializefn)\n- [License](#license)\n\n## Installation\n\nThis project has a peer dependency on `monaco-editor`. It’s recommded to add it explicitly.\n\n```sh\nnpm install monaco-editor monaco-worker-manager\n```\n\n## Usage\n\nCreate a module that contains a Monaco web worker, let’s call it `my.worker.ts`.\n\n```typescript\nimport { initialize } from 'monaco-worker-manager/worker'\nimport { doValidate } from 'my-language-service'\n\nexport interface MyWorker {\n  doValidate: (uri: string) =\u003e Violation[]\n}\n\ninitialize\u003cMyWorker\u003e((ctx, options) =\u003e {\n  function getModel(uri: string): undefined | worker.IMirrorModel {\n    for (const model of ctx.getMirrorModels()) {\n      if (String(model.uri) === uri) {\n        return model\n      }\n    }\n  }\n\n  return {\n    doValidate(uri) {\n      const model = getModel(uri)\n\n      if (!model) {\n        return []\n      }\n\n      return doValidate(model, options)\n    }\n  }\n})\n```\n\nNow create a monaco environment and create a worker manager in the main thread:\n\n```typescript\nimport { editor, Uri } from 'monaco-editor'\nimport { createWorkerManager } from 'monaco-worker-manager'\n\nimport { type MyWorker } from './my.worker'\n\nconst myLabel = 'myLabel'\nconst myModuleId = 'my.worker'\n\nglobalThis.MonacoEnvironment = {\n  getWorker(moduleId, label) {\n    switch (label) {\n      case 'editorWorkerService':\n        return new Worker(new URL('monaco-editor/esm/vs/editor/editor.worker', import.meta.url))\n      case myLabel:\n        return new Worker(new URL('my.worker', import.meta.url))\n      default:\n        throw new Error(`Unknown label ${label}`)\n    }\n  }\n}\n\nconst workerManager = createWorkerManager\u003cMyWorker\u003e({\n  label: myLabel,\n  moduleId: myModuleId\n})\n\nconst model = editor.createModel('Hello Monaco!', 'plaintext', Uri.parse('file:///hello.txt'))\n\nconst worker = await workerManager.getWorker(model.uri)\nconst diagnostics = await worker.doValidate(String(model.uri))\n```\n\n## API\n\nThis project exposes 2 modules: one to use in the main thread, another to create your own worker.\n\n### `monaco-worker-manager#createWorkerManager(options)`\n\nCreate a worker manager.\n\nA worker manager is an object which deals with Monaco based web workers, such as cleanups and idle\ntimeouts.\n\n#### Options\n\n- `options.createData`: The data to send over when creating the worker. (Optional)\n- `options.interval` How often to check if a worker is idle in milliseconds. (Optional, default:\n  `30_000`)\n- `options.label`: A label to be used to identify the web worker.\n- `options.moduleId`: The module id to be used to identify the web worker.\n- `options.stopWhenIdleFor`: The worker is stopped after this time has passed in milliseconds. Set\n  to Infinity to never stop the worker. (Optional, default: `120_000`)\n\n#### Return value\n\nA disposable object with the following keys:\n\n- `getWorker(...resources: Uri[])`: An unbound method for getting the web worker.\n- `updateCreateData(newCreateData)`: An unbound method which updates the create data and reloads the\n  worker.\n\n### `monaco-worker-manager/worker#initialize(fn)`\n\nCreate a web worker in a type safe manner.\n\nThe function will be called with the following arguments:\n\n1. The Monaco worker context.\n2. The create data defined by the worker manager.\n\n## License\n\n[MIT](https://github.com/remcohaszing/monaco-worker-manager/blob/main/LICENSE.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremcohaszing%2Fmonaco-worker-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fremcohaszing%2Fmonaco-worker-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremcohaszing%2Fmonaco-worker-manager/lists"}