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

src/frames/frame-chap.ts   A

Complexity

Total Complexity 7
Complexity/F 0

Size

Lines of Code 50
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 42
mnd 7
bc 7
fnc 0
dl 0
loc 50
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 CHAP = {
7
    create: (data: Data) => {
8
        if (!(data instanceof Array)) {
9
            data = [data]
10
        }
11
12
        return Buffer.concat(data.map((chap: Data) => {
13
            if (!chap || !chap.elementID || typeof chap.startTimeMs === "undefined" || !chap.endTimeMs) {
14
                return null
15
            }
16
            const getOffset = (offset?: number) => offset ?? 0xFFFFFFFF
17
            return new FrameBuilder("CHAP")
18
                .appendNullTerminatedValue(chap.elementID)
19
                .appendNumber(chap.startTimeMs, 4)
20
                .appendNumber(chap.endTimeMs, 4)
21
                .appendNumber(getOffset(chap.startOffsetBytes), 4)
22
                .appendNumber(getOffset(chap.endOffsetBytes), 4)
23
                .appendValue(TagsHelpers.createBufferFromTags(chap.tags))
24
                .getBuffer()
25
        }).filter((chap: Data) => chap instanceof Buffer))
26
    },
27
    read: (buffer: Buffer) => {
28
        const reader = new FrameReader(buffer)
29
30
        const consumeNumber = () => reader.consumeStaticValue('number', 4)
31
32
        const makeOffset = (value: number) => value === 0xFFFFFFFF ? null : value
33
34
        const elementID = reader.consumeNullTerminatedValue('string')
35
        const startTimeMs = consumeNumber()
36
        const endTimeMs = consumeNumber()
37
        const startOffsetBytes = makeOffset(consumeNumber())
38
        const endOffsetBytes = makeOffset(consumeNumber())
39
        const tags = TagsHelpers.getTagsFromTagBody(reader.consumeStaticValue())
40
        return {
41
            elementID,
42
            startTimeMs,
43
            endTimeMs,
44
            ...startOffsetBytes === null ? {} : {startOffsetBytes},
45
            ...endOffsetBytes === null ? {} : {endOffsetBytes},
46
            tags
47
        }
48
    }
49
}
50