Я пишу шифровальный мессенджер с использованием библиотеки 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": "/"
},
...
]