Merge branch 'async_fd'

This commit is contained in:
2026-02-25 16:24:20 -06:00
2 changed files with 49 additions and 4 deletions

View File

@@ -1065,12 +1065,38 @@ const char *JS_SendMessage(JSContext *ctx, WotaBuffer *wb)
if (!wb || !wb->data || wb->size == 0)
return "Empty WOTA buffer";
size_t byte_len = wb->size * sizeof(uint64_t);
blob *msg = blob_new(byte_len * 8);
if (!msg) return "Could not allocate blob";
/* Wrap the caller's payload in the engine protocol envelope:
{type: "user", data: <payload>}
The header takes ~6 words; pre-allocate enough for header + payload. */
WotaBuffer envelope;
wota_buffer_init(&envelope, wb->size + 8);
wota_write_record(&envelope, 2);
wota_write_text(&envelope, "type");
wota_write_text(&envelope, "user");
wota_write_text(&envelope, "data");
blob_write_bytes(msg, wb->data, byte_len);
/* Append the caller's pre-encoded WOTA payload words directly. */
size_t need = envelope.size + wb->size;
if (need > envelope.capacity) {
size_t new_cap = envelope.capacity ? envelope.capacity * 2 : 8;
while (new_cap < need) new_cap *= 2;
envelope.data = realloc(envelope.data, new_cap * sizeof(uint64_t));
envelope.capacity = new_cap;
}
memcpy(envelope.data + envelope.size, wb->data,
wb->size * sizeof(uint64_t));
envelope.size += wb->size;
size_t byte_len = envelope.size * sizeof(uint64_t);
blob *msg = blob_new(byte_len * 8);
if (!msg) {
wota_buffer_free(&envelope);
return "Could not allocate blob";
}
blob_write_bytes(msg, envelope.data, byte_len);
blob_make_stone(msg);
wota_buffer_free(&envelope);
const char *err = send_message(ctx->id, msg);
if (!err) {