(
args: Readonly<{
state: EngineWorkerTickState;
running: boolean;
frameTransport: WorkerFrameTransport;
lastConsumedSabPublishedSeq: number;
syncPendingSabFrameFromMailbox: () => void;
scheduleTickNow: () => void;
}>,
)
| 53 | } |
| 54 | |
| 55 | export function armSabFrameWake( |
| 56 | args: Readonly<{ |
| 57 | state: EngineWorkerTickState; |
| 58 | running: boolean; |
| 59 | frameTransport: WorkerFrameTransport; |
| 60 | lastConsumedSabPublishedSeq: number; |
| 61 | syncPendingSabFrameFromMailbox: () => void; |
| 62 | scheduleTickNow: () => void; |
| 63 | }>, |
| 64 | ): void { |
| 65 | if (!args.running) return; |
| 66 | if (args.frameTransport.kind !== FRAME_TRANSPORT_SAB_V1) return; |
| 67 | if (args.state.sabWakeArmed) return; |
| 68 | |
| 69 | const h = args.frameTransport.controlHeader; |
| 70 | const seq = Atomics.load(h, FRAME_SAB_CONTROL_PUBLISHED_SEQ_WORD); |
| 71 | if (seq > args.lastConsumedSabPublishedSeq) { |
| 72 | args.syncPendingSabFrameFromMailbox(); |
| 73 | args.scheduleTickNow(); |
| 74 | return; |
| 75 | } |
| 76 | |
| 77 | const epoch = args.state.sabWakeEpoch; |
| 78 | const timeoutMs = Math.max(1, args.state.tickIntervalMs); |
| 79 | const waitAsync = ( |
| 80 | Atomics as unknown as { |
| 81 | waitAsync?: ( |
| 82 | typedArray: Int32Array, |
| 83 | index: number, |
| 84 | value: number, |
| 85 | timeout?: number, |
| 86 | ) => { async: boolean; value: Promise<unknown> | unknown }; |
| 87 | } |
| 88 | ).waitAsync; |
| 89 | if (typeof waitAsync !== "function") return; |
| 90 | const waiter = waitAsync(h, FRAME_SAB_CONTROL_PUBLISHED_SEQ_WORD, seq, timeoutMs); |
| 91 | if (typeof waiter !== "object" || waiter === null) return; |
| 92 | |
| 93 | if (waiter.async !== true) { |
| 94 | if (!args.running) return; |
| 95 | if (epoch !== args.state.sabWakeEpoch) return; |
| 96 | args.syncPendingSabFrameFromMailbox(); |
| 97 | args.scheduleTickNow(); |
| 98 | return; |
| 99 | } |
| 100 | |
| 101 | args.state.sabWakeArmed = true; |
| 102 | const waiterPromise = waiter.value as Promise<unknown>; |
| 103 | void waiterPromise.then( |
| 104 | () => { |
| 105 | if (epoch !== args.state.sabWakeEpoch) return; |
| 106 | args.state.sabWakeArmed = false; |
| 107 | if (!args.running) return; |
| 108 | args.syncPendingSabFrameFromMailbox(); |
| 109 | args.scheduleTickNow(); |
| 110 | }, |
| 111 | () => { |
| 112 | if (epoch !== args.state.sabWakeEpoch) return; |
no outgoing calls
no test coverage detected