crypto-worker.js Cannot read property 'setKey' of null

271
14 мая 2018, 05:50

Использую Vue. Чтобы заново не генерировать ключи при каждом обращении, достал ключ из локального хранилища, обозначил константой и пробую подставлять к this.originPublicKey значению, которое изначально пустое.

Но crypto-worker ругается Cannot read property 'setKey' of null. Если не подставлять значение, а позволить скрипту самому его получить, все работает. Подскажите, пожалуйста, как решить эту проблему?

  const getPublicKeyCache = localStorage['public_key']
    async created () {
          this.cryptWorker = new Worker('crypto-worker.js')
          $("#reload_status").html(lang['createConnection'])
         // this.originPublicKey = await this.getWebWorkerResponse('generate-keys') генерация ключа с нуля
          //Если ключ уже сгенерирован, достать из хранилища, дабы не генерировать снова
          this.originPublicKey = getPublicKeyCache
          this.socket = io()
          this.setupSocketListeners()
      }

Метод, который обращается к воркеру за ключами

getWebWorkerResponse (messageType, messagePayload) {
      return new Promise((resolve, reject) => {
        const messageId = Math.floor(Math.random() * 100000)
        this.cryptWorker.postMessage([messageType, messageId].concat(messagePayload))
        const handler = function (e) {
            if (e.data[0] === messageId) {
                e.currentTarget.removeEventListener(e.type, handler) 
                resolve(e.data[1])
            }
        }
        this.cryptWorker.addEventListener('message', handler)
      })
    },

Код crypto-worker.js

self.window = self
self.importScripts('jsencrypt.min.js');
let crypt = null
let privateKey = null
onmessage = function(e) {
  const [ messageType, messageId, text, key ] = e.data
  let result
  switch (messageType) {
    case 'generate-keys':
      result = generateKeypair()
      break
    case 'encrypt':
      result = encrypt(text, key)
      break
    case 'decrypt':
      result = decrypt(text)
      break
  }
  // Return result to the UI thread
  postMessage([ messageId, result ])
}
/** Generate and store keypair */
function generateKeypair () {
  crypt = new JSEncrypt({default_key_size: 2056})
  privateKey = crypt.getPrivateKey()
  // Only return the public key, keep the private key hidden
  return crypt.getPublicKey() 
}
/** Encrypt the provided string with the destination public key */
function encrypt (content, publicKey) {
  crypt.setKey(publicKey)
  return crypt.encrypt(content)
}
/** Decrypt the provided string with the local private key */
function decrypt (content) {
  crypt.setKey(privateKey)
  return crypt.decrypt(content)
}
READ ALSO
Как правильно написать async function javascript

Как правильно написать async function javascript

Решаю задание и вот возникла проблема з написанием функцииВсе методы прописал, а вот как задейсвовать их не знаю

220
Получения данных списка, vue.js

Получения данных списка, vue.js

Я решил сделать перебор статей используя vueВ общем суть такова, у меня не работало dropdown bootstrap в самом vue, и я скачал дополнения (vue-js-dropdown)

217
React, разница в месте определения state

React, разница в месте определения state

Использую ReactJS, пишу на ECMASсript 7 и использую транслятор BabelJS

174