MCPcopy Create free account
hub / github.com/CapSoftware/Cap / readInto

Function readInto

apps/desktop/src/utils/shared-frame-buffer.ts:387–473  ·  view source on GitHub ↗
(target: Uint8Array, timeoutMs: number = 100)

Source from the content-addressed store, hash-verified

385 },
386
387 readInto(target: Uint8Array, timeoutMs: number = 100): number | null {
388 const MAX_CAS_RETRIES = 3;
389
390 for (let attempt = 0; attempt < MAX_CAS_RETRIES; attempt++) {
391 const shutdownFlag = Atomics.load(controlView, CONTROL_SHUTDOWN);
392 if (shutdownFlag) {
393 return null;
394 }
395
396 const readIdx = Atomics.load(controlView, CONTROL_READ_INDEX);
397 const slotMetaIdx =
398 (metadataOffset + readIdx * METADATA_ENTRY_SIZE) / 4;
399
400 let state = Atomics.load(metadataView, slotMetaIdx + META_SLOT_STATE);
401
402 if (state !== SLOT_STATE.READY) {
403 const waitResult = Atomics.wait(
404 metadataView,
405 slotMetaIdx + META_SLOT_STATE,
406 state,
407 timeoutMs,
408 );
409 if (waitResult === "timed-out") {
410 return null;
411 }
412
413 const shutdownCheck = Atomics.load(controlView, CONTROL_SHUTDOWN);
414 if (shutdownCheck) {
415 return null;
416 }
417
418 state = Atomics.load(metadataView, slotMetaIdx + META_SLOT_STATE);
419 if (state !== SLOT_STATE.READY) {
420 continue;
421 }
422 }
423
424 const exchangedState = Atomics.compareExchange(
425 metadataView,
426 slotMetaIdx + META_SLOT_STATE,
427 SLOT_STATE.READY,
428 SLOT_STATE.READING,
429 );
430 if (exchangedState !== SLOT_STATE.READY) {
431 continue;
432 }
433
434 const frameSize = Atomics.load(
435 metadataView,
436 slotMetaIdx + META_FRAME_SIZE,
437 );
438 const slotDataOffset = dataOffset + readIdx * slotSize;
439
440 if (
441 !Number.isInteger(frameSize) ||
442 frameSize < 0 ||
443 frameSize > slotSize ||
444 slotDataOffset < 0 ||

Callers

nothing calls this directly

Calls 1

advanceReadIndexCASFunction · 0.85

Tested by

no test coverage detected