2023-03-28 19:35:23 +02:00
|
|
|
import Endian from '@msgba/endian'
|
|
|
|
import { MIN_WIDTH, MIN_HEIGHT, PACKET_ID_HELLO, PACKET_ID_KEY_DOWN, PACKET_ID_SAVE_REQUEST } from '@msgba/constants'
|
2023-03-25 15:20:18 +01:00
|
|
|
|
2023-03-28 19:35:23 +02:00
|
|
|
function concatU8Array (array1: Uint8Array, array2: Uint8Array): Uint8Array {
|
|
|
|
const finalArray = new Uint8Array(array1.length + array2.length)
|
|
|
|
finalArray.set(array1)
|
|
|
|
finalArray.set(array2, array1.length)
|
|
|
|
return finalArray
|
2023-03-25 15:20:18 +01:00
|
|
|
}
|
|
|
|
|
2023-03-28 19:35:23 +02:00
|
|
|
export function sendHello (websocket: WebSocket, romArray: Uint8Array, savestateArray: Uint8Array): void {
|
|
|
|
console.log('Sending hello.')
|
|
|
|
const lengthRom = BigInt(romArray.length)
|
|
|
|
const lengthSavestate = BigInt(savestateArray.length)
|
|
|
|
const rawData =
|
2023-03-25 15:20:18 +01:00
|
|
|
concatU8Array(
|
|
|
|
concatU8Array(
|
2023-03-28 19:35:23 +02:00
|
|
|
concatU8Array(Endian.u64ToByteArrayBigEndian(lengthRom), romArray),
|
|
|
|
Endian.u64ToByteArrayBigEndian(lengthSavestate)
|
2023-03-25 15:20:18 +01:00
|
|
|
),
|
2023-03-28 19:35:23 +02:00
|
|
|
savestateArray
|
|
|
|
)
|
|
|
|
sendPacket(websocket, PACKET_ID_HELLO, rawData)
|
2023-03-25 15:20:18 +01:00
|
|
|
}
|
|
|
|
|
2023-03-28 19:35:23 +02:00
|
|
|
export function sendKeyDown (websocket: WebSocket, isDown: boolean, key: number): void {
|
|
|
|
console.log('Sending keyDown.', isDown)
|
|
|
|
const isDownArray = new Uint8Array(1)
|
|
|
|
isDownArray[0] = isDown ? 1 : 0
|
|
|
|
const rawData = concatU8Array(isDownArray, Endian.u32ToByteArrayBigEndian(key))
|
|
|
|
sendPacket(websocket, PACKET_ID_KEY_DOWN, rawData)
|
2023-03-25 15:20:18 +01:00
|
|
|
}
|
|
|
|
|
2023-03-28 19:35:23 +02:00
|
|
|
export function sendSaveRequest (websocket: WebSocket, identifier: bigint): void {
|
|
|
|
console.log('Sendidng save request', identifier)
|
|
|
|
const rawData = Endian.u64ToByteArrayBigEndian(identifier)
|
|
|
|
sendPacket(websocket, PACKET_ID_SAVE_REQUEST, rawData)
|
2023-03-25 15:20:18 +01:00
|
|
|
}
|
|
|
|
|
2023-03-28 19:35:23 +02:00
|
|
|
export function sendPacket (websocket: WebSocket, id: bigint, rawData: Uint8Array): void {
|
|
|
|
const packetU8 = concatU8Array(
|
|
|
|
concatU8Array(Endian.u64ToByteArrayBigEndian(id), Endian.u64ToByteArrayBigEndian(BigInt(rawData.length))),
|
|
|
|
rawData
|
|
|
|
)
|
|
|
|
const packetBuffer = packetU8.buffer
|
|
|
|
console.log('Sending packet')
|
|
|
|
websocket.send(packetBuffer)
|
|
|
|
}
|
|
|
|
|
|
|
|
export function handleSendFrame (rawData: Uint8Array, canvas: HTMLCanvasElement | null, ctx: CanvasRenderingContext2D): void {
|
|
|
|
console.log('Reachs here')
|
2023-03-26 18:40:54 +02:00
|
|
|
if (canvas == null) {
|
2023-03-28 19:35:23 +02:00
|
|
|
console.log('No canvas')
|
|
|
|
return
|
2023-03-25 15:20:18 +01:00
|
|
|
}
|
2023-03-28 19:35:23 +02:00
|
|
|
let data: Uint8Array | null = rawData
|
|
|
|
data = data.slice(4, data.length)
|
|
|
|
const outputBufferSize = Endian.byteArrayToU64BigEndian(data.slice(0, 8))
|
|
|
|
// TODO: This number conversion is not great. Is there other option?
|
|
|
|
data = data.slice(8, Number(outputBufferSize))
|
|
|
|
const imgData = ctx.createImageData(MIN_WIDTH, MIN_HEIGHT)
|
|
|
|
const imgDataU8 = new Uint8Array(imgData.data.buffer)
|
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
|
if (i % 4 === 3) {
|
|
|
|
imgDataU8[i] = 255
|
|
|
|
continue
|
2023-03-25 15:20:18 +01:00
|
|
|
}
|
2023-03-28 19:35:23 +02:00
|
|
|
imgDataU8[i] = data[i]
|
2023-03-25 15:20:18 +01:00
|
|
|
}
|
2023-03-28 19:35:23 +02:00
|
|
|
data = null
|
|
|
|
createImageBitmap(imgData).then((bitmap) => { drawBitmap(bitmap, canvas, ctx) }).catch((c: string) => {
|
|
|
|
console.log(`Unable to print to the canvas the frame because: ${c}`)
|
|
|
|
})
|
2023-03-25 15:20:18 +01:00
|
|
|
}
|
|
|
|
|
2023-03-28 19:35:23 +02:00
|
|
|
function drawBitmap (bitmap: ImageBitmap, canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D): void {
|
|
|
|
ctx.drawImage(bitmap, 0, 0, canvas.width, canvas.height)
|
2023-03-25 15:20:18 +01:00
|
|
|
}
|