@supabase/realtime-js
Version:
Listen to realtime updates to your PostgreSQL database
50 lines (41 loc) • 1.45 kB
text/typescript
// This file draws heavily from https://github.com/phoenixframework/phoenix/commit/cf098e9cf7a44ee6479d31d911a97d3c7430c6fe
// License: https://github.com/phoenixframework/phoenix/blob/master/LICENSE.md
export default class Serializer {
HEADER_LENGTH = 1
decode(rawPayload: ArrayBuffer | string, callback: Function) {
if (rawPayload.constructor === ArrayBuffer) {
return callback(this._binaryDecode(rawPayload))
}
if (typeof rawPayload === 'string') {
return callback(JSON.parse(rawPayload))
}
return callback({})
}
private _binaryDecode(buffer: ArrayBuffer) {
const view = new DataView(buffer)
const decoder = new TextDecoder()
return this._decodeBroadcast(buffer, view, decoder)
}
private _decodeBroadcast(
buffer: ArrayBuffer,
view: DataView,
decoder: TextDecoder
): {
ref: null
topic: string
event: string
payload: { [key: string]: any }
} {
const topicSize = view.getUint8(1)
const eventSize = view.getUint8(2)
let offset = this.HEADER_LENGTH + 2
const topic = decoder.decode(buffer.slice(offset, offset + topicSize))
offset = offset + topicSize
const event = decoder.decode(buffer.slice(offset, offset + eventSize))
offset = offset + eventSize
const data = JSON.parse(
decoder.decode(buffer.slice(offset, buffer.byteLength))
)
return { ref: null, topic: topic, event: event, payload: data }
}
}