From 9a8213591aaa9f25df91f4ddad348ad069e07ab9 Mon Sep 17 00:00:00 2001 From: boufni95 Date: Wed, 29 Jan 2025 17:31:25 +0000 Subject: [PATCH] TLbV --- src/services/helpers/tlv.ts | 36 +++++++++++++++++++++++++++++++++++- src/services/webRTC/index.ts | 6 +++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/services/helpers/tlv.ts b/src/services/helpers/tlv.ts index df215090..e86b9ada 100644 --- a/src/services/helpers/tlv.ts +++ b/src/services/helpers/tlv.ts @@ -76,12 +76,14 @@ export const integerToUint8Array = (number: number): Uint8Array => { } export type TLV = { [t: number]: Uint8Array[] } -export const parseTLV = (data: Uint8Array): TLV => { +export type TLbV = { [t: number]: Uint8Array[] } +export const parseTLV = (data: Uint8Array, log = false): TLV => { const result: TLV = {} let rest = data while (rest.length > 0) { const t = rest[0] const l = rest[1] + if (log) console.log({ t, l }) const v = rest.slice(2, 2 + l) rest = rest.slice(2 + l) if (v.length < l) throw new Error(`not enough data to read on TLV ${t}`) @@ -97,6 +99,7 @@ export const encodeTLV = (tlv: TLV): Uint8Array => { .reverse() .forEach(([t, vs]) => { vs.forEach(v => { + if (v.length > 255) throw new Error(`value too long to encode in TLV ${t}`) const entry = new Uint8Array(v.length + 2) entry.set([parseInt(t)], 0) entry.set([v.length], 1) @@ -106,4 +109,35 @@ export const encodeTLV = (tlv: TLV): Uint8Array => { }) return concatBytes(...entries) +} +export const parseTLbV = (data: Uint8Array, log = false): TLV => { + const result: TLV = {} + let rest = data + while (rest.length > 0) { + const t = rest[0] + const l = parseInt(bytesToHex(rest.slice(1, 5)), 16) + if (log) console.log({ t, l }) + const v = rest.slice(5, 5 + l) + rest = rest.slice(5 + l) + if (v.length < l) throw new Error(`not enough data to read on TLV ${t}`) + result[t] = result[t] || [] + result[t].push(v) + } + return result +} + +export const encodeTLbV = (tlv: TLV): Uint8Array => { + const entries: Uint8Array[] = [] + Object.entries(tlv) + .reverse() + .forEach(([t, vs]) => { + vs.forEach(v => { + const entry = new Uint8Array(v.length + 5) + entry.set([parseInt(t)], 0) + entry.set(integerToUint8Array(v.length), 1) + entry.set(v, 5) + entries.push(entry) + }) + }) + return concatBytes(...entries) } \ No newline at end of file diff --git a/src/services/webRTC/index.ts b/src/services/webRTC/index.ts index c0f18af7..f3e70db0 100644 --- a/src/services/webRTC/index.ts +++ b/src/services/webRTC/index.ts @@ -4,7 +4,7 @@ import Storage from '../storage/index.js' import { ERROR, getLogger } from "../helpers/logger.js" import * as Types from '../../../proto/autogenerated/ts/types.js' import { NostrSend, SendData, SendInitiator } from "../nostr/handler.js" -import { encodeTLV, encodeTLVDataPacket } from '../helpers/tlv.js' +import { encodeTLbV, encodeTLV, encodeTLVDataPacket } from '../helpers/tlv.js' type IceCandidate = { type: string, candidate?: string, sdpMid?: string, sdpMLineIndex?: number } const configuration = { 'iceServers': [{ 'urls': 'stun:stun.l.google.com:19302' }] } type UserInfo = { userPub: string, appId: string } @@ -101,9 +101,9 @@ export default class webRTC { for (let i = 0; i < packets.length; i++) { const packet = packets[i] const tlv = encodeTLVDataPacket({ dataId: id, packetNum: i + 1, totalPackets: packets.length, data: packet }) - const bytes = encodeTLV(tlv) + const bytes = encodeTLbV(tlv) if (i === 0) { - console.log("sending first packet", bytes) + console.log("sending first packet", tlv) } channel.send(bytes) }