Name what MessageHold answers through, as the scoring run read it
Mirror / push (push) Has been cancelled
Test / lint (pull_request) Successful in 22s
Test / test (18) (pull_request) Successful in 32s
Test / test (20) (pull_request) Successful in 33s
Test / test (22) (pull_request) Successful in 30s
Test / test (24) (pull_request) Successful in 33s
Test / test (26) (pull_request) Successful in 32s
Mirror / push (push) Has been cancelled
Test / lint (pull_request) Successful in 22s
Test / test (18) (pull_request) Successful in 32s
Test / test (20) (pull_request) Successful in 33s
Test / test (22) (pull_request) Successful in 30s
Test / test (24) (pull_request) Successful in 33s
Test / test (26) (pull_request) Successful in 32s
This commit is contained in:
@@ -40,25 +40,25 @@ type HoldRoute = Pick<HeldMessagesOptions, 'link' | 'sendPastDrain' | 'session'>
|
|||||||
*/
|
*/
|
||||||
export class MessageHold implements SmsHandlers {
|
export class MessageHold implements SmsHandlers {
|
||||||
private readonly generation: number;
|
private readonly generation: number;
|
||||||
|
private readonly heldMessages: HeldMessages;
|
||||||
private readonly pduObjs: PduObject[];
|
private readonly pduObjs: PduObject[];
|
||||||
private readonly route: HoldRoute;
|
private readonly route: HoldRoute;
|
||||||
private readonly store: HeldMessages;
|
|
||||||
private working: number;
|
private working: number;
|
||||||
|
|
||||||
constructor(store: HeldMessages, route: HoldRoute, pduObjs: PduObject[], listeners: number) {
|
constructor(heldMessages: HeldMessages, route: HoldRoute, pduObjs: PduObject[], listeners: number) {
|
||||||
this.generation = route.link.generation();
|
this.generation = route.link.generation();
|
||||||
|
this.heldMessages = heldMessages;
|
||||||
this.pduObjs = pduObjs;
|
this.pduObjs = pduObjs;
|
||||||
this.route = route;
|
this.route = route;
|
||||||
this.store = store;
|
|
||||||
this.working = listeners;
|
this.working = listeners;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Whether a drain is still waiting for this message to be answered. */
|
/** Whether a drain is still waiting for this message to be answered. */
|
||||||
isHeld(): boolean {
|
isHeld(): boolean {
|
||||||
return this.store.holds(this.pduObjs);
|
return this.heldMessages.holds(this.pduObjs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** A turn later, so a listener sending its receipt straight after the response still holds. */
|
/** A turn later, so a `sendDlr()` called straight after `sendResp()` still goes out past a drain. */
|
||||||
answered(): void {
|
answered(): void {
|
||||||
setImmediate(() => { this.release(); });
|
setImmediate(() => { this.release(); });
|
||||||
}
|
}
|
||||||
@@ -76,7 +76,7 @@ export class MessageHold implements SmsHandlers {
|
|||||||
|
|
||||||
/** At once, for a message nobody took or a listener threw on: that is not work a shutdown can wait for. */
|
/** At once, for a message nobody took or a listener threw on: that is not work a shutdown can wait for. */
|
||||||
release(): void {
|
release(): void {
|
||||||
this.store.release(this.pduObjs);
|
this.heldMessages.release(this.pduObjs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** A receipt for a message still held is what a drain waits for, so it goes out past the drain. */
|
/** A receipt for a message still held is what a drain waits for, so it goes out past the drain. */
|
||||||
@@ -160,14 +160,14 @@ export class HeldMessages {
|
|||||||
this.offered.get(message)?.listenerGaveUp();
|
this.offered.get(message)?.listenerGaveUp();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** For `MessageHold`, which is how everything else asks. */
|
/** Called by `MessageHold`; everything else asks the hold. */
|
||||||
holds(pduObjs: PduObject[]): boolean {
|
holds(pduObjs: PduObject[]): boolean {
|
||||||
const key = keyOf(pduObjs);
|
const key = keyOf(pduObjs);
|
||||||
|
|
||||||
return key !== undefined && this.held.get(key) === pduObjs;
|
return key !== undefined && this.held.get(key) === pduObjs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** For `MessageHold`, which is how everything else releases. */
|
/** Called by `MessageHold`; everything else releases through the hold. */
|
||||||
release(pduObjs: PduObject[]): void {
|
release(pduObjs: PduObject[]): void {
|
||||||
const key = keyOf(pduObjs);
|
const key = keyOf(pduObjs);
|
||||||
|
|
||||||
|
|||||||
@@ -205,6 +205,11 @@ after #46, read 6, 6, 7 and 7, Locality 5, 5, 6 and 6. A fourth, after the link'
|
|||||||
owner in #48, read 6, 6, 6 and 6, Locality 5 from every seat: all four still ranked `Session.teardown()`
|
owner in #48, read 6, 6, 6 and 6, Locality 5 from every seat: all four still ranked `Session.teardown()`
|
||||||
hardest, and the held-message flow across `incoming-requests.ts`, `held-messages.ts`, `sms.ts` and
|
hardest, and the held-message flow across `incoming-requests.ts`, `held-messages.ts`, `sms.ts` and
|
||||||
`Session`'s rejection handler second.
|
`Session`'s rejection handler second.
|
||||||
|
A fifth, after the held-message flow got one owner, read 6, 6, 7 and 6, Locality 5, 5, 6 and 6:
|
||||||
|
three seats still ranked `MessageHold` hardest — six ways out, a rejection routed from `Session`
|
||||||
|
through `IncomingRequests` to a `WeakMap`, and the `setImmediate` a receipt relies on — and the
|
||||||
|
teardown cluster second; the inherited architect scored Shape 5 on the flat `src/` and the names
|
||||||
|
below.
|
||||||
|
|
||||||
- [ ] **Lift Locality to 7, and confirm it with a scoring run.** A run reading 7.0 or above also
|
- [ ] **Lift Locality to 7, and confirm it with a scoring run.** A run reading 7.0 or above also
|
||||||
retires the #30, #46 and #48 decision.
|
retires the #30, #46 and #48 decision.
|
||||||
@@ -317,10 +322,16 @@ hardest, and the held-message flow across `incoming-requests.ts`, `held-messages
|
|||||||
|
|
||||||
- [ ] **Collapse the three objects named `defaults`.** `client.ts`, `server.ts` and
|
- [ ] **Collapse the three objects named `defaults`.** `client.ts`, `server.ts` and
|
||||||
`session-options.ts` each export or hold one; `port: 2775` is written twice and the idle
|
`session-options.ts` each export or hold one; `port: 2775` is written twice and the idle
|
||||||
timeout is derived two ways to the same 40 000. "What is the default for X" has three answers
|
timeout is derived two ways to the same 40 000, and 64 MiB is both `defaultMaxOctets` and
|
||||||
|
`defaults.maxHeldOctets`. "What is the default for X" has three answers
|
||||||
depending on the entrypoint, and nothing fails when they drift. Named by both architects as the
|
depending on the entrypoint, and nothing fails when they drift. Named by both architects as the
|
||||||
most likely first bug a new contributor ships.
|
most likely first bug a new contributor ships.
|
||||||
|
|
||||||
|
- [ ] **Give `hold` one meaning, and rename `IncomingRequests.refusing` for what it does.**
|
||||||
|
`LinkLife.hold()` is a request's budget waiting for a link, `HeldMessages.hold()` a message the
|
||||||
|
application owes an answer; `refusing` decides no refusal — `held.full()` does — and only makes
|
||||||
|
the warn and info lines fire once each way. From the 2026-09-29 scoring run.
|
||||||
|
|
||||||
- [ ] **Rename `EncodingName`'s `ASCII` to `GSM7`, with `ASCII` a deprecated alias for one minor.**
|
- [ ] **Rename `EncodingName`'s `ASCII` to `GSM7`, with `ASCII` a deprecated alias for one minor.**
|
||||||
It is GSM 03.38, where `$` is 0x02 and `@` is 0x00, and `segmentUnits.ASCII = 153` is a septet
|
It is GSM 03.38, where `$` is 0x02 and `@` is 0x00, and `segmentUnits.ASCII = 153` is a septet
|
||||||
budget under a name that says octets. The 2026-09-09 decision removed `consts.ENCODING.ASCII`
|
budget under a name that says octets. The 2026-09-09 decision removed `consts.ENCODING.ASCII`
|
||||||
|
|||||||
Reference in New Issue
Block a user