aweshare 0.6.9 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +8 -1
  2. package/apps/agent/dist/cli.js +3 -4
  3. package/apps/agent/dist/cli.js.map +1 -1
  4. package/apps/agent/dist/config.d.ts +1 -1
  5. package/apps/agent/dist/config.js +11 -0
  6. package/apps/agent/dist/config.js.map +1 -1
  7. package/apps/agent/dist/connection.js +3 -29
  8. package/apps/agent/dist/connection.js.map +1 -1
  9. package/apps/agent/dist/hub.d.ts +6 -0
  10. package/apps/agent/dist/hub.js.map +1 -1
  11. package/apps/agent/dist/table.d.ts +11 -1
  12. package/apps/agent/dist/table.js +18 -6
  13. package/apps/agent/dist/table.js.map +1 -1
  14. package/apps/consumer/dist/cli.js +62 -7
  15. package/apps/consumer/dist/cli.js.map +1 -1
  16. package/apps/consumer/dist/table.d.ts +12 -2
  17. package/apps/consumer/dist/table.js +13 -2
  18. package/apps/consumer/dist/table.js.map +1 -1
  19. package/apps/consumer/dist/watch.d.ts +18 -0
  20. package/apps/consumer/dist/watch.js +69 -0
  21. package/apps/consumer/dist/watch.js.map +1 -0
  22. package/apps/hub/dist/cli.js +3 -4
  23. package/apps/hub/dist/cli.js.map +1 -1
  24. package/apps/hub/dist/config.d.ts +1 -1
  25. package/apps/hub/dist/config.js +11 -0
  26. package/apps/hub/dist/config.js.map +1 -1
  27. package/apps/hub/dist/consumer.d.ts +4 -0
  28. package/apps/hub/dist/consumer.js +16 -4
  29. package/apps/hub/dist/consumer.js.map +1 -1
  30. package/apps/hub/dist/db.d.ts +4 -1
  31. package/apps/hub/dist/db.js +35 -7
  32. package/apps/hub/dist/db.js.map +1 -1
  33. package/apps/hub/dist/local.d.ts +8 -39
  34. package/apps/hub/dist/local.js +18 -191
  35. package/apps/hub/dist/local.js.map +1 -1
  36. package/apps/hub/dist/offerings.d.ts +7 -0
  37. package/apps/hub/dist/offerings.js +17 -0
  38. package/apps/hub/dist/offerings.js.map +1 -0
  39. package/apps/hub/dist/relay.d.ts +114 -0
  40. package/apps/hub/dist/relay.js +186 -0
  41. package/apps/hub/dist/relay.js.map +1 -0
  42. package/apps/hub/dist/table.d.ts +11 -1
  43. package/apps/hub/dist/table.js +18 -6
  44. package/apps/hub/dist/table.js.map +1 -1
  45. package/apps/hub/dist/tunnel.d.ts +9 -82
  46. package/apps/hub/dist/tunnel.js +43 -197
  47. package/apps/hub/dist/tunnel.js.map +1 -1
  48. package/package.json +1 -1
  49. package/packages/producer-core/dist/catalog.d.ts +23 -1
  50. package/packages/producer-core/dist/catalog.js +49 -15
  51. package/packages/producer-core/dist/catalog.js.map +1 -1
  52. package/packages/producer-core/dist/probe.d.ts +11 -0
  53. package/packages/producer-core/dist/probe.js +39 -0
  54. package/packages/producer-core/dist/probe.js.map +1 -1
  55. package/packages/protocol/dist/errors.d.ts +1 -0
  56. package/packages/protocol/dist/errors.js +1 -0
  57. package/packages/protocol/dist/errors.js.map +1 -1
  58. package/packages/protocol/dist/format.d.ts +6 -0
  59. package/packages/protocol/dist/format.js +9 -0
  60. package/packages/protocol/dist/format.js.map +1 -0
  61. package/packages/protocol/dist/index.d.ts +2 -0
  62. package/packages/protocol/dist/index.js +2 -0
  63. package/packages/protocol/dist/index.js.map +1 -1
  64. package/packages/protocol/dist/messages.d.ts +5 -0
  65. package/packages/protocol/dist/messages.js.map +1 -1
  66. package/packages/protocol/dist/schedule.d.ts +83 -0
  67. package/packages/protocol/dist/schedule.js +421 -0
  68. package/packages/protocol/dist/schedule.js.map +1 -0
  69. package/packages/protocol/dist/time.js +5 -4
  70. package/packages/protocol/dist/time.js.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { fmtTime, type ModelComparison } from 'aweshare-protocol';
1
+ import { fmtTime, type ModelComparison, type ShareSchedule } from 'aweshare-protocol';
2
2
  export { fmtTime };
3
3
  /** Left-aligned columns with two-space gutters; null-ish cells render as '-'. */
4
4
  export declare function formatTable(headers: string[], rows: string[][]): string;
@@ -73,6 +73,11 @@ export interface StatusOffering {
73
73
  activeUsers?: number;
74
74
  dailyTokens?: number;
75
75
  usedDailyTokens?: number;
76
+ /** Share-time schedule as registered (null = shared around the clock);
77
+ * undefined on hubs that predate it. */
78
+ schedule?: ShareSchedule | null;
79
+ /** Whether the schedule admits right now; undefined on old hubs. */
80
+ shareState?: 'open' | 'closed' | null;
76
81
  }
77
82
  /** Which hub-hosted aliases a bare `hub produce refresh --all` would touch:
78
83
  * unique hub/ aliases with a daily cap. Producer-registered rows (ns/...)
@@ -91,6 +96,11 @@ export declare function lastSeenCell(hubCheckAt: string | null | undefined, now?
91
96
  * apps/agent/src/table.ts with the shared headers: the observed id, '✗'-marked
92
97
  * when it disagrees with the declaration, '-' when nothing was observed. */
93
98
  export declare function observedCell(observedModel: string | null | undefined, modelVerified: boolean | null | undefined, modelMatch?: ModelComparison | null): string;
99
+ /** The SCHEDULE cell — kept verbatim in apps/consumer/src/table.ts and
100
+ * apps/agent/src/table.ts: the offering's share-time schedule as configured
101
+ * ('-' when it has none), with ' (closed)' appended while the window is shut
102
+ * so a listed-online alias never looks callable when it is not. */
103
+ export declare function scheduleCell(schedule: ShareSchedule | null | undefined, shareState: 'open' | 'closed' | null | undefined, viewerTz?: string): string;
94
104
  export interface HubStatusInput {
95
105
  maxProducers: number;
96
106
  consumerRps: number;
@@ -1,5 +1,5 @@
1
1
  // Aligned-column tables for the hub CLI's list output; `--json` keeps the raw API shape.
2
- import { compareModels, fmtTime, protocolLabel } from '../../../packages/protocol/dist/index.js';
2
+ import { compareModels, displayTimezone, fmtTime, fmtTokens, formatShareSchedule, protocolLabel, } from '../../../packages/protocol/dist/index.js';
3
3
  import { LOCAL_PRODUCER_ID } from './db.js';
4
4
  // shared across the CLIs (display zone: AWESHARE_TIMEZONE, default Asia/Shanghai)
5
5
  export { fmtTime };
@@ -124,6 +124,16 @@ export function observedCell(observedModel, modelVerified, modelMatch) {
124
124
  return `${observedModel} ✗`;
125
125
  return modelMatch === 'insufficient' ? `${observedModel} ?` : observedModel;
126
126
  }
127
+ /** The SCHEDULE cell — kept verbatim in apps/consumer/src/table.ts and
128
+ * apps/agent/src/table.ts: the offering's share-time schedule as configured
129
+ * ('-' when it has none), with ' (closed)' appended while the window is shut
130
+ * so a listed-online alias never looks callable when it is not. */
131
+ export function scheduleCell(schedule, shareState, viewerTz = displayTimezone()) {
132
+ if (schedule === undefined || schedule === null)
133
+ return '-';
134
+ const text = formatShareSchedule(schedule, viewerTz);
135
+ return shareState === 'closed' ? `${text} (closed)` : text;
136
+ }
127
137
  const STATUS_RANK = {
128
138
  online: 0,
129
139
  unstable: 1,
@@ -147,6 +157,7 @@ const OFFERING_HEADERS = [
147
157
  'PER USER',
148
158
  'DAILY TOKENS',
149
159
  'REMAINING',
160
+ 'SCHEDULE',
150
161
  ];
151
162
  /** An alias may speak several protocols (one row each); its status is the
152
163
  * worst of them — an operator's eye cares about what stopped working. */
@@ -181,12 +192,13 @@ export function renderOfferings(offerings) {
181
192
  join((o) => (o.maxConcurrentUsers === undefined ? '-' : String(o.maxConcurrentUsers))),
182
193
  join((o) => o.activeUsers === undefined ? '-' : `${o.activeUsers}/${o.maxConcurrentUsers ?? '-'}`),
183
194
  join((o) => o.maxConcurrencyPerUser === undefined ? '-' : String(o.maxConcurrencyPerUser)),
184
- join((o) => o.dailyTokens === undefined ? '-' : o.dailyTokens === 0 ? '∞' : String(o.dailyTokens)),
195
+ join((o) => o.dailyTokens === undefined ? '-' : o.dailyTokens === 0 ? '∞' : fmtTokens(o.dailyTokens)),
185
196
  join((o) => o.dailyTokens === undefined
186
197
  ? '-'
187
198
  : o.dailyTokens === 0
188
199
  ? '∞'
189
- : String(Math.max(0, o.dailyTokens - (o.usedDailyTokens ?? 0)))),
200
+ : fmtTokens(Math.max(0, o.dailyTokens - (o.usedDailyTokens ?? 0)))),
201
+ join((o) => scheduleCell(o.schedule, o.shareState)),
190
202
  ],
191
203
  };
192
204
  });
@@ -295,7 +307,7 @@ export function renderUsage(rows, consumerName) {
295
307
  `${r.duration_ms}ms`,
296
308
  r.prompt_tokens === null && r.completion_tokens === null
297
309
  ? '-'
298
- : `${r.prompt_tokens ?? 0}+${r.completion_tokens ?? 0}`,
310
+ : `${fmtTokens(r.prompt_tokens ?? 0)}+${fmtTokens(r.completion_tokens ?? 0)}`,
299
311
  ]));
300
312
  }
301
313
  /**
@@ -328,8 +340,8 @@ export function renderUsageSummary(rows, group, showProducer = true) {
328
340
  String(r.requests),
329
341
  String(r.errors),
330
342
  `${(((r.requests - r.errors) / r.requests) * 100).toFixed(1)}%`,
331
- String(r.prompt_tokens),
332
- String(r.completion_tokens),
343
+ fmtTokens(r.prompt_tokens),
344
+ fmtTokens(r.completion_tokens),
333
345
  String(r.unknown_tokens),
334
346
  `${r.avg_duration_ms}ms`,
335
347
  fmtTime(r.last_at),
@@ -1 +1 @@
1
- {"version":3,"file":"table.js","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
- import { EventEmitter } from 'node:events';
2
1
  import type { Server } from 'node:http';
3
- import { type BackendStatus, type Protocol } from 'aweshare-protocol';
2
+ import { type BackendStatus } from 'aweshare-protocol';
4
3
  import type Database from 'better-sqlite3';
5
4
  import type { Logger } from 'pino';
6
5
  import { WebSocket } from 'ws';
7
6
  import type { AuthContext } from './auth.js';
8
7
  import type { HubConfig } from './config.js';
9
8
  import { type OfferingRow } from './db.js';
9
+ import { BaseRelay, type DispatchInit } from './relay.js';
10
10
  export declare const HEARTBEAT_TIMEOUT_MS = 45000;
11
11
  export interface Session {
12
12
  producerId: number;
@@ -19,99 +19,26 @@ export interface Session {
19
19
  requests: Map<string, TunnelRequest>;
20
20
  pausedRequests: Set<string>;
21
21
  }
22
- export interface DispatchInit {
23
- protocol: Protocol;
24
- backendId: string;
25
- method: string;
26
- path: string;
27
- query: Record<string, string> | null;
28
- headers: Record<string, string>;
29
- body: Uint8Array;
30
- }
31
- export interface RelayResult {
32
- status: number | null;
33
- errorCode: string | null;
34
- canceled: boolean;
35
- durationMs: number;
36
- bytesOut: number;
37
- }
38
- export interface RelayFailure {
39
- code: string;
40
- message: string;
41
- status: number;
42
- }
43
- export declare function statusForCode(code: string): number;
44
- /**
45
- * One dispatched consumer request, whichever way it leaves the hub: through a
46
- * producer tunnel (TunnelRequest) or straight upstream in-process
47
- * (local.ts LocalRelay). handleInference consumes only this surface — the
48
- * timers, buffering and settle semantics are the same for both.
49
- */
50
- export interface Relay extends EventEmitter {
51
- readonly requestId: string;
52
- dispatch(): Promise<void>;
53
- waitHead(): Promise<{
54
- status: number;
55
- headers: Record<string, string>;
56
- }>;
57
- /** Flush chunks buffered between head and consumer attach; after this, chunks emit live. */
58
- startStreaming(): void;
59
- waitFinished(): Promise<RelayResult>;
60
- /** Consumer went away; abort upstream. */
61
- cancel(): void;
62
- /** Stop reading upstream while a downstream HTTP response is saturated. */
63
- pauseInput(): void;
64
- resumeInput(): void;
65
- }
66
22
  /**
67
23
  * One dispatched consumer request: ticket + dispatch + response pump.
68
24
  * Emits: 'head' {status, headers}, 'chunk' (Uint8Array), 'end', 'error' (RelayFailure).
69
25
  * waitFinished() always resolves — never rejects — with the final RelayResult.
70
26
  */
71
- export declare class TunnelRequest extends EventEmitter implements Relay {
27
+ export declare class TunnelRequest extends BaseRelay {
72
28
  private readonly session;
73
29
  private readonly init;
74
- private readonly config;
75
- readonly requestId: string;
76
- readonly startedAt: number;
77
- bytesOut: number;
78
- private headPromise;
79
- private resolveHead;
80
- private rejectHead;
81
- private finishedPromise;
82
- private settleFinished;
83
- private result;
84
- private finished;
85
- private headArrived;
86
- private streamingStarted;
87
- private bufferedChunks;
88
- private pendingEnd;
89
- private headTimer;
90
- private idleTimer;
30
+ protected readonly peer = "producer";
31
+ protected readonly headTimeoutCode = "TICKET_EXPIRED";
91
32
  constructor(session: Session, init: DispatchInit, config: HubConfig);
33
+ protected onSettled(): void;
34
+ protected abortUpstream(): void;
92
35
  dispatch(): Promise<void>;
93
- waitHead(): Promise<{
94
- status: number;
95
- headers: Record<string, string>;
96
- }>;
97
- /** Flush chunks buffered between head and consumer attach; after this, chunks emit live. */
98
- startStreaming(): void;
99
- waitFinished(): Promise<RelayResult>;
100
- /** Consumer went away; tell the agent to abort upstream. */
101
- cancel(): void;
36
+ /** The producer tunnel died under this request; fail it like any other error. */
37
+ handleSessionClosed(): void;
102
38
  /** Stop reading this producer socket while a downstream HTTP response is saturated. */
103
39
  pauseInput(): void;
104
40
  /** Resume the shared producer socket after every saturated response has drained. */
105
41
  resumeInput(): void;
106
- handleHead(status: number, headers: Record<string, string>): void;
107
- handleChunk(payload: Uint8Array): void;
108
- handleEnd(): void;
109
- handleError(code: string, message: string): void;
110
- handleSessionClosed(): void;
111
- private fail;
112
- private finalize;
113
- private armIdleTimer;
114
- private clearTimers;
115
42
  private send;
116
43
  private sendBestEffort;
117
44
  }
@@ -1,70 +1,36 @@
1
- import { randomUUID } from 'node:crypto';
2
- import { EventEmitter } from 'node:events';
3
- import { BACKPRESSURE_LIMIT_BYTES, chunkBody, decodeChunkFrame, isValidAlias, PROTOCOLS, parseControlMessage, WIRE_VERSION, } from '../../../packages/protocol/dist/index.js';
1
+ import { parseOfferingCaps } from '../../../packages/producer-core/dist/index.js';
2
+ import { BACKPRESSURE_LIMIT_BYTES, chunkBody, decodeChunkFrame, isValidAlias, PROTOCOLS, parseControlMessage, validateShareSchedule, WIRE_VERSION, } from '../../../packages/protocol/dist/index.js';
4
3
  import { WebSocket, WebSocketServer } from 'ws';
5
4
  import { findProducerByHash, touchLastSeen, upsertOfferings } from './db.js';
5
+ import { warnUnreachableConcurrency } from './offerings.js';
6
+ import { BaseRelay } from './relay.js';
6
7
  import { hashToken } from './tokens.js';
7
8
  export const HEARTBEAT_TIMEOUT_MS = 45_000;
8
9
  const SWEEP_INTERVAL_MS = 10_000;
9
10
  const MAX_OFFERINGS = 256;
10
- export function statusForCode(code) {
11
- switch (code) {
12
- case 'TICKET_EXPIRED':
13
- case 'STREAM_IDLE_TIMEOUT':
14
- case 'BACKEND_TIMEOUT':
15
- return 504;
16
- case 'REQUEST_CANCELED':
17
- return 499;
18
- default:
19
- return 502;
20
- }
21
- }
22
11
  const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
23
12
  /**
24
13
  * One dispatched consumer request: ticket + dispatch + response pump.
25
14
  * Emits: 'head' {status, headers}, 'chunk' (Uint8Array), 'end', 'error' (RelayFailure).
26
15
  * waitFinished() always resolves — never rejects — with the final RelayResult.
27
16
  */
28
- export class TunnelRequest extends EventEmitter {
17
+ export class TunnelRequest extends BaseRelay {
29
18
  session;
30
19
  init;
31
- config;
32
- requestId = randomUUID().replaceAll('-', '');
33
- startedAt = Date.now();
34
- bytesOut = 0;
35
- headPromise;
36
- resolveHead;
37
- rejectHead;
38
- finishedPromise;
39
- settleFinished;
40
- result = {
41
- status: null,
42
- errorCode: null,
43
- canceled: false,
44
- durationMs: 0,
45
- bytesOut: 0,
46
- };
47
- finished = false;
48
- headArrived = false;
49
- streamingStarted = false;
50
- bufferedChunks = [];
51
- pendingEnd = false;
52
- headTimer = null;
53
- idleTimer = null;
20
+ peer = 'producer';
21
+ headTimeoutCode = 'TICKET_EXPIRED';
54
22
  constructor(session, init, config) {
55
- super();
23
+ super(config.headTimeoutMs, config.idleTimeoutMs);
56
24
  this.session = session;
57
25
  this.init = init;
58
- this.config = config;
59
- this.headPromise = new Promise((resolve, reject) => {
60
- this.resolveHead = resolve;
61
- this.rejectHead = reject;
62
- });
63
- this.finishedPromise = new Promise((resolve) => {
64
- this.settleFinished = resolve;
65
- });
66
26
  this.session.requests.set(this.requestId, this);
67
27
  }
28
+ onSettled() {
29
+ this.session.requests.delete(this.requestId);
30
+ }
31
+ abortUpstream() {
32
+ this.sendBestEffort(JSON.stringify({ type: 'request.cancel', requestId: this.requestId }));
33
+ }
68
34
  async dispatch() {
69
35
  const start = {
70
36
  type: 'request.start',
@@ -81,31 +47,13 @@ export class TunnelRequest extends EventEmitter {
81
47
  await this.send(frame);
82
48
  }
83
49
  await this.send(JSON.stringify({ type: 'request.end', requestId: this.requestId }));
84
- this.headTimer = setTimeout(() => this.fail('TICKET_EXPIRED', 'no response head from producer', statusForCode('TICKET_EXPIRED')), this.config.headTimeoutMs);
85
- }
86
- waitHead() {
87
- return this.headPromise;
88
- }
89
- /** Flush chunks buffered between head and consumer attach; after this, chunks emit live. */
90
- startStreaming() {
91
- this.streamingStarted = true;
92
- for (const chunk of this.bufferedChunks)
93
- this.emit('chunk', chunk);
94
- this.bufferedChunks = [];
95
- if (this.pendingEnd) {
96
- this.pendingEnd = false;
97
- this.emit('end');
98
- }
50
+ this.armHeadTimer();
99
51
  }
100
- waitFinished() {
101
- return this.finishedPromise;
102
- }
103
- /** Consumer went away; tell the agent to abort upstream. */
104
- cancel() {
52
+ /** The producer tunnel died under this request; fail it like any other error. */
53
+ handleSessionClosed() {
105
54
  if (this.finished)
106
55
  return;
107
- this.sendBestEffort(JSON.stringify({ type: 'request.cancel', requestId: this.requestId }));
108
- this.finalize({ errorCode: 'REQUEST_CANCELED', canceled: true });
56
+ this.fail('TUNNEL_CLOSED', 'producer tunnel closed mid-request', 502);
109
57
  }
110
58
  /** Stop reading this producer socket while a downstream HTTP response is saturated. */
111
59
  pauseInput() {
@@ -125,102 +73,6 @@ export class TunnelRequest extends EventEmitter {
125
73
  this.session.ws.resume();
126
74
  }
127
75
  }
128
- handleHead(status, headers) {
129
- if (this.finished || this.headArrived)
130
- return;
131
- this.headArrived = true;
132
- this.clearTimers();
133
- this.result.status = status;
134
- this.armIdleTimer();
135
- this.resolveHead({ status, headers });
136
- this.emit('head', status, headers);
137
- }
138
- handleChunk(payload) {
139
- if (this.finished || !this.headArrived)
140
- return;
141
- this.bytesOut += payload.byteLength;
142
- this.result.bytesOut = this.bytesOut;
143
- this.armIdleTimer();
144
- if (this.streamingStarted)
145
- this.emit('chunk', payload);
146
- else
147
- this.bufferedChunks.push(payload);
148
- }
149
- handleEnd() {
150
- if (this.finished)
151
- return;
152
- this.clearTimers();
153
- if (!this.headArrived) {
154
- // protocol violation: end without head
155
- this.fail('TUNNEL_CLOSED', 'producer ended request without a response head', 502);
156
- return;
157
- }
158
- this.finalize({});
159
- // ws may deliver head+end in one tick, before the consumer attached; hold until streaming
160
- if (this.streamingStarted)
161
- this.emit('end');
162
- else
163
- this.pendingEnd = true;
164
- }
165
- handleError(code, message) {
166
- if (this.finished)
167
- return;
168
- this.fail(code, message, statusForCode(code));
169
- }
170
- handleSessionClosed() {
171
- if (this.finished)
172
- return;
173
- this.fail('TUNNEL_CLOSED', 'producer tunnel closed mid-request', 502);
174
- }
175
- fail(code, message, status) {
176
- this.clearTimers();
177
- this.sendBestEffort(JSON.stringify({ type: 'request.cancel', requestId: this.requestId }));
178
- if (!this.headArrived) {
179
- this.rejectHead({ code, message, status });
180
- }
181
- else {
182
- this.emit('error', { code, message, status });
183
- }
184
- this.finalize({ errorCode: code });
185
- }
186
- finalize(overrides) {
187
- if (this.finished)
188
- return;
189
- this.finished = true;
190
- this.resumeInput();
191
- this.clearTimers();
192
- this.result.durationMs = Date.now() - this.startedAt;
193
- if (overrides.errorCode !== undefined)
194
- this.result.errorCode = overrides.errorCode;
195
- if (overrides.canceled)
196
- this.result.canceled = true;
197
- // settle the head promise too: the consumer handler may still be awaiting it
198
- if (!this.headArrived) {
199
- const code = this.result.errorCode ?? 'REQUEST_CANCELED';
200
- this.rejectHead({
201
- code,
202
- message: `request ended before response head (${code})`,
203
- status: statusForCode(code),
204
- });
205
- }
206
- this.session.requests.delete(this.requestId);
207
- this.settleFinished(this.result);
208
- }
209
- armIdleTimer() {
210
- if (this.idleTimer)
211
- clearTimeout(this.idleTimer);
212
- this.idleTimer = setTimeout(() => {
213
- this.fail('STREAM_IDLE_TIMEOUT', 'response stream idle', statusForCode('STREAM_IDLE_TIMEOUT'));
214
- }, this.config.idleTimeoutMs);
215
- }
216
- clearTimers() {
217
- if (this.headTimer)
218
- clearTimeout(this.headTimer);
219
- if (this.idleTimer)
220
- clearTimeout(this.idleTimer);
221
- this.headTimer = null;
222
- this.idleTimer = null;
223
- }
224
76
  async send(data) {
225
77
  while (this.session.ws.bufferedAmount > BACKPRESSURE_LIMIT_BYTES) {
226
78
  await sleep(20);
@@ -386,19 +238,7 @@ export class Tunnel {
386
238
  }
387
239
  if (accepted.length > 0 || raw.length === 0) {
388
240
  upsertOfferings(this.db, session.producerId, accepted);
389
- // a per-user cap above the consumer-side default maxConcurrent is
390
- // a promise default consumers can never reach (their own limit
391
- // binds first) — say so instead of silently capping it
392
- for (const o of accepted) {
393
- if (o.maxConcurrencyPerUser > this.config.consumerMaxConcurrent) {
394
- this.log.warn({
395
- producer: session.name,
396
- alias: o.alias,
397
- perUser: o.maxConcurrencyPerUser,
398
- consumerMaxConcurrent: this.config.consumerMaxConcurrent,
399
- }, 'maxConcurrencyPerUser exceeds the hub consumer default maxConcurrent — consumers on defaults cannot reach it');
400
- }
401
- }
241
+ warnUnreachableConcurrency(this.log, accepted, this.config.consumerMaxConcurrent, session.name);
402
242
  }
403
243
  }
404
244
  wire({ type: 'registered', accepted: accepted.map((o) => o.alias), rejected });
@@ -465,23 +305,26 @@ export class Tunnel {
465
305
  if (o.upstreamModel.length === 0) {
466
306
  return { alias, reason: 'upstreamModel must be a real backend model id' };
467
307
  }
468
- const maxConcurrencyPerUser = Number(o.maxConcurrencyPerUser ?? 1);
469
- if (!Number.isInteger(maxConcurrencyPerUser) ||
470
- maxConcurrencyPerUser < 1 ||
471
- maxConcurrencyPerUser > 64) {
472
- return { alias, reason: 'maxConcurrencyPerUser must be an integer 1..64' };
473
- }
474
- if (o.maxConcurrentUsers !== undefined) {
475
- const users = Number(o.maxConcurrentUsers);
476
- if (!Number.isInteger(users) || users < 1 || users > 64) {
477
- return { alias, reason: 'maxConcurrentUsers must be an integer 1..64' };
478
- }
308
+ const caps = parseOfferingCaps({
309
+ maxConcurrencyPerUser: o.maxConcurrencyPerUser,
310
+ maxConcurrentUsers: o.maxConcurrentUsers,
311
+ dailyTokens: o.dailyTokens,
312
+ });
313
+ const [reason] = caps.problems;
314
+ if (reason !== undefined) {
315
+ return { alias, reason };
479
316
  }
480
- if (o.dailyTokens !== undefined) {
481
- const tokens = Number(o.dailyTokens);
482
- if (!Number.isInteger(tokens) || tokens < 0) {
483
- return { alias, reason: 'dailyTokens must be an integer >= 0 (0 = unlimited)' };
317
+ // the schedule rides the same registration; the hub re-validates the
318
+ // resolved shape so a hand-rolled register cannot smuggle in garbage the
319
+ // admission gate would later trip on
320
+ let schedule;
321
+ if (o.schedule !== undefined) {
322
+ const sched = validateShareSchedule(o.schedule);
323
+ const [schedReason] = sched.problems;
324
+ if (schedReason !== undefined) {
325
+ return { alias, reason: `schedule: ${schedReason}` };
484
326
  }
327
+ schedule = sched.schedule ?? undefined;
485
328
  }
486
329
  return {
487
330
  offering: {
@@ -489,9 +332,12 @@ export class Tunnel {
489
332
  protocol: o.protocol,
490
333
  upstreamModel: o.upstreamModel,
491
334
  backendId: o.backendId,
492
- maxConcurrencyPerUser,
493
- ...(o.maxConcurrentUsers !== undefined && { maxConcurrentUsers: o.maxConcurrentUsers }),
494
- ...(o.dailyTokens !== undefined && { dailyTokens: o.dailyTokens }),
335
+ maxConcurrencyPerUser: caps.maxConcurrencyPerUser,
336
+ ...(caps.maxConcurrentUsers !== undefined && {
337
+ maxConcurrentUsers: caps.maxConcurrentUsers,
338
+ }),
339
+ ...(caps.dailyTokens !== undefined && { dailyTokens: caps.dailyTokens }),
340
+ ...(schedule !== undefined && { schedule }),
495
341
  },
496
342
  alias,
497
343
  };