@@ -10,14 +10,17 @@ import type { Result } from "../types.ts";
1010import { INTERNAL_SEMAPHORE_CONTROLLER , Semaphore } from "./semaphore.ts" ;
1111import { SharedJsonBuffer } from "../json_buffer.ts" ;
1212
13- const HEAD_IDX = 0 ;
14- const TAIL_IDX = 1 ;
15- const CLOSED_IDX = 2 ;
16- const CAP_IDX = 3 ;
17- const TX_COUNT_IDX = 4 ;
18- const RX_COUNT_IDX = 5 ;
13+ const IDX_HEAD = 0 ;
14+ const IDX_TAIL = 1 ;
15+ const IDX_CLOSED = 2 ;
16+ const IDX_CAP = 3 ;
17+ const IDX_TX_COUNT = 4 ;
18+ const IDX_RX_COUNT = 5 ;
1919const META_SIZE = 6 ;
2020
21+ const OPEN = 0 ;
22+ const CLOSED = 1 ;
23+
2124const ERR_DISPOSED_SENDER = new Error ( "Sender is disposed" ) ;
2225const ERR_DISPOSED_RECEIVER = new Error ( "Receiver disposed" ) ;
2326const ERR_CLOSED = new Error ( "Channel closed" ) ;
@@ -41,29 +44,29 @@ class ChannelInternals<T> extends Serializable {
4144 }
4245
4346 write ( value : T ) : void {
44- const tail = this . state [ TAIL_IDX ] ! ;
47+ const tail = this . state [ IDX_TAIL ] ! ;
4548 this . items [ tail ] = value ;
46- this . state [ TAIL_IDX ] = ( tail + 1 ) % this . state [ CAP_IDX ] ! ;
49+ this . state [ IDX_TAIL ] = ( tail + 1 ) % this . state [ IDX_CAP ] ! ;
4750 }
4851
4952 read ( ) : T | null {
50- const head = this . state [ HEAD_IDX ] ! ;
53+ const head = this . state [ IDX_HEAD ] ! ;
5154 const val = this . items [ head ] as T ;
5255
5356 // Optimistic read check
5457 if ( val === null ) return null ;
5558
5659 this . items [ head ] = null ;
57- this . state [ HEAD_IDX ] = ( head + 1 ) % this . state [ CAP_IDX ] ! ;
60+ this . state [ IDX_HEAD ] = ( head + 1 ) % this . state [ IDX_CAP ] ! ;
5861 return val ;
5962 }
6063
6164 isClosed ( ) : boolean {
62- return Atomics . load ( this . state , CLOSED_IDX ) === 1 ;
65+ return Atomics . load ( this . state , IDX_CLOSED ) === CLOSED ;
6366 }
6467
6568 hasReceivers ( ) : boolean {
66- return Atomics . load ( this . state , RX_COUNT_IDX ) > 0 ;
69+ return Atomics . load ( this . state , IDX_RX_COUNT ) > 0 ;
6770 }
6871
6972 [ toSerialized ] ( ) {
@@ -140,7 +143,7 @@ export class Sender<T> extends ChannelHandle<T> {
140143
141144 clone ( ) : Sender < T > {
142145 if ( this . disposed ) throw new Error ( "Cannot clone disposed Sender" ) ;
143- Atomics . add ( this . internals . state , TX_COUNT_IDX , 1 ) ;
146+ Atomics . add ( this . internals . state , IDX_TX_COUNT , 1 ) ;
144147 return new Sender ( this . internals ) ;
145148 }
146149
@@ -224,7 +227,7 @@ export class Sender<T> extends ChannelHandle<T> {
224227
225228 try {
226229 if ( this . internals . isClosed ( ) ) return ;
227- Atomics . store ( state , CLOSED_IDX , 1 ) ;
230+ Atomics . store ( state , IDX_CLOSED , CLOSED ) ;
228231 // Wake up everyone
229232 slotsAvailable [ INTERNAL_SEMAPHORE_CONTROLLER ] . release ( 1_073_741_823 ) ;
230233 itemsAvailable [ INTERNAL_SEMAPHORE_CONTROLLER ] . release ( 1_073_741_823 ) ;
@@ -236,7 +239,7 @@ export class Sender<T> extends ChannelHandle<T> {
236239
237240 [ Symbol . dispose ] ( ) {
238241 if ( this . disposed ) return ;
239- const prevCount = Atomics . sub ( this . internals . state , TX_COUNT_IDX , 1 ) ;
242+ const prevCount = Atomics . sub ( this . internals . state , IDX_TX_COUNT , 1 ) ;
240243 if ( prevCount === 1 ) this . close ( ) ;
241244 this . disposed = true ;
242245 }
@@ -259,7 +262,7 @@ export class Receiver<T> extends ChannelHandle<T> {
259262
260263 clone ( ) : Receiver < T > {
261264 if ( this . disposed ) throw new Error ( "Cannot clone disposed Receiver" ) ;
262- Atomics . add ( this . internals . state , RX_COUNT_IDX , 1 ) ;
265+ Atomics . add ( this . internals . state , IDX_RX_COUNT , 1 ) ;
263266 return new Receiver ( this . internals ) ;
264267 }
265268
@@ -348,7 +351,7 @@ export class Receiver<T> extends ChannelHandle<T> {
348351 [ Symbol . dispose ] ( ) {
349352 if ( this . disposed ) return ;
350353 this . disposed = true ;
351- const prevCount = Atomics . sub ( this . internals . state , RX_COUNT_IDX , 1 ) ;
354+ const prevCount = Atomics . sub ( this . internals . state , IDX_RX_COUNT , 1 ) ;
352355 if ( prevCount === 1 ) this . close ( ) ;
353356 }
354357
@@ -360,15 +363,16 @@ export class Receiver<T> extends ChannelHandle<T> {
360363}
361364
362365export function channel < T > ( capacity : number = 32 ) : [ Sender < T > , Receiver < T > ] {
363- const stateSab = new SharedArrayBuffer ( META_SIZE * 4 ) ;
364- const state = new Int32Array ( stateSab ) ;
365-
366- state [ CAP_IDX ] = capacity ;
367- state [ HEAD_IDX ] = 0 ;
368- state [ TAIL_IDX ] = 0 ;
369- state [ CLOSED_IDX ] = 0 ;
370- state [ TX_COUNT_IDX ] = 1 ;
371- state [ RX_COUNT_IDX ] = 1 ;
366+ const state = new Int32Array (
367+ new SharedArrayBuffer ( META_SIZE * Int32Array . BYTES_PER_ELEMENT ) ,
368+ ) ;
369+
370+ state [ IDX_CAP ] = capacity ;
371+ state [ IDX_HEAD ] = 0 ;
372+ state [ IDX_TAIL ] = 0 ;
373+ state [ IDX_CLOSED ] = OPEN ;
374+ state [ IDX_TX_COUNT ] = 1 ;
375+ state [ IDX_RX_COUNT ] = 1 ;
372376
373377 const initialData = new Array < T | null > ( capacity ) . fill ( null ) ;
374378 const items = new SharedJsonBuffer ( initialData ) ;
0 commit comments