@kosdev-code/kos-ui-sdk 3.0.13 → 3.0.15

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 (42) hide show
  1. package/common/constants/index.d.ts +0 -3
  2. package/common/constants/index.d.ts.map +1 -1
  3. package/common/types/global.d.ts +0 -1
  4. package/core/core/transport/base-message-transport.d.ts.map +1 -1
  5. package/core/core/transport/index.d.ts +1 -0
  6. package/core/core/transport/index.d.ts.map +1 -1
  7. package/core/core/transport/mock/future-simulator.d.ts +17 -0
  8. package/core/core/transport/mock/future-simulator.d.ts.map +1 -0
  9. package/core/core/transport/mock/index.d.ts +3 -0
  10. package/core/core/transport/mock/index.d.ts.map +1 -0
  11. package/core/core/transport/mock/mock-config.d.ts +4 -0
  12. package/core/core/transport/mock/mock-config.d.ts.map +1 -0
  13. package/core/core/transport/mock/mock-fixtures.d.ts +26 -0
  14. package/core/core/transport/mock/mock-fixtures.d.ts.map +1 -0
  15. package/core/core/transport/mock/mock-frames.d.ts +63 -0
  16. package/core/core/transport/mock/mock-frames.d.ts.map +1 -0
  17. package/core/core/transport/mock/mock-interceptor.d.ts +5 -0
  18. package/core/core/transport/mock/mock-interceptor.d.ts.map +1 -0
  19. package/core/core/transport/mock/mock-playback.d.ts +4 -0
  20. package/core/core/transport/mock/mock-playback.d.ts.map +1 -0
  21. package/core/core/transport/mock/mock-recorder.d.ts +23 -0
  22. package/core/core/transport/mock/mock-recorder.d.ts.map +1 -0
  23. package/core/core/transport/mock/mock-registry.d.ts +142 -0
  24. package/core/core/transport/mock/mock-registry.d.ts.map +1 -0
  25. package/core/core/transport/mock/mock-setups.d.ts +10 -0
  26. package/core/core/transport/mock/mock-setups.d.ts.map +1 -0
  27. package/core/core/transport/mock/mock-types.d.ts +677 -0
  28. package/core/core/transport/mock/mock-types.d.ts.map +1 -0
  29. package/core/core/transport/mock/route-matcher.d.ts +25 -0
  30. package/core/core/transport/mock/route-matcher.d.ts.map +1 -0
  31. package/core/core/transport/mock/standalone-mock-socket.d.ts +19 -0
  32. package/core/core/transport/mock/standalone-mock-socket.d.ts.map +1 -0
  33. package/core/core/transport/transport-factory.d.ts +2 -1
  34. package/core/core/transport/transport-factory.d.ts.map +1 -1
  35. package/core/types/global.d.ts +2 -12
  36. package/core/util/kos-fetch.d.ts.map +1 -1
  37. package/index.cjs +1896 -40
  38. package/index.cjs.map +1 -1
  39. package/index.js +1896 -40
  40. package/index.js.map +1 -1
  41. package/models/types/global.d.ts +0 -1
  42. package/package.json +2 -2
@@ -0,0 +1,677 @@
1
+ /**
2
+ * Public types for the KosMock facility: first-class, transport-level mocking
3
+ * for KOS UIs. Mocks are injected statically at startup (code or the
4
+ * `?kosMock=` query param) or dynamically at runtime (`window.KosMock`), with
5
+ * unmatched traffic passing through to the real device (hybrid mode) or a
6
+ * standalone loopback socket (fully offline).
7
+ */
8
+ /**
9
+ * @kosService core.mock
10
+ * @kosApiLevel 24
11
+ */
12
+ export type KosMockMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "*";
13
+ /**
14
+ * A decoded outbound HTTP-over-WS request, as presented to route handlers.
15
+ *
16
+ * @kosService core.mock
17
+ * @kosApiLevel 24
18
+ */
19
+ export interface KosMockRequest {
20
+ method: string;
21
+ /** Path + query exactly as sent on the wire. */
22
+ url: string;
23
+ /** Pathname only. */
24
+ path: string;
25
+ /** Captures from `:param` pattern segments. */
26
+ params: Record<string, string>;
27
+ query: Record<string, string>;
28
+ /** Raw frame headers. */
29
+ headers: Record<string, string>;
30
+ requestId: string;
31
+ /** The work tracker header — echo it into simulated future frames. */
32
+ tracker?: string;
33
+ ordered: boolean;
34
+ rawBody?: string;
35
+ /** Lazily parses the JSON body; undefined when absent or malformed. */
36
+ json<T = unknown>(): T | undefined;
37
+ }
38
+ /**
39
+ * @kosService core.mock
40
+ * @kosApiLevel 24
41
+ */
42
+ export interface KosMockResponse<T = unknown> {
43
+ /**
44
+ * Default 200. Encoded as a string wire header — the transport requires the
45
+ * literal "200" for a response to count as ok.
46
+ */
47
+ status?: number;
48
+ /** Wrapped in the `{status, data}` envelope service consumers expect. */
49
+ data?: T;
50
+ headers?: Record<string, string>;
51
+ delayMs?: number;
52
+ /** Escape hatch: verbatim body, no envelope. */
53
+ raw?: string;
54
+ }
55
+ /**
56
+ * Shared context passed to route handlers.
57
+ *
58
+ * @kosService core.mock
59
+ * @kosApiLevel 24
60
+ */
61
+ export interface KosMockContext {
62
+ /** Scenario state shared across handlers — handlers can be stateful. */
63
+ state: Map<string, unknown>;
64
+ futures: IKosMockFutureSimulator;
65
+ publishTopic(topic: string, body: unknown, headers?: Record<string, string>): void;
66
+ }
67
+ /**
68
+ * Return `undefined` to decline the request: the next matching route is
69
+ * consulted, then the `onUnmatched` policy applies (pass through to the real
70
+ * transport in hybrid mode).
71
+ *
72
+ * @kosService core.mock
73
+ * @kosApiLevel 24
74
+ */
75
+ export type KosMockRouteHandler = (req: KosMockRequest, ctx: KosMockContext) => KosMockResponse | undefined | Promise<KosMockResponse | undefined>;
76
+ /**
77
+ * @kosService core.mock
78
+ * @kosApiLevel 24
79
+ */
80
+ export interface KosMockRouteOptions {
81
+ id?: string;
82
+ description?: string;
83
+ /** Remove the route after it first serves a response. */
84
+ once?: boolean;
85
+ enabled?: boolean;
86
+ delayMs?: number;
87
+ /**
88
+ * Fixture this route belongs to. Emitted on every response as the
89
+ * `kos-mock-fixture` wire header (all mocked responses additionally carry
90
+ * `kos-mocked: true`).
91
+ */
92
+ fixture?: string;
93
+ /**
94
+ * Request guard for multiplexed endpoints: the route only claims requests
95
+ * this predicate accepts (e.g. `(req) => req.json()?.op === "start"`).
96
+ * Rejected requests fall through to later routes / the unmatched policy.
97
+ */
98
+ when?: (req: KosMockRequest) => boolean;
99
+ }
100
+ /**
101
+ * @kosService core.mock
102
+ * @kosApiLevel 24
103
+ */
104
+ export interface KosMockHandle {
105
+ readonly id: string;
106
+ remove(): void;
107
+ enable(): void;
108
+ disable(): void;
109
+ }
110
+ /**
111
+ * @kosService core.mock
112
+ * @kosApiLevel 24
113
+ */
114
+ export interface KosMockRouteInfo {
115
+ id: string;
116
+ method: KosMockMethod;
117
+ pattern: string;
118
+ description?: string;
119
+ enabled: boolean;
120
+ hitCount: number;
121
+ }
122
+ /**
123
+ * @kosService core.mock
124
+ * @kosApiLevel 24
125
+ */
126
+ export interface KosMockConfig {
127
+ /**
128
+ * Boot the transport against a standalone loopback socket instead of a real
129
+ * WebSocket. Must be set before KosCore constructs the transport (i.e. at
130
+ * module scope or via `?kosMock=standalone`); it is not togglable on a live
131
+ * connection — dynamic mocking on a live socket is hybrid mode.
132
+ */
133
+ standalone?: boolean;
134
+ /**
135
+ * What happens to requests no route claims. Defaults to "passthrough" in
136
+ * hybrid mode and "respond404" in standalone mode.
137
+ */
138
+ onUnmatched?: "passthrough" | "respond404" | "warn";
139
+ /**
140
+ * Standalone only: synthesize the auth frame that authorizes the transport
141
+ * after open (default true), so boot completes without build flags.
142
+ */
143
+ authorize?: boolean;
144
+ defaultDelayMs?: number;
145
+ }
146
+ /**
147
+ * A named, self-contained mock setup. `setup` runs immediately on
148
+ * registration and may return a teardown, invoked when the scenario handle is
149
+ * removed (or on `clear()`).
150
+ *
151
+ * @kosService core.mock
152
+ * @kosApiLevel 24
153
+ */
154
+ export interface KosMockScenario {
155
+ name: string;
156
+ setup(mock: IKosMockControl): void | (() => void);
157
+ }
158
+ /**
159
+ * Future end states, structurally identical to the models-layer
160
+ * `FutureEndState` values (kept as literals here — core must not import
161
+ * models).
162
+ *
163
+ * @kosService core.mock
164
+ * @kosApiLevel 24
165
+ */
166
+ export type KosMockFutureEndState = "SUCCESS" | "FAIL" | "ABORT" | "CANCEL";
167
+ /**
168
+ * The wire shape of a simulated future frame; structurally assignable to the
169
+ * models-layer `FutureResponse`.
170
+ *
171
+ * @kosService core.mock
172
+ * @kosApiLevel 24
173
+ */
174
+ export interface KosMockFutureFrame {
175
+ id: string;
176
+ tracker?: string;
177
+ progress?: number;
178
+ remainingTimeMs?: number;
179
+ endState?: KosMockFutureEndState;
180
+ reason?: string;
181
+ clientData?: Record<string, unknown>;
182
+ note?: string;
183
+ }
184
+ /**
185
+ * @kosService core.mock
186
+ * @kosApiLevel 24
187
+ */
188
+ export interface KosMockFutureOptions {
189
+ /** Defaults to a generated uuid. */
190
+ id?: string;
191
+ /**
192
+ * Echo of the request's tracker header. This is the only linkage between a
193
+ * simulated future and the model that initiated the request — prefer
194
+ * `futures.fromRequest`, which fills it in.
195
+ */
196
+ tracker?: string;
197
+ /** Total simulated runtime. Default 5000. */
198
+ durationMs?: number;
199
+ /** Progress frame cadence. Default 250. */
200
+ intervalMs?: number;
201
+ /** Terminal state when the duration elapses. Default "SUCCESS". */
202
+ endState?: KosMockFutureEndState;
203
+ reason?: string;
204
+ clientData?: Record<string, unknown>;
205
+ /** Start ticking immediately. Default true. */
206
+ autoStart?: boolean;
207
+ /**
208
+ * Auto-register cancel routes (`POST /api/kos/future/:id/cancel`,
209
+ * `DELETE /api/kos/future/:id`) that end this future with "CANCEL".
210
+ * Default true.
211
+ */
212
+ registerCancelRoute?: boolean;
213
+ }
214
+ /**
215
+ * @kosService core.mock
216
+ * @kosApiLevel 24
217
+ */
218
+ export interface IKosMockFutureHandle {
219
+ readonly id: string;
220
+ readonly tracker?: string;
221
+ readonly progress: number;
222
+ readonly done: boolean;
223
+ /** Current frame — embed as a route response's `data`. */
224
+ snapshot(): KosMockFutureFrame;
225
+ start(): void;
226
+ emitProgress(progress: number, remainingTimeMs?: number): void;
227
+ complete(endState?: KosMockFutureEndState, reason?: string): void;
228
+ cancel(): void;
229
+ /** Stops timers and forgets the future without emitting a terminal frame. */
230
+ dispose(): void;
231
+ }
232
+ /**
233
+ * Generic future lifecycle simulator: emits `kos.future` frames through the
234
+ * inbound transport path so the real future plumbing runs.
235
+ *
236
+ * @kosService core.mock
237
+ * @kosApiLevel 24
238
+ */
239
+ export interface IKosMockFutureSimulator {
240
+ create(options?: KosMockFutureOptions): IKosMockFutureHandle;
241
+ /** `create` with the tracker pulled from the request frame. */
242
+ fromRequest(req: KosMockRequest, options?: KosMockFutureOptions): IKosMockFutureHandle;
243
+ get(idOrTracker: string): IKosMockFutureHandle | undefined;
244
+ readonly active: IKosMockFutureHandle[];
245
+ clear(): void;
246
+ }
247
+ /**
248
+ * One captured HTTP-over-WS exchange in a fixture.
249
+ *
250
+ * @kosService core.mock
251
+ * @kosApiLevel 24
252
+ */
253
+ export interface KosMockFixtureExchange {
254
+ /** Milliseconds from recording start when the request was sent. */
255
+ tMs: number;
256
+ method: string;
257
+ /** Path + query as sent on the wire. */
258
+ url: string;
259
+ tracker?: string;
260
+ /** Raw request body string, when present. */
261
+ requestBody?: string;
262
+ status: number;
263
+ /** Raw response body string, exactly as captured. */
264
+ responseBody: string;
265
+ /**
266
+ * Milliseconds the device took to answer. Playback delays the replayed
267
+ * response by this (scaled by `speed`) so request/response gaps match
268
+ * reality.
269
+ */
270
+ latencyMs?: number;
271
+ /** True when the captured response itself came from the mock layer. */
272
+ mocked?: boolean;
273
+ }
274
+ /**
275
+ * One captured server push (topic frame or future frame).
276
+ *
277
+ * @kosService core.mock
278
+ * @kosApiLevel 24
279
+ */
280
+ export interface KosMockFixturePush {
281
+ tMs: number;
282
+ kind: "topic" | "future";
283
+ /** Topic for `kind: "topic"` pushes. */
284
+ topic?: string;
285
+ /** Tracker parsed from the body for `kind: "future"` pushes. */
286
+ tracker?: string;
287
+ /** Raw body string, exactly as captured. */
288
+ body: string;
289
+ }
290
+ /**
291
+ * A recorded traffic capture: JSON-serializable, suitable for committing as
292
+ * an offline-test fixture and loading back via `KosMock.loadFixture`.
293
+ *
294
+ * @kosService core.mock
295
+ * @kosApiLevel 24
296
+ */
297
+ export interface KosMockFixture {
298
+ version: 1;
299
+ name?: string;
300
+ capturedAt?: string;
301
+ exchanges: KosMockFixtureExchange[];
302
+ pushes: KosMockFixturePush[];
303
+ /**
304
+ * Body discriminators for multiplexed endpoints (many operations over one
305
+ * path, e.g. `POST /api/vms/ops`). Keyed `"METHOD /path"`; the value is a
306
+ * dotted path into the JSON request body (e.g. `"op"` or
307
+ * `"operation.name"`). During playback, captured exchanges for that
308
+ * endpoint are bucketed by the discriminator value and each incoming
309
+ * request is served from its matching bucket (captured order within the
310
+ * bucket), so calls can replay in any order. Requests whose value matches
311
+ * no bucket decline — passing through to the real backend in hybrid mode,
312
+ * or hitting the unmatched policy in standalone.
313
+ */
314
+ discriminators?: Record<string, string>;
315
+ }
316
+ /**
317
+ * Records live transport traffic into a {@link KosMockFixture}. Works against
318
+ * a real device (hybrid or fully live) and captures mocked responses too,
319
+ * marking them.
320
+ *
321
+ * @kosService core.mock
322
+ * @kosApiLevel 24
323
+ */
324
+ export interface IKosMockRecorder {
325
+ readonly isRecording: boolean;
326
+ start(options?: {
327
+ name?: string;
328
+ }): void;
329
+ /** Stops recording and returns the finished fixture. */
330
+ stop(): KosMockFixture;
331
+ /** Snapshot of the capture so far without stopping. */
332
+ toFixture(): KosMockFixture;
333
+ /** Browser: triggers a JSON download of the current fixture. */
334
+ download(filename?: string): void;
335
+ }
336
+ /**
337
+ * A decoded outbound request, as seen by observers.
338
+ *
339
+ * @kosService core.mock
340
+ * @kosApiLevel 24
341
+ */
342
+ export interface KosMockRequestObservation {
343
+ method: string;
344
+ url: string;
345
+ path: string;
346
+ query: Record<string, string>;
347
+ requestId: string;
348
+ tracker?: string;
349
+ rawBody?: string;
350
+ }
351
+ /**
352
+ * A decoded inbound response, as seen by observers.
353
+ *
354
+ * @kosService core.mock
355
+ * @kosApiLevel 24
356
+ */
357
+ export interface KosMockResponseObservation {
358
+ requestId: string;
359
+ status: number;
360
+ /** True when the response was generated by the mock layer. */
361
+ mocked: boolean;
362
+ /** Fixture name, when the mocked response came from one. */
363
+ fixture?: string;
364
+ body: string;
365
+ headers: Record<string, string>;
366
+ }
367
+ /**
368
+ * An inbound topic push, as seen by observers.
369
+ *
370
+ * @kosService core.mock
371
+ * @kosApiLevel 24
372
+ */
373
+ export interface KosMockTopicObservation {
374
+ topic: string;
375
+ body: string;
376
+ headers: Record<string, string>;
377
+ }
378
+ /**
379
+ * Passive observation of transport traffic — every outbound request and
380
+ * every inbound response/topic/future frame, whether real, mocked, or
381
+ * injected. Observation does not require mocking to be enabled, so hooks
382
+ * work against a live device. This is the trigger surface for orchestrating
383
+ * side effects that are caused by activity but not part of a request/response
384
+ * or future (e.g. fire a topic when a pour future crosses 50% progress).
385
+ *
386
+ * @kosService core.mock
387
+ * @kosApiLevel 24
388
+ */
389
+ export interface KosMockObserver {
390
+ onRequest?: (request: KosMockRequestObservation) => void;
391
+ onResponse?: (response: KosMockResponseObservation) => void;
392
+ onTopic?: (topic: KosMockTopicObservation) => void;
393
+ onFuture?: (future: KosMockFutureFrame) => void;
394
+ }
395
+ /**
396
+ * Context handed to a response transformer.
397
+ *
398
+ * @kosService core.mock
399
+ * @kosApiLevel 24
400
+ */
401
+ export interface KosMockTransformInfo {
402
+ request: KosMockRequestObservation;
403
+ /** Response wire headers (read-only view). */
404
+ headers: Record<string, string>;
405
+ status: number;
406
+ /** True when the response being transformed came from the mock layer. */
407
+ mocked: boolean;
408
+ }
409
+ /**
410
+ * Patches a real (or mocked) response body in flight. Receives the parsed
411
+ * JSON body (usually the `{status, data}` envelope); return the modified
412
+ * value, or `undefined` to leave the response unchanged. Transformed
413
+ * responses are stamped with the `kos-mock-transformed: true` wire header.
414
+ *
415
+ * @kosService core.mock
416
+ * @kosApiLevel 24
417
+ */
418
+ export type KosMockResponseTransformer = (body: unknown, info: KosMockTransformInfo) => unknown | undefined;
419
+ /**
420
+ * @kosService core.mock
421
+ * @kosApiLevel 24
422
+ */
423
+ export interface KosMockTransformerInfo {
424
+ id: string;
425
+ method: KosMockMethod;
426
+ pattern: string;
427
+ description?: string;
428
+ }
429
+ /**
430
+ * Config-property helpers: simulate config changes and inject not-yet-real
431
+ * properties over the standard config-bean wire surface
432
+ * (`GET /api/kos/config/details/{id}/{depth}`, `POST /api/kos/config/{id}`,
433
+ * WS topic `/kos/config/{id}`).
434
+ *
435
+ * @kosService core.mock
436
+ * @kosApiLevel 24
437
+ */
438
+ export interface KosMockConfigFacade {
439
+ /**
440
+ * Simulates a config change: publishes the `/kos/config/{beanId}` update
441
+ * topic with a `changes` envelope for the given properties. Purely an
442
+ * injection — nothing is sent to the backend.
443
+ */
444
+ update(beanId: string, props: Record<string, unknown>, options?: {
445
+ previousValues?: Record<string, unknown>;
446
+ }): void;
447
+ /**
448
+ * Injects properties (and optionally their schema nodes) into a config
449
+ * bean before the backend implements them. Reads of the bean's details are
450
+ * transformed to include the injected props; writes touching only injected
451
+ * props are absorbed locally (200 + change topic); other writes pass
452
+ * through untouched.
453
+ */
454
+ inject(beanId: string, injection: {
455
+ props: Record<string, unknown>;
456
+ /** Schema nodes keyed by prop name, merged into `schema.schema` + `paths`. */
457
+ schema?: Record<string, object>;
458
+ }): KosMockConfigInjectionHandle;
459
+ }
460
+ /**
461
+ * @kosService core.mock
462
+ * @kosApiLevel 24
463
+ */
464
+ export interface KosMockConfigInjectionHandle extends KosMockHandle {
465
+ /** Updates injected values and fires the corresponding change topic. */
466
+ set(props: Record<string, unknown>): void;
467
+ }
468
+ /**
469
+ * @kosService core.mock
470
+ * @kosApiLevel 24
471
+ */
472
+ export interface KosMockFixtureSummary {
473
+ name: string;
474
+ /** Where the fixture lives: this browser's IndexedDB or the fixture server. */
475
+ source: "browser" | "server";
476
+ capturedAt?: string;
477
+ exchanges: number;
478
+ pushes: number;
479
+ }
480
+ /**
481
+ * Out-of-band fixture library. Fixtures live in the browser's IndexedDB
482
+ * and/or a `kosui fixtures serve` directory — never bundled into the app.
483
+ * When a server is configured (`useServer` or `?kosFixtureServer=`), it is
484
+ * preferred for saves and lookups, with the browser store as fallback.
485
+ *
486
+ * @kosService core.mock
487
+ * @kosApiLevel 24
488
+ */
489
+ export interface IKosMockFixtureStore {
490
+ /** Fixture server base URL, when configured. */
491
+ readonly serverUrl: string | undefined;
492
+ /** Configures the fixture server (undefined disconnects; true = default URL). */
493
+ useServer(url?: string | true): void;
494
+ /** Saves a fixture under `name` (or its own name). Returns the name. */
495
+ save(fixture: KosMockFixture, options?: {
496
+ name?: string;
497
+ to?: "browser" | "server";
498
+ }): Promise<string>;
499
+ /** Saves the recorder's current capture — console one-liner. */
500
+ saveRecording(name?: string): Promise<string>;
501
+ load(name: string): Promise<KosMockFixture | undefined>;
502
+ list(): Promise<KosMockFixtureSummary[]>;
503
+ delete(name: string): Promise<boolean>;
504
+ /** Browser: file-picker import of a fixture JSON into the store. */
505
+ import(): Promise<string | undefined>;
506
+ /** Loads a fixture by name and starts playback. */
507
+ play(name: string, options?: KosMockPlaybackOptions): Promise<KosMockPlaybackHandle>;
508
+ }
509
+ /**
510
+ * The contract for an out-of-band setup module: the default export receives
511
+ * the KosMock instance, registers whatever it needs (routes, transformers,
512
+ * observers, config injections, ...), and may return a teardown. Written
513
+ * against the passed instance / `window.KosMock` — no imports required, so
514
+ * modules load from any origin without a bundler.
515
+ *
516
+ * @kosService core.mock
517
+ * @kosApiLevel 24
518
+ */
519
+ export type KosMockSetupModule = (kosMock: IKosMockControl) => void | (() => void) | Promise<void | (() => void)>;
520
+ /**
521
+ * @kosService core.mock
522
+ * @kosApiLevel 24
523
+ */
524
+ export interface KosMockSetupHandle {
525
+ name: string;
526
+ url: string;
527
+ /** Runs the module's teardown and forgets the setup. */
528
+ unload(): void;
529
+ }
530
+ /**
531
+ * Loads imperative mock setups (transformers, handlers, scenarios) from out
532
+ * of band — the fixture server's `setups/` directory or any URL — with an
533
+ * install/teardown lifecycle, so imperative mock code needn't be bundled
534
+ * into the app any more than fixtures are.
535
+ *
536
+ * @kosService core.mock
537
+ * @kosApiLevel 24
538
+ */
539
+ export interface IKosMockSetupStore {
540
+ /**
541
+ * Imports a setup module and runs its default export. Bare names resolve
542
+ * to `{fixtureServer}/setups/{name}.mjs`; full URLs load as-is. Loading a
543
+ * name that is already active replaces it (old teardown runs first).
544
+ */
545
+ load(nameOrUrl: string): Promise<KosMockSetupHandle>;
546
+ /** Server-side setup listing (requires a configured/reachable server). */
547
+ list(): Promise<Array<{
548
+ name: string;
549
+ }>>;
550
+ active(): KosMockSetupHandle[];
551
+ /** Unloads by name; true when something was unloaded. */
552
+ unload(name: string): boolean;
553
+ /** Unloads everything. */
554
+ clear(): void;
555
+ }
556
+ /**
557
+ * @kosService core.mock
558
+ * @kosApiLevel 24
559
+ */
560
+ export interface KosMockPlaybackOptions {
561
+ /** Overrides the fixture's name for the `kos-mock-fixture` header. */
562
+ name?: string;
563
+ /**
564
+ * Applies to UNANCHORED pushes (topics, and futures whose tracker matches
565
+ * no captured exchange): "scheduled" (default) replays them on their
566
+ * captured timeline from load; "manual" waits for `startPushes()`.
567
+ * Future pushes whose tracker matches a captured exchange are ANCHORED:
568
+ * they always fire relative to the moment their replayed request is served,
569
+ * at the captured request→frame deltas — like the real device.
570
+ */
571
+ pushes?: "scheduled" | "manual";
572
+ /**
573
+ * Speed multiplier applied to every replayed timing (response latency,
574
+ * anchored deltas, unanchored timeline). 2 = twice as fast. Default 1.
575
+ */
576
+ speed?: number;
577
+ /** Skip replaying captured response latency (serve instantly). */
578
+ ignoreLatency?: boolean;
579
+ /**
580
+ * Merged over the fixture's own discriminators; values may also be
581
+ * functions extracting the discriminator from the parsed request body.
582
+ */
583
+ discriminators?: Record<string, string | ((body: unknown) => unknown)>;
584
+ /**
585
+ * What happens as captured exchanges are served. "once" retires each
586
+ * exchange after it serves — when an endpoint (or discriminator bucket)
587
+ * runs dry, further calls decline, passing through to the real backend in
588
+ * hybrid mode. "repeat-last" keeps re-serving the final captured response.
589
+ * Default: "once" in hybrid, "repeat-last" in standalone.
590
+ */
591
+ consume?: "once" | "repeat-last";
592
+ }
593
+ /**
594
+ * @kosService core.mock
595
+ * @kosApiLevel 24
596
+ */
597
+ export interface KosMockPlaybackHandle {
598
+ readonly name?: string;
599
+ /** Begins the push timeline (no-op when pushes are "scheduled"). */
600
+ startPushes(): void;
601
+ /** Unregisters the fixture's routes and cancels pending pushes. */
602
+ stop(): void;
603
+ }
604
+ /**
605
+ * The KosMock control surface — everything a fixture module, a test, a future
606
+ * Studio tool, or an in-page agent drives. Reachable as `window.KosMock`.
607
+ *
608
+ * @kosService core.mock
609
+ * @kosApiLevel 24
610
+ */
611
+ export interface IKosMockControl {
612
+ /** Master switch. Registering a route enables the facility automatically. */
613
+ readonly enabled: boolean;
614
+ enable(): void;
615
+ disable(): void;
616
+ readonly standalone: boolean;
617
+ configure(config: KosMockConfig): void;
618
+ route(method: KosMockMethod, pattern: string, handler: KosMockRouteHandler | KosMockResponse, options?: KosMockRouteOptions): KosMockHandle;
619
+ get(pattern: string, handler: KosMockRouteHandler | KosMockResponse, options?: KosMockRouteOptions): KosMockHandle;
620
+ post(pattern: string, handler: KosMockRouteHandler | KosMockResponse, options?: KosMockRouteOptions): KosMockHandle;
621
+ put(pattern: string, handler: KosMockRouteHandler | KosMockResponse, options?: KosMockRouteOptions): KosMockHandle;
622
+ del(pattern: string, handler: KosMockRouteHandler | KosMockResponse, options?: KosMockRouteOptions): KosMockHandle;
623
+ /**
624
+ * Registers a response transformer for requests matching method + path
625
+ * pattern. Applies to passthrough (real device) and mocked responses
626
+ * alike; transformers run in registration order, each seeing the previous
627
+ * one's output.
628
+ */
629
+ transformResponse(method: KosMockMethod, pattern: string, transform: KosMockResponseTransformer, options?: {
630
+ id?: string;
631
+ description?: string;
632
+ }): KosMockHandle;
633
+ /** Config-property simulation helpers. */
634
+ readonly config: KosMockConfigFacade;
635
+ /** Pushes an inbound topic frame through the real receive path. */
636
+ publishTopic(topic: string, body: unknown, headers?: Record<string, string>): void;
637
+ /** Low-level escape hatch: inject a verbatim inbound frame. */
638
+ publishFrame(rawFrame: string): void;
639
+ topicEmitter(topic: string, options: {
640
+ intervalMs: number;
641
+ body: (tick: number) => unknown;
642
+ }): KosMockHandle;
643
+ readonly futures: IKosMockFutureSimulator;
644
+ /** Live-traffic capture for building offline fixtures. */
645
+ readonly recorder: IKosMockRecorder;
646
+ /** Out-of-band fixture library (browser store + `kosui fixtures serve`). */
647
+ readonly fixtures: IKosMockFixtureStore;
648
+ /** Out-of-band imperative setup modules with install/teardown lifecycle. */
649
+ readonly setups: IKosMockSetupStore;
650
+ /**
651
+ * Registers a passive traffic observer; returns an unregister function.
652
+ * Works regardless of the enabled flag (live devices included).
653
+ */
654
+ observe(observer: KosMockObserver): () => void;
655
+ /** Loads a recorded fixture as replay routes + a push timeline. */
656
+ loadFixture(fixture: KosMockFixture, options?: KosMockPlaybackOptions): KosMockPlaybackHandle;
657
+ readonly state: Map<string, unknown>;
658
+ scenario(scenario: KosMockScenario): KosMockHandle;
659
+ list(): KosMockRouteInfo[];
660
+ describe(): {
661
+ enabled: boolean;
662
+ standalone: boolean;
663
+ routes: KosMockRouteInfo[];
664
+ transformers: KosMockTransformerInfo[];
665
+ setups: Array<{
666
+ name: string;
667
+ url: string;
668
+ }>;
669
+ activeFutures: string[];
670
+ subscribedTopics: string[];
671
+ };
672
+ /** Topics observed in outbound `kos.broker.subscribe` frames. */
673
+ readonly subscribedTopics: string[];
674
+ /** Removes every route, scenario, emitter, and future; clears state. */
675
+ clear(): void;
676
+ }
677
+ //# sourceMappingURL=mock-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-types.d.ts","sourceRoot":"","sources":["../../../../../../../packages/kos-ui-sdk/src/core/core/transport/mock/mock-types.ts"],"names":[],"mappings":"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"}