rusqsieve 0.1.1

The frontier of pure-Rust Quadratic Sieve integer factorization, portable to WASM (wasm32-unknown-unknown).
Documentation
export const MESSAGE = Object.freeze({ START: "start", READY: "ready", EXECUTE: "execute", RESULT: "result", PROGRESS: "progress", DONE: "done", ERROR: "error", CANCEL: "cancel" });

export function copyBuffer(instance, handle) {
  const pointer = instance.exports.qs_buffer_pointer(handle);
  const length = instance.exports.qs_buffer_length(handle);
  const bytes = new Uint8Array(instance.exports.memory.buffer, pointer, length).slice();
  instance.exports.qs_buffer_free(handle);
  if (bytes.length < 12 || new TextDecoder().decode(bytes.subarray(0, 4)) !== "QSV1") throw new Error("invalid quadratic-sieve packet");
  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
  const payloadLength = view.getUint32(8, true);
  if (payloadLength !== bytes.length - 12) throw new Error("invalid quadratic-sieve packet length");
  return bytes.subarray(12);
}

export function putBytes(instance, bytes) {
  const pointer = instance.exports.qs_alloc(bytes.length, 1);
  if (!pointer && bytes.length) throw new Error("WebAssembly allocation failed");
  new Uint8Array(instance.exports.memory.buffer, pointer, bytes.length).set(bytes);
  return pointer;
}