Callback packet contract
AsString, AsBuffer, and AsArray are properties, not methods. Read them without parentheses. Packet userdata points to a native stack context and is valid only during the synchronous callback. Copy AsString or AsBuffer before storing work for later; never store the packet itself, yield, or pass it to task.spawn.
Callback return values are ignored; returning false does not block. Callback errors are caught and written to native debugger output. A callback can call packet:SetData(packet.AsString) to keep an unchanged copied payload. packet:Block() blocks immediately; no return value is needed.
