Source: workers/parent-browser.js

  1. /*!
  2. * parent.js - worker processes for bcoin
  3. * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License).
  4. * https://github.com/bcoin-org/bcoin
  5. */
  6. 'use strict';
  7. const assert = require('bsert');
  8. const EventEmitter = require('events');
  9. /**
  10. * Parent
  11. * Represents the parent process.
  12. * @alias module:workers.Parent
  13. * @extends EventEmitter
  14. * @ignore
  15. */
  16. class Parent extends EventEmitter {
  17. /**
  18. * Create the parent process.
  19. * @constructor
  20. */
  21. constructor() {
  22. super();
  23. this.init();
  24. }
  25. /**
  26. * Initialize master (web workers).
  27. * @private
  28. */
  29. init() {
  30. global.onerror = (event) => {
  31. this.emit('error', new Error('Worker error.'));
  32. };
  33. global.onmessage = (event) => {
  34. let data;
  35. if (typeof event.data === 'string') {
  36. data = Buffer.from(event.data, 'hex');
  37. assert(data.length === event.data.length / 2);
  38. } else {
  39. assert(event.data && typeof event.data === 'object');
  40. assert(event.data.data && typeof event.data.data.length === 'number');
  41. data = event.data.data;
  42. data.__proto__ = Buffer.prototype;
  43. }
  44. this.emit('data', data);
  45. };
  46. }
  47. /**
  48. * Send data to parent process.
  49. * @param {Buffer} data
  50. * @returns {Boolean}
  51. */
  52. write(data) {
  53. if (global.postMessage.length === 2) {
  54. data.__proto__ = Uint8Array.prototype;
  55. global.postMessage({ data }, [data]);
  56. } else {
  57. global.postMessage(data.toString('hex'));
  58. }
  59. return true;
  60. }
  61. /**
  62. * Destroy the parent process.
  63. */
  64. destroy() {
  65. global.close();
  66. }
  67. }
  68. /*
  69. * Expose
  70. */
  71. module.exports = Parent;