mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			73 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * Modified from https://github.com/nika-begiashvili/libarchivejs
 | 
						|
 */
 | 
						|
 | 
						|
const { parentPort } = require('worker_threads')
 | 
						|
const { getArchiveReader } = require('./wasm-module')
 | 
						|
 | 
						|
let reader = null
 | 
						|
let busy = false
 | 
						|
 | 
						|
getArchiveReader((_reader) => {
 | 
						|
  reader = _reader
 | 
						|
  busy = false
 | 
						|
  parentPort.postMessage({ type: 'READY' })
 | 
						|
})
 | 
						|
 | 
						|
parentPort.on('message', async msg => {
 | 
						|
  if (busy) {
 | 
						|
    parentPort.postMessage({ type: 'BUSY' })
 | 
						|
    return
 | 
						|
  }
 | 
						|
 | 
						|
  let skipExtraction = false
 | 
						|
  busy = true
 | 
						|
  try {
 | 
						|
    switch (msg.type) {
 | 
						|
      case 'HELLO': // module will respond READY when it's ready
 | 
						|
        break
 | 
						|
      case 'OPEN':
 | 
						|
        await reader.open(msg.file)
 | 
						|
        parentPort.postMessage({ type: 'OPENED' })
 | 
						|
        break
 | 
						|
      case 'LIST_FILES':
 | 
						|
        skipExtraction = true
 | 
						|
      // eslint-disable-next-line no-fallthrough
 | 
						|
      case 'EXTRACT_FILES':
 | 
						|
        for (const entry of reader.entries(skipExtraction)) {
 | 
						|
          parentPort.postMessage({ type: 'ENTRY', entry })
 | 
						|
        }
 | 
						|
        parentPort.postMessage({ type: 'END' })
 | 
						|
        break
 | 
						|
      case 'EXTRACT_SINGLE_FILE':
 | 
						|
        for (const entry of reader.entries(true, msg.target)) {
 | 
						|
          if (entry.fileData) {
 | 
						|
            parentPort.postMessage({ type: 'FILE', entry })
 | 
						|
          }
 | 
						|
        }
 | 
						|
        break
 | 
						|
      case 'CHECK_ENCRYPTION':
 | 
						|
        parentPort.postMessage({ type: 'ENCRYPTION_STATUS', status: reader.hasEncryptedData() })
 | 
						|
        break
 | 
						|
      case 'SET_PASSPHRASE':
 | 
						|
        reader.setPassphrase(msg.passphrase)
 | 
						|
        parentPort.postMessage({ type: 'PASSPHRASE_STATUS', status: true })
 | 
						|
        break
 | 
						|
      default:
 | 
						|
        throw new Error('Invalid Command')
 | 
						|
    }
 | 
						|
  } catch (err) {
 | 
						|
    parentPort.postMessage({
 | 
						|
      type: 'ERROR',
 | 
						|
      error: {
 | 
						|
        message: err.message,
 | 
						|
        name: err.name,
 | 
						|
        stack: err.stack
 | 
						|
      }
 | 
						|
    })
 | 
						|
  } finally {
 | 
						|
    // eslint-disable-next-line require-atomic-updates
 | 
						|
    busy = false
 | 
						|
  }
 | 
						|
})
 |