Completed
Push — master ( 61d444...b3f358 )
by Jan
16s queued 14s
created

src/frames/frame-ctoc.ts   A

Complexity

Total Complexity 7
Complexity/F 0

Size

Lines of Code 60
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 47
mnd 7
bc 7
fnc 0
dl 0
loc 60
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import { FrameBuilder } from "../FrameBuilder"
2
import { FrameReader } from "../FrameReader"
3
import * as TagsHelpers from '../TagsHelpers'
4
import type { Data } from "./type"
5
6
export const CTOC = {
7
    create: (data: Data) => {
8
        if(!(data instanceof Array)) {
9
            data = [data]
10
        }
11
12
        return Buffer.concat(data.map((toc: Data, index: Data) => {
13
            if(!toc || !toc.elementID) {
14
                return null
15
            }
16
            if(!(toc.elements instanceof Array)) {
17
                toc.elements = []
18
            }
19
20
            const ctocFlags = Buffer.alloc(1, 0)
21
            if(index === 0) {
22
                ctocFlags[0] += 2
23
            }
24
            if(toc.isOrdered) {
25
                ctocFlags[0] += 1
26
            }
27
28
            const builder = new FrameBuilder("CTOC")
29
                .appendNullTerminatedValue(toc.elementID)
30
                .appendValue(ctocFlags, 1)
31
                .appendNumber(toc.elements.length, 1)
32
            toc.elements.forEach((el: Data) => {
33
                builder.appendNullTerminatedValue(el)
34
            })
35
            if(toc.tags) {
36
                builder.appendValue(TagsHelpers.createBufferFromTags(toc.tags))
37
            }
38
            return builder.getBuffer()
39
        }).filter((toc: Data) => toc instanceof Buffer))
40
    },
41
    read: (buffer: Buffer) => {
42
        const reader = new FrameReader(buffer)
43
        const elementID = reader.consumeNullTerminatedValue('string')
44
        const flags = reader.consumeStaticValue('number', 1)
45
        const entries = reader.consumeStaticValue('number', 1)
46
        const elements = []
47
        for(let i = 0; i < entries; i++) {
48
            elements.push(reader.consumeNullTerminatedValue('string'))
49
        }
50
        const tags = TagsHelpers.getTagsFromTagBody(reader.consumeStaticValue())
51
52
        return {
53
            elementID,
54
            isOrdered: !!(flags & 0x01),
55
            elements,
56
            tags
57
        }
58
    }
59
}
60