Passed
Pull Request — master (#173)
by
unknown
01:49
created

src/file-stream-processor.ts   A

Complexity

Total Complexity 7
Complexity/F 1.4

Size

Lines of Code 106
Function Count 5

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 76
mnd 2
bc 2
fnc 5
dl 0
loc 106
rs 10
bpm 0.4
cpm 1.4
noi 0
c 0
b 0
f 0

5 Functions

Rating   Name   Duplication   Size   Complexity  
A Id3TagRemover.processReadBuffer 0 32 2
A Id3TagRemover.getReadBuffer 0 3 1
A Id3TagStreamProcessor.getTags 0 3 1
A Id3TagStreamProcessor.getReadBuffer 0 3 1
A Id3TagStreamProcessor.processReadBuffer 0 26 2
1
import { getId3Tag, Header } from './id3-tag'
2
3
// const FileBufferSize = 20 * 1024 * 1024
4
5
// Must be at least Header.size which is the min size to detect an ID3 header.
6
// Naming it help identifying the code handling it.
7
const RolloverBufferSize = Header.size
8
9
export class Id3TagStreamProcessor {
10
    private buffer: Buffer
11
    private tags: Buffer[] = []
12
    private rolloverSize = 0
13
    continue = false
14
15
    constructor(bufferSize: number) {
16
        // TODO enforce min buffer size here,
17
        // i.e. bufferSize + RolloverBufferSize + 1
18
        this.buffer = Buffer.alloc(bufferSize)
19
    }
20
21
    getReadBuffer() {
22
        return this.buffer.subarray(this.rolloverSize)
23
    }
24
25
    processReadBuffer(readSize: number) {
26
        let data = this.buffer.subarray(0, this.rolloverSize + readSize)
27
28
        // TODO extract that to id3-tag
29
        // Remove tags from `data`
30
        let missingData = Buffer.alloc(0)
31
        let tag
32
        while((tag = getId3Tag(data))) {
33
            const tagBuffer = Buffer.alloc(tag.size)
34
            tag.data.copy(tagBuffer)
35
            data = tag.after
36
            missingData = tagBuffer.subarray(tag.data.length)
37
        }
38
39
        // Exclude rollover window on the last part
40
        this.rolloverSize = Math.min(RolloverBufferSize, data.length, readSize)
41
        const rolloverStart = data.length - this.rolloverSize
42
        const rolloverData = Buffer.from(data.subarray(rolloverStart))
43
44
        // Update rollover window
45
        rolloverData.copy(this.buffer)
46
47
        this.continue = this.rolloverSize !==0 || missingData.length !== 0
48
49
        return missingData
50
    }
51
52
    getTags() {
53
        return this.tags
54
    }
55
}
56
57
export class Id3TagRemover {
58
    private buffer: Buffer
59
    private rolloverSize = 0
60
    continue = false
61
62
    constructor(bufferSize: number) {
63
        // TODO enforce min buffer size here,
64
        // i.e. bufferSize + RolloverBufferSize + 1
65
        this.buffer = Buffer.alloc(bufferSize)
66
    }
67
68
    getReadBuffer() {
69
        return this.buffer.subarray(this.rolloverSize)
70
    }
71
72
    processReadBuffer(readSize: number) {
73
        let data = this.buffer.subarray(0, this.rolloverSize + readSize)
74
75
        // TODO extract that to id3-tag
76
        // Remove tags from `data`
77
        let missingBytes = 0
78
        const parts = Array.from((function*() {
79
            let tag
80
            while((tag = getId3Tag(data))) {
81
                yield tag.before
82
                data = tag.after
83
                missingBytes = tag.missingBytes
84
            }
85
        })())
86
87
        // Exclude rollover window on the last part
88
        this.rolloverSize = Math.min(RolloverBufferSize, data.length, readSize)
89
        const rolloverStart = data.length - this.rolloverSize
90
        const rolloverData = Buffer.from(data.subarray(rolloverStart))
91
        parts.push(data.subarray(0, rolloverStart))
92
93
        const writeBuffer = Buffer.concat(parts)
94
95
        // Update rollover window
96
        rolloverData.copy(this.buffer)
97
98
        this.continue = this.rolloverSize !==0 || missingBytes !== 0
99
100
        return {
101
            skipBuffer: Buffer.alloc(missingBytes),
102
            writeBuffer
103
        }
104
    }
105
}
106