@toyz/loom 0.19.5 → 0.19.7
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.
- package/dist/app.d.ts +13 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +44 -1
- package/dist/app.js.map +1 -1
- package/dist/lifecycle.d.ts +28 -20
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +17 -14
- package/dist/lifecycle.js.map +1 -1
- package/package.json +1 -1
package/dist/app.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ declare class LoomApp {
|
|
|
22
22
|
private factories;
|
|
23
23
|
private components;
|
|
24
24
|
private _started;
|
|
25
|
+
private _visibilityCleanup;
|
|
25
26
|
/** Subscribe to a typed event. Returns unsubscribe function. */
|
|
26
27
|
on<T>(type: Constructor<T>, handler: Handler<T>): () => void;
|
|
27
28
|
/** Emit a typed event to all listeners. */
|
|
@@ -65,6 +66,18 @@ declare class LoomApp {
|
|
|
65
66
|
start(): Promise<void>;
|
|
66
67
|
/** Tear down — call stop() on lifecycle-aware services (reverse order), then stop render loop */
|
|
67
68
|
stop(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Call suspend() on all lifecycle-aware services.
|
|
71
|
+
* Invoked automatically on `visibilitychange` (tab hidden), or manually.
|
|
72
|
+
*/
|
|
73
|
+
suspend(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Call resume() on all lifecycle-aware services.
|
|
76
|
+
* Invoked automatically on `visibilitychange` (tab visible), or manually.
|
|
77
|
+
*/
|
|
78
|
+
resume(): void;
|
|
79
|
+
/** Wire document.visibilitychange to auto-call suspend/resume on services */
|
|
80
|
+
private _wireVisibility;
|
|
68
81
|
/** Whether the app has been started */
|
|
69
82
|
get started(): boolean;
|
|
70
83
|
}
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAO,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAStC,cAAM,OAAO;IACX,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,UAAU,CAAyD;IAC3E,OAAO,CAAC,QAAQ,CAAS;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAO,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAStC,cAAM,OAAO;IACX,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,UAAU,CAAyD;IAC3E,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,kBAAkB,CAA6B;IAIvD,gEAAgE;IAChE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAE5D,2CAA2C;IAC3C,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAEzC,uCAAuC;IACvC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAIvD;;;;;;;;;OASG;IACH,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAC5B,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;IA6BzC,+DAA+D;IAC/D,eAAe,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIhC,wDAAwD;IACxD,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,QAAQ,CAAA;KAAE,GAAG,IAAI;IAIvE,gEAAgE;IAChE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,GAAG,IAAI;IAW3D,6DAA6D;IAC7D,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IAQzB,6EAA6E;IAC7E,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC;IAM9C,sEAAsE;IACtE,OAAO,CAAC,aAAa;IAWrB;;;;;;OAMG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD5B,iGAAiG;IACjG,IAAI,IAAI,IAAI;IAeZ;;;OAGG;IACH,OAAO,IAAI,IAAI;IAOf;;;OAGG;IACH,MAAM,IAAI,IAAI;IAOd,6EAA6E;IAC7E,OAAO,CAAC,eAAe;IAUvB,uCAAuC;IACvC,IAAI,OAAO,IAAI,OAAO,CAErB;CACF;AAED,qDAAqD;AACrD,eAAO,MAAM,GAAG,SAAgB,CAAC;AACjC,YAAY,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/app.js
CHANGED
|
@@ -17,13 +17,14 @@ import { renderLoop } from "./render-loop";
|
|
|
17
17
|
import { INJECT_PARAMS, ON_HANDLERS, SERVICE_NAME } from "./decorators/symbols";
|
|
18
18
|
import { bus } from "./bus";
|
|
19
19
|
import { LoomResult } from "./result";
|
|
20
|
-
import { hasStart, hasStop } from "./lifecycle";
|
|
20
|
+
import { hasStart, hasStop, hasSuspend, hasResume } from "./lifecycle";
|
|
21
21
|
class LoomApp {
|
|
22
22
|
providers = new Map();
|
|
23
23
|
services = [];
|
|
24
24
|
factories = [];
|
|
25
25
|
components = [];
|
|
26
26
|
_started = false;
|
|
27
|
+
_visibilityCleanup = null;
|
|
27
28
|
// ── Event bus (delegates to the module-level bus singleton) ──
|
|
28
29
|
/** Subscribe to a typed event. Returns unsubscribe function. */
|
|
29
30
|
on(type, handler) { return bus.on(type, handler); }
|
|
@@ -155,10 +156,17 @@ class LoomApp {
|
|
|
155
156
|
customElements.define(tag, ctor);
|
|
156
157
|
}
|
|
157
158
|
}
|
|
159
|
+
// 5. Wire visibilitychange for suspend/resume lifecycle
|
|
160
|
+
this._wireVisibility();
|
|
158
161
|
this._started = true;
|
|
159
162
|
}
|
|
160
163
|
/** Tear down — call stop() on lifecycle-aware services (reverse order), then stop render loop */
|
|
161
164
|
stop() {
|
|
165
|
+
// Remove visibilitychange listener
|
|
166
|
+
if (this._visibilityCleanup) {
|
|
167
|
+
this._visibilityCleanup();
|
|
168
|
+
this._visibilityCleanup = null;
|
|
169
|
+
}
|
|
162
170
|
// LoomLifecycle — call stop() in reverse registration order
|
|
163
171
|
for (const Svc of [...this.services].reverse()) {
|
|
164
172
|
const instance = this.providers.get(Svc);
|
|
@@ -168,6 +176,41 @@ class LoomApp {
|
|
|
168
176
|
renderLoop.stop();
|
|
169
177
|
this._started = false;
|
|
170
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* Call suspend() on all lifecycle-aware services.
|
|
181
|
+
* Invoked automatically on `visibilitychange` (tab hidden), or manually.
|
|
182
|
+
*/
|
|
183
|
+
suspend() {
|
|
184
|
+
for (const Svc of this.services) {
|
|
185
|
+
const instance = this.providers.get(Svc);
|
|
186
|
+
if (instance && hasSuspend(instance))
|
|
187
|
+
instance.suspend();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Call resume() on all lifecycle-aware services.
|
|
192
|
+
* Invoked automatically on `visibilitychange` (tab visible), or manually.
|
|
193
|
+
*/
|
|
194
|
+
resume() {
|
|
195
|
+
for (const Svc of this.services) {
|
|
196
|
+
const instance = this.providers.get(Svc);
|
|
197
|
+
if (instance && hasResume(instance))
|
|
198
|
+
instance.resume();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/** Wire document.visibilitychange to auto-call suspend/resume on services */
|
|
202
|
+
_wireVisibility() {
|
|
203
|
+
if (typeof document === "undefined")
|
|
204
|
+
return; // SSR guard
|
|
205
|
+
const handler = () => {
|
|
206
|
+
if (document.hidden)
|
|
207
|
+
this.suspend();
|
|
208
|
+
else
|
|
209
|
+
this.resume();
|
|
210
|
+
};
|
|
211
|
+
document.addEventListener("visibilitychange", handler);
|
|
212
|
+
this._visibilityCleanup = () => document.removeEventListener("visibilitychange", handler);
|
|
213
|
+
}
|
|
171
214
|
/** Whether the app has been started */
|
|
172
215
|
get started() {
|
|
173
216
|
return this._started;
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,GAAG,EAAkC,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/lifecycle.d.ts
CHANGED
|
@@ -2,39 +2,39 @@
|
|
|
2
2
|
* Loom — LoomLifecycle interface
|
|
3
3
|
*
|
|
4
4
|
* Opt-in service lifecycle contract. Services that implement this interface
|
|
5
|
-
* will have their
|
|
6
|
-
*
|
|
5
|
+
* will have their methods called automatically by the app:
|
|
6
|
+
*
|
|
7
|
+
* - `start()` / `stop()` — called by `app.start()` / `app.stop()`
|
|
8
|
+
* - `suspend()` / `resume()` — called on `visibilitychange` (tab hidden / visible)
|
|
7
9
|
*
|
|
8
10
|
* ```ts
|
|
9
11
|
* @service("ws")
|
|
10
|
-
* class WebSocketService implements LoomLifecycle<"start" | "stop"> {
|
|
11
|
-
* start()
|
|
12
|
-
* stop()
|
|
12
|
+
* class WebSocketService implements LoomLifecycle<"start" | "stop" | "suspend" | "resume"> {
|
|
13
|
+
* start() { this.ws.connect(); }
|
|
14
|
+
* stop() { this.ws.disconnect(); }
|
|
15
|
+
* suspend() { this.ws.pauseHeartbeat(); } // tab hidden
|
|
16
|
+
* resume() { this.ws.reconnect(); } // tab visible
|
|
13
17
|
* }
|
|
14
|
-
*
|
|
15
|
-
* // No manual call needed in main.ts — app.start() handles it.
|
|
16
18
|
* ```
|
|
17
19
|
*
|
|
18
20
|
* The generic parameter enforces which hooks the service declares.
|
|
19
21
|
* Hooks not in T become `never` — calling them is a compile-time error.
|
|
20
|
-
*
|
|
21
|
-
* ```ts
|
|
22
|
-
* class AnalyticsService implements LoomLifecycle<"start"> {
|
|
23
|
-
* start() { this.track("app_boot"); }
|
|
24
|
-
* // stop() is `never` — calling it won't compile
|
|
25
|
-
* }
|
|
26
|
-
* ```
|
|
27
22
|
*/
|
|
28
|
-
export type LifecycleHook = "start" | "stop";
|
|
23
|
+
export type LifecycleHook = "start" | "stop" | "suspend" | "resume";
|
|
29
24
|
/**
|
|
30
25
|
* Service lifecycle interface.
|
|
31
26
|
*
|
|
32
|
-
* @template T - The lifecycle hooks this service supports
|
|
27
|
+
* @template T - The lifecycle hooks this service supports.
|
|
33
28
|
*/
|
|
34
|
-
export type LoomLifecycle<T extends LifecycleHook> = {
|
|
35
|
-
start
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
export type LoomLifecycle<T extends LifecycleHook> = ("start" extends T ? {
|
|
30
|
+
start(): void | Promise<void>;
|
|
31
|
+
} : {}) & ("stop" extends T ? {
|
|
32
|
+
stop(): void | Promise<void>;
|
|
33
|
+
} : {}) & ("suspend" extends T ? {
|
|
34
|
+
suspend(): void | Promise<void>;
|
|
35
|
+
} : {}) & ("resume" extends T ? {
|
|
36
|
+
resume(): void | Promise<void>;
|
|
37
|
+
} : {});
|
|
38
38
|
/** Type guard — returns true if the value has a callable `start` method */
|
|
39
39
|
export declare function hasStart(v: unknown): v is {
|
|
40
40
|
start: () => void | Promise<void>;
|
|
@@ -43,4 +43,12 @@ export declare function hasStart(v: unknown): v is {
|
|
|
43
43
|
export declare function hasStop(v: unknown): v is {
|
|
44
44
|
stop: () => void | Promise<void>;
|
|
45
45
|
};
|
|
46
|
+
/** Type guard — returns true if the value has a callable `suspend` method */
|
|
47
|
+
export declare function hasSuspend(v: unknown): v is {
|
|
48
|
+
suspend: () => void | Promise<void>;
|
|
49
|
+
};
|
|
50
|
+
/** Type guard — returns true if the value has a callable `resume` method */
|
|
51
|
+
export declare function hasResume(v: unknown): v is {
|
|
52
|
+
resume: () => void | Promise<void>;
|
|
53
|
+
};
|
|
46
54
|
//# sourceMappingURL=lifecycle.d.ts.map
|
package/dist/lifecycle.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEpE;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,aAAa,IAC/C,CAAC,OAAO,SAAW,CAAC,GAAG;IAAE,KAAK,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,EAAE,CAAC,GAChE,CAAC,MAAM,SAAY,CAAC,GAAG;IAAE,IAAI,IAAO,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,EAAE,CAAC,GAChE,CAAC,SAAS,SAAS,CAAC,GAAG;IAAE,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,EAAE,CAAC,GAChE,CAAC,QAAQ,SAAU,CAAC,GAAG;IAAE,MAAM,IAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,EAAE,CAAC,CAAC;AAEnE,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;IAAE,KAAK,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAE/E;AAED,0EAA0E;AAC1E,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;IAAE,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAE7E;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;IAAE,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAEnF;AAED,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;IAAE,MAAM,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAEjF"}
|
package/dist/lifecycle.js
CHANGED
|
@@ -2,28 +2,23 @@
|
|
|
2
2
|
* Loom — LoomLifecycle interface
|
|
3
3
|
*
|
|
4
4
|
* Opt-in service lifecycle contract. Services that implement this interface
|
|
5
|
-
* will have their
|
|
6
|
-
*
|
|
5
|
+
* will have their methods called automatically by the app:
|
|
6
|
+
*
|
|
7
|
+
* - `start()` / `stop()` — called by `app.start()` / `app.stop()`
|
|
8
|
+
* - `suspend()` / `resume()` — called on `visibilitychange` (tab hidden / visible)
|
|
7
9
|
*
|
|
8
10
|
* ```ts
|
|
9
11
|
* @service("ws")
|
|
10
|
-
* class WebSocketService implements LoomLifecycle<"start" | "stop"> {
|
|
11
|
-
* start()
|
|
12
|
-
* stop()
|
|
12
|
+
* class WebSocketService implements LoomLifecycle<"start" | "stop" | "suspend" | "resume"> {
|
|
13
|
+
* start() { this.ws.connect(); }
|
|
14
|
+
* stop() { this.ws.disconnect(); }
|
|
15
|
+
* suspend() { this.ws.pauseHeartbeat(); } // tab hidden
|
|
16
|
+
* resume() { this.ws.reconnect(); } // tab visible
|
|
13
17
|
* }
|
|
14
|
-
*
|
|
15
|
-
* // No manual call needed in main.ts — app.start() handles it.
|
|
16
18
|
* ```
|
|
17
19
|
*
|
|
18
20
|
* The generic parameter enforces which hooks the service declares.
|
|
19
21
|
* Hooks not in T become `never` — calling them is a compile-time error.
|
|
20
|
-
*
|
|
21
|
-
* ```ts
|
|
22
|
-
* class AnalyticsService implements LoomLifecycle<"start"> {
|
|
23
|
-
* start() { this.track("app_boot"); }
|
|
24
|
-
* // stop() is `never` — calling it won't compile
|
|
25
|
-
* }
|
|
26
|
-
* ```
|
|
27
22
|
*/
|
|
28
23
|
/** Type guard — returns true if the value has a callable `start` method */
|
|
29
24
|
export function hasStart(v) {
|
|
@@ -33,4 +28,12 @@ export function hasStart(v) {
|
|
|
33
28
|
export function hasStop(v) {
|
|
34
29
|
return typeof v?.stop === "function";
|
|
35
30
|
}
|
|
31
|
+
/** Type guard — returns true if the value has a callable `suspend` method */
|
|
32
|
+
export function hasSuspend(v) {
|
|
33
|
+
return typeof v?.suspend === "function";
|
|
34
|
+
}
|
|
35
|
+
/** Type guard — returns true if the value has a callable `resume` method */
|
|
36
|
+
export function hasResume(v) {
|
|
37
|
+
return typeof v?.resume === "function";
|
|
38
|
+
}
|
|
36
39
|
//# sourceMappingURL=lifecycle.js.map
|
package/dist/lifecycle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAeH,2EAA2E;AAC3E,MAAM,UAAU,QAAQ,CAAC,CAAU;IACjC,OAAO,OAAQ,CAAS,EAAE,KAAK,KAAK,UAAU,CAAC;AACjD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,OAAO,CAAC,CAAU;IAChC,OAAO,OAAQ,CAAS,EAAE,IAAI,KAAK,UAAU,CAAC;AAChD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,OAAO,OAAQ,CAAS,EAAE,OAAO,KAAK,UAAU,CAAC;AACnD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,SAAS,CAAC,CAAU;IAClC,OAAO,OAAQ,CAAS,EAAE,MAAM,KAAK,UAAU,CAAC;AAClD,CAAC"}
|