Automattic/node-canvas

make module context-aware

Open

#1.394 aberto em 23 de mar. de 2019

Ver no GitHub
 (52 comments) (89 reactions) (0 assignees)JavaScript (1.140 forks)batch import
Help wanted

Métricas do repositório

Stars
 (9.524 stars)
Métricas de merge de PR
 (Mesclagem média 34d 18h) (2 fundiu PRs em 30d)

Description

Issue or Feature

I've been experimenting with worker threads in node.js recently and noticed that the canvas module does not appear to be context-aware. In other words, the module will load/instantiate once, but as soon as another thread attempts to require canvas for it's own use, the following error is thrown:

Error: Module did not self-register.
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:840:18)
    at Module.load (internal/modules/cjs/loader.js:666:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:606:12)
    at Function.Module._load (internal/modules/cjs/loader.js:598:3)
    at Module.require (internal/modules/cjs/loader.js:705:19)
    at require (internal/modules/cjs/helpers.js:14:16)
    at Object.<anonymous> (~/node_modules/canvas/lib/bindings.js:3:18)
    at Module._compile (internal/modules/cjs/loader.js:799:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:810:10)
    at Module.load (internal/modules/cjs/loader.js:666:32)

Steps to Reproduce

In main thread...

const {Worker} = require('worker_threads');
var worker1 = new Worker('./child-thread.js'); 
var worker2 = new Worker('./child-thread.js');
// etc.

In child-thread.js...

var Canvas = require('canvas');
var canvas = Canvas.createCanvas(200, 200);
var ctx = canvas.getContext('2d');
// etc.

References

Node.js documentation: https://nodejs.org/api/addons.html#addons_context_aware_addons Similar issue: https://github.com/schroffl/node-lzo/pull/11

Environment

  • node-canvas version 2.4.1
  • Mac OS 10.14.3
  • node version 11.12.1

Guia do colaborador