-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathuseFileBlob.js
85 lines (67 loc) · 2.25 KB
/
useFileBlob.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import { useContext } from 'react'
import { proto, fnv1a } from '@libp2p/observer-proto'
import {
DataContext,
EventsContext,
RuntimeContext,
ConfigContext,
} from '../components/context'
const version = 1
function getBinary(message) {
const { buffer, byteLength } = message.serializeBinary()
const contentBuffer = Buffer.from(buffer)
const checksum = fnv1a(contentBuffer)
const metaBuffer = Buffer.alloc(8)
metaBuffer.writeUIntLE(checksum, 0, 4)
metaBuffer.writeUIntLE(byteLength, 4, 4)
return Buffer.concat([metaBuffer, contentBuffer])
}
function getServerMessage(message, type) {
const serverMessage = new proto.ServerMessage()
serverMessage.setVersion(new proto.Version(version))
if (type === 'runtime') {
serverMessage.setRuntime(message)
} else if (type === 'event') {
serverMessage.setEvent(message)
} else if (type === 'state') {
serverMessage.setState(message)
} else if (type === 'response') {
serverMessage.setResponse(message)
} else {
throw new Error(`Unrecognised ServerMessage payload type "${type}"`)
}
return serverMessage
}
function getVersionBinary() {
const versionBuf = Buffer.alloc(4)
// TODO: get versions from central source
versionBuf.writeUInt32LE(1, 0)
return versionBuf
}
function getConfigResponse(config) {
const response = new proto.CommandResponse()
response.setResult(proto.CommandResponse.Result.OK)
response.setEffectiveConfig(config)
response.setId(0) // Only one response in static file
return response
}
function useFileBlob() {
const states = useContext(DataContext)
const events = useContext(EventsContext)
const runtime = useContext(RuntimeContext)
const config = useContext(ConfigContext)
const configResponse = getConfigResponse(config)
const statePackets = states.map(state => getServerMessage(state, 'state'))
const eventPackets = events.map(event => getServerMessage(event, 'event'))
const runtimePacket = getServerMessage(runtime, 'runtime')
const configPacket = getServerMessage(configResponse, 'response')
const blob = new Blob([
...getVersionBinary(),
getBinary(runtimePacket),
getBinary(configPacket),
...statePackets.map(getBinary),
...eventPackets.map(getBinary),
])
return blob
}
export default useFileBlob