Как связать OpenPGP. js встроенный Web Worker в Angular приложение? - PullRequest
0 голосов
/ 23 февраля 2020

Я пишу шифровальный мессенджер с использованием библиотеки openpgp. js и для снятия криптографических операций c из основного потока, я должен использовать встроенный Web Worker.

Чтобы использовать его, я должен указать имя файла работника в коде.

await openpgp.initWorker({ path: 'openpgp.worker.js' });

Но когда я создаю Angular приложение с ng build он выводит один main.js файл, который содержит весь код приложения, и указывать это имя файла было бы не удобно.

Из-за использования инфраструктуры Angular я соответственно использую TypeScript и импортирую openpgp. js Я использую библиотеку определений типов @ types / openpgp

Файл встроенного Web Worker находится здесь: https://github.com/openpgpjs/openpgpjs/blob/master/src/worker/worker.js

Необходимо связать так, чтобы и рабочий, и файл самой библиотеки openpgp (потому что рабочий запрос openpgp.js файл ) программно-аппаратного обеспечения выводились как отдельные файлы и использовались кодом приложения.

Вот код, который я использую:

import { Injectable, OnDestroy } from '@angular/core';                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

import { initWorker, ..., destroyWorker } from 'openpgp';                                                                                                                                             

@Injectable({                                                                                                                                                                                                                                 
  providedIn: 'root'                                                                                                                                                                                                                          
})                                                                                                                                                                                                                                            
export class CrypterService implements OnDestroy {
  constructor() {
    initWorker({ path: 'openpgp.worker.js' });
  }

  generateKeys() { ... }
  encrypt(...) {...}
  decrypt(...) {...}

  ngOnDestroy() {
    destroyWorker();
  }
}

Чтобы обойти эту проблему, я поместил файлы openpgp.js и openpgp.worker.js в каталог /public и настроил angular.json следующим образом:

...

            "assets": [                                                                                                                                                                                                                       
              {                                                                                                                                                                                                                               
                "glob": "openpgp.js",                                                                                                                                                                                                     
                "input": "src/public",                                                                                                                                                                                                        
                "output": "/"                                                                                                                                                                                                                 
              },                                                                                                                                                                                                                              
              {                                                                                                                                                                                                                               
                "glob": "openpgp.worker.js",                                                                                                                                                                                              
                "input": "src/public",                                                                                                                                                                                                        
                "output": "/"                                                                                                                                                                                                                 
              },
              ...
            ]

...