Old Engine/On Demand Protocol
From RuneWiki
Resources
Handshaking
The client begins by sending a single byte, 15.
The server should respond with eight bytes. Their values are ignored, but send 0s here anyways.
After this point the client stream is dedicated to on demand requests and will begin requesting missing data from the server.
Processing
Each request looks like this, and there may be multiple requests appended in a single read:
- First byte is the index
- Second word is the entry
- Third byte is the priority
The priority field has 3 possible values:
- 2: loading core files
- 1: preloading extra files
- 0: loading file in-game
Responding
The client will read up to 506-bytes from the server at a time. 6 bytes are used for the file part header and up to 500 bytes are used for the file data. If a file is longer than 500 bytes (very likely) then the file must be sent in 500-byte increments.
File parts may be sent over time and do not need to be sent sequentially. This helps decrease the load on the server assuming it gets processed over time.
The response looks like this:
- First byte is the index
- Second and third byte is the entry
- Fourth and fifth byte is the total file size
- Sixth byte is the part number
- The remaining (up to) 500 bytes is the file part data
Example
while (data.length() > data.offset) {
let index = data.readByte();
let entry = data.readWord();
let priority = data.readByte();
if (priority === 2) {
coreQueue.push({ socket, index, entry, priority });
} else if (priority == 1) {
preloadQueue.push({ socket, index, entry, priority });
} else if (priority == 0) {
ingameQueue.push({ socket, index, entry, priority });
}
}
...
let sendBuffer = Buffer.alloc(6);
sendBuffer.writeUInt8(request.index, 0);
sendBuffer.writeUInt16BE(request.entry, 1);
sendBuffer.writeUInt16BE(file.length, 3);
sendBuffer.writeUInt8(request.part, 5);
let offset = i * 500;
if (offset + 500 < file.length) {
sendBuffer = Buffer.concat([sendBuffer, file.slice(offset, offset + 500)]);
} else {
sendBuffer = Buffer.concat([sendBuffer, file.slice(offset)]);
}
request.socket.write(sendBuffer);