New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

monaco-worker-manager

Package Overview
Dependencies
Maintainers
1
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

monaco-worker-manager

Easily deal with monaco workers

latest
Source
npmnpm
Version
2.0.1
Version published
Maintainers
1
Created
Source

Monaco Worker Manager

ci workflow npm version prettier code style

A Monaco worker manager handles workers in a type safe manner.

Installation

This project has a peer dependency on monaco-editor. It’s recommded to add it explicitly.

npm install monaco-editor monaco-editor-manager

Usage

Create a module that contains a Monaco web worker, let’s call it my.worker.ts.

import { initialize } from 'monaco-worker-manager/worker';
import { doValidate } from 'my-language-service';

export interface MyWorker {
  doValidate: (uri: string) => Violation[];
}

initialize<MyWorker>((ctx, options) => {
  function getModel(uri: string): worker.IMirrorModel | undefined {
    for (const model of ctx.getMirrorModels()) {
      if (String(model.uri) === uri) {
        return model;
      }
    }
  }

  return {
    doValidate(uri) {
      const model = getModel(uri);

      if (!model) {
        return [];
      }

      return doValidate(model, options);
    },
  };
});

Now create a monaco environment and create a worker manager in the main thread:

import { editor, Uri } from 'monaco-editor';
import { createWorkerManager } from 'monaco-worker-manager';

import { MyWorker } from './my.worker';

const myLabel = 'myLabel';
const myModuleId = 'my.worker';

window.MonacoEnvironment = {
  getWorker(moduleId, label) {
    switch (label) {
      case 'editorWorkerService':
        return new Worker(new URL('monaco-editor/esm/vs/editor/editor.worker', import.meta.url));
      case myLabel:
        return new Worker(new URL('my.worker', import.meta.url));
      default:
        throw new Error(`Unknown label ${label}`);
    }
  },
};

const workerManager = createWorkerManager<MyWorker>({
  label: myLabel,
  moduleId: myModuleId,
});

const model = editor.createModel('Hello Monaco!', 'plaintext', Uri.parse('file:///hello.txt'));

async function main(): Promise<void> {
  const worker = await workerManager.getWorker(model.uri);
  const diagnostics = await worker.doValidate(String(model.uri));
  console.log(diagnostics);
}

main();

API

This project exposes 2 modules: one to use in the main thread, another to create your own worker.

monaco-worker-manager#createWorkerManager(options)

Create a worker manager.

A worker manager is an object which deals with Monaco based web workers, such as cleanups and idle timeouts.

Options

  • options.createData: The data to send over when creating the worker. (Optional)
  • options.interval How often to check if a worker is idle in milliseconds. (Optional, default: 30_000)
  • options.label: A label to be used to identify the web worker.
  • options.moduleId: The module id to be used to identify the web worker.
  • options.stopWhenIdleFor: The worker is stopped after this time has passed in milliseconds. Set to Infinity to never stop the worker. (Optional, default: 120_000)

Return value

A disposable object with the following keys:

  • getWorker(...resources: Uri[]): An unbound method for getting the web worker.
  • updateCreateData(newCreateData): An unbound method which updates the create data and reloads the worker.

monaco-worker-manager/worker#initialize(fn)

Create a web worker in a type safe manner.

The function will be called with the following arguments:

  • The Monaco worker context.
  • The create data defined by the worker manager.

License

MIT

Keywords

monaco

FAQs

Package last updated on 03 Jun 2022

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts