f-hj/slsk-client

View on GitHub
lib/share/shared.js

Summary

Maintainability
A
0 mins
Test Coverage
const EventEmitter = require('events')
const fs = require('fs')
const separator = require('path').sep
const debug = require('debug')('slsk:shared:i')
const matches = require('./matches.js')

module.exports = class Shared extends EventEmitter {
  constructor () {
    super()
    this.files = []

    this.on('file', file => {
      let path = file.path
      this.files.push({
        key: path.slice(Math.max(path.length - 2, 1)).join(separator),
        value: {
          file: path.join(separator),
          size: file.size
        }
      })
    })
  }

  scanFolder (folder) {
    fs.readdir(folder, (err, files) => {
      if (err) {
        debug(`Folder ${folder} does not exist`)
      } else {
        files.forEach(file => {
          this.scan([folder, file])
        })
        debug(`Scan folder ${folder} completed, ${this.files.length} shared`)
        this.emit('complete', folder)
      }
    })
  }

  scan (path) {
    let file = path.join(separator)
    let stats = fs.statSync(file)
    if (stats.isFile()) {
      this.emit('file', {
        path,
        size: stats.size
      })
    } else {
      fs.readdirSync(file).forEach(it => {
        this.scan(path.concat([it]))
      })
    }
  }

  search (query) {
    return this.files.filter(it => matches(it.key, query))
  }
}