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

Function createConsumer

apps/desktop/src/utils/shared-frame-buffer.ts:280–579  ·  view source on GitHub ↗
(buffer: SharedArrayBuffer)

Source from the content-addressed store, hash-verified

278}
279
280export function createConsumer(buffer: SharedArrayBuffer): Consumer {
281 const controlView = new Uint32Array(buffer, 0, 8);
282
283 const storedVersion = controlView[CONTROL_VERSION];
284 if (storedVersion !== PROTOCOL_VERSION) {
285 throw new Error(
286 `SharedFrameBuffer protocol version mismatch: expected ${PROTOCOL_VERSION}, got ${storedVersion}`,
287 );
288 }
289
290 const slotCount = controlView[CONTROL_SLOT_COUNT];
291 const slotSize = controlView[CONTROL_SLOT_SIZE];
292 const metadataOffset = controlView[CONTROL_METADATA_OFFSET];
293 const dataOffset = controlView[CONTROL_DATA_OFFSET];
294 const metadataView = new Int32Array(buffer);
295
296 return {
297 read(timeoutMs: number = 100): ArrayBuffer | null {
298 const MAX_CAS_RETRIES = 3;
299
300 for (let attempt = 0; attempt < MAX_CAS_RETRIES; attempt++) {
301 const shutdownFlag = Atomics.load(controlView, CONTROL_SHUTDOWN);
302 if (shutdownFlag) {
303 return null;
304 }
305
306 const readIdx = Atomics.load(controlView, CONTROL_READ_INDEX);
307 const slotMetaIdx =
308 (metadataOffset + readIdx * METADATA_ENTRY_SIZE) / 4;
309
310 let state = Atomics.load(metadataView, slotMetaIdx + META_SLOT_STATE);
311
312 if (state !== SLOT_STATE.READY) {
313 const waitResult = Atomics.wait(
314 metadataView,
315 slotMetaIdx + META_SLOT_STATE,
316 state,
317 timeoutMs,
318 );
319 if (waitResult === "timed-out") {
320 return null;
321 }
322
323 const shutdownCheck = Atomics.load(controlView, CONTROL_SHUTDOWN);
324 if (shutdownCheck) {
325 return null;
326 }
327
328 state = Atomics.load(metadataView, slotMetaIdx + META_SLOT_STATE);
329 if (state !== SLOT_STATE.READY) {
330 continue;
331 }
332 }
333
334 const exchangedState = Atomics.compareExchange(
335 metadataView,
336 slotMetaIdx + META_SLOT_STATE,
337 SLOT_STATE.READY,

Callers 1

frame-worker.tsFile · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected