mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-31 18:37:00 -04: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
 | |
|   }
 | |
| })
 |