@flighthq/lifecycle 0.3.1-next.975.01aea94 → 0.4.0-edge.1908.751021c
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/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lifecycle.d.ts +5 -0
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +54 -7
- package/dist/lifecycle.js.map +1 -1
- package/package.json +3 -3
- package/src/lifecycle.test.ts +81 -0
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { attachAppLifecycle, createAppLifecycle, detachAppLifecycle, disposeAppLifecycle, getAppLaunchKind, getAppLifecycleState, isAppActive, isAppBackground, isAppInactive, requestAppBack, } from './contract';
|
|
1
|
+
export { explainLifecycleBackend, attachAppLifecycle, createAppLifecycle, detachAppLifecycle, disposeAppLifecycle, getAppLaunchKind, getAppLifecycleState, isAppActive, isAppBackground, isAppInactive, requestAppBack, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { attachAppLifecycle, createAppLifecycle, detachAppLifecycle, disposeAppLifecycle, getAppLaunchKind, getAppLifecycleState, isAppActive, isAppBackground, isAppInactive, requestAppBack, } from './contract';
|
|
1
|
+
export { explainLifecycleBackend, attachAppLifecycle, createAppLifecycle, detachAppLifecycle, disposeAppLifecycle, getAppLaunchKind, getAppLifecycleState, isAppActive, isAppBackground, isAppInactive, requestAppBack, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/lifecycle.d.ts
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
|
+
import type { BackendExplanation } from '@flighthq/types/contract';
|
|
1
2
|
import type { AppLaunchKind, AppLifecycle, AppLifecycleState, LifecycleBackend } from '@flighthq/types/contract';
|
|
2
3
|
export declare function attachAppLifecycle(app: AppLifecycle): void;
|
|
3
4
|
export declare function createAppLifecycle(): AppLifecycle;
|
|
4
5
|
export declare function createWebLifecycleBackend(): LifecycleBackend;
|
|
5
6
|
export declare function detachAppLifecycle(app: AppLifecycle): void;
|
|
6
7
|
export declare function disposeAppLifecycle(app: AppLifecycle): void;
|
|
8
|
+
export declare function explainLifecycleBackend(): BackendExplanation;
|
|
7
9
|
export declare function getAppLaunchKind(): AppLaunchKind;
|
|
8
10
|
export declare function getAppLifecycleState(): AppLifecycleState;
|
|
9
11
|
export declare function getLifecycleBackend(): LifecycleBackend;
|
|
12
|
+
export declare function installLifecycleHostBackend(backend: LifecycleBackend): void;
|
|
10
13
|
export declare function isAppActive(): boolean;
|
|
11
14
|
export declare function isAppBackground(): boolean;
|
|
12
15
|
export declare function isAppInactive(): boolean;
|
|
16
|
+
export declare function observeLifecycleHostResult(operation: string, succeeded: boolean): void;
|
|
13
17
|
export declare function requestAppBack(app: AppLifecycle): boolean;
|
|
18
|
+
export declare function resetLifecycleBackendForTest(): void;
|
|
14
19
|
export declare function setLifecycleBackend(backend: LifecycleBackend | null): void;
|
|
15
20
|
//# 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":"AACA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,iBAAiB,EAEjB,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAYlC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAqC1D;AAGD,wBAAgB,kBAAkB,IAAI,YAAY,CAUjD;AAmBD,wBAAgB,yBAAyB,IAAI,gBAAgB,CA4E5D;AAGD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAM1D;AAID,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAG3D;AAMD,wBAAgB,gBAAgB,IAAI,aAAa,CAGhD;AAGD,wBAAgB,oBAAoB,IAAI,iBAAiB,CAExD;
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,iBAAiB,EAEjB,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAYlC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAqC1D;AAGD,wBAAgB,kBAAkB,IAAI,YAAY,CAUjD;AAmBD,wBAAgB,yBAAyB,IAAI,gBAAgB,CA4E5D;AAGD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAM1D;AAID,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAG3D;AAED,wBAAgB,uBAAuB,IAAI,kBAAkB,CAa5D;AAMD,wBAAgB,gBAAgB,IAAI,aAAa,CAGhD;AAGD,wBAAgB,oBAAoB,IAAI,iBAAiB,CAExD;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAM3E;AAGD,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAGD,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAID,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAKtF;AAOD,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAGzD;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAKnD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAE1E"}
|
package/dist/lifecycle.js
CHANGED
|
@@ -173,6 +173,20 @@ export function disposeAppLifecycle(app) {
|
|
|
173
173
|
detachAppLifecycle(app);
|
|
174
174
|
_savedState.delete(app);
|
|
175
175
|
}
|
|
176
|
+
export function explainLifecycleBackend() {
|
|
177
|
+
if (_custom !== null) {
|
|
178
|
+
return { conflict: _hostConflict, layer: 'custom', operation: null, viability: 'unobserved' };
|
|
179
|
+
}
|
|
180
|
+
if (_host !== null) {
|
|
181
|
+
return {
|
|
182
|
+
conflict: _hostConflict,
|
|
183
|
+
layer: 'host',
|
|
184
|
+
operation: _hostObservation !== null ? _hostObservation.operation : null,
|
|
185
|
+
viability: _hostObservation !== null ? _hostObservation.viability : 'unobserved',
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
return { conflict: false, layer: 'host-not-enabled', operation: null, viability: 'unobserved' };
|
|
189
|
+
}
|
|
176
190
|
// Returns the kind of launch — 'cold' (fresh process) or 'warm' (resumed from background). The web
|
|
177
191
|
// backend approximates this via PerformanceNavigationTiming.type ('back_forward' → 'warm', all
|
|
178
192
|
// others → 'cold'). Returns 'warm' as a safe fallback when the backend does not implement
|
|
@@ -185,11 +199,16 @@ export function getAppLaunchKind() {
|
|
|
185
199
|
export function getAppLifecycleState() {
|
|
186
200
|
return getLifecycleBackend().getState();
|
|
187
201
|
}
|
|
188
|
-
// The active lifecycle backend, or a lazily-created web default. There is always a backend.
|
|
189
202
|
export function getLifecycleBackend() {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
203
|
+
return _custom ?? _host ?? _sentinel;
|
|
204
|
+
}
|
|
205
|
+
export function installLifecycleHostBackend(backend) {
|
|
206
|
+
if (_host !== null) {
|
|
207
|
+
if (_host !== backend)
|
|
208
|
+
_hostConflict = true;
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
_host = backend;
|
|
193
212
|
}
|
|
194
213
|
// Returns true when the application is in the 'active' state (visible and focused).
|
|
195
214
|
export function isAppActive() {
|
|
@@ -204,6 +223,12 @@ export function isAppBackground() {
|
|
|
204
223
|
export function isAppInactive() {
|
|
205
224
|
return getLifecycleBackend().getState() === 'inactive';
|
|
206
225
|
}
|
|
226
|
+
export function observeLifecycleHostResult(operation, succeeded) {
|
|
227
|
+
_hostObservation = {
|
|
228
|
+
operation,
|
|
229
|
+
viability: succeeded ? 'available' : 'runtime-api-unavailable',
|
|
230
|
+
};
|
|
231
|
+
}
|
|
207
232
|
// Emits app.onBackButton and returns whether the back action may proceed. Returns false when a
|
|
208
233
|
// listener vetoed by calling cancelSignal(app.onBackButton), meaning the listener handled
|
|
209
234
|
// navigation itself. Returns true when no listener consumed the event and the host should perform
|
|
@@ -213,11 +238,33 @@ export function requestAppBack(app) {
|
|
|
213
238
|
emitSignal(app.onBackButton);
|
|
214
239
|
return app.onBackButton.data?.cancelled !== true;
|
|
215
240
|
}
|
|
216
|
-
|
|
241
|
+
export function resetLifecycleBackendForTest() {
|
|
242
|
+
_custom = null;
|
|
243
|
+
_host = null;
|
|
244
|
+
_hostConflict = false;
|
|
245
|
+
_hostObservation = null;
|
|
246
|
+
}
|
|
217
247
|
export function setLifecycleBackend(backend) {
|
|
218
|
-
|
|
248
|
+
_custom = backend;
|
|
219
249
|
}
|
|
220
|
-
let _backend = null;
|
|
221
250
|
const _savedState = new WeakMap();
|
|
251
|
+
const _sentinel = {
|
|
252
|
+
getState() {
|
|
253
|
+
return 'active';
|
|
254
|
+
},
|
|
255
|
+
getLaunchKind() {
|
|
256
|
+
return 'cold';
|
|
257
|
+
},
|
|
258
|
+
subscribe() {
|
|
259
|
+
return () => { };
|
|
260
|
+
},
|
|
261
|
+
subscribeMemoryWarning() {
|
|
262
|
+
return () => { };
|
|
263
|
+
},
|
|
264
|
+
};
|
|
222
265
|
const _subscriptions = new WeakMap();
|
|
266
|
+
let _custom = null;
|
|
267
|
+
let _host = null;
|
|
268
|
+
let _hostConflict = false;
|
|
269
|
+
let _hostObservation = null;
|
|
223
270
|
//# 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,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/lifecycle",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0-edge.1908.751021c",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/signals": "0.
|
|
42
|
-
"@flighthq/types": "0.
|
|
41
|
+
"@flighthq/signals": "0.4.0-edge.1908.751021c",
|
|
42
|
+
"@flighthq/types": "0.4.0-edge.1908.751021c"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"typescript": "^5.3.0"
|
package/src/lifecycle.test.ts
CHANGED
|
@@ -15,6 +15,10 @@ import {
|
|
|
15
15
|
isAppInactive,
|
|
16
16
|
requestAppBack,
|
|
17
17
|
setLifecycleBackend,
|
|
18
|
+
explainLifecycleBackend,
|
|
19
|
+
installLifecycleHostBackend,
|
|
20
|
+
observeLifecycleHostResult,
|
|
21
|
+
resetLifecycleBackendForTest,
|
|
18
22
|
} from './lifecycle';
|
|
19
23
|
|
|
20
24
|
type FakeBackend = LifecycleBackend & {
|
|
@@ -432,6 +436,34 @@ describe('disposeAppLifecycle', () => {
|
|
|
432
436
|
});
|
|
433
437
|
});
|
|
434
438
|
|
|
439
|
+
describe('explainLifecycleBackend', () => {
|
|
440
|
+
afterEach(() => resetLifecycleBackendForTest());
|
|
441
|
+
|
|
442
|
+
it('reports host-not-enabled when no backend is installed', () => {
|
|
443
|
+
resetLifecycleBackendForTest();
|
|
444
|
+
const explanation = explainLifecycleBackend();
|
|
445
|
+
expect(explanation.layer).toBe('host-not-enabled');
|
|
446
|
+
expect(explanation.conflict).toBe(false);
|
|
447
|
+
expect(explanation.viability).toBe('unobserved');
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
it('reports custom layer when a custom backend is set', () => {
|
|
451
|
+
setLifecycleBackend(fakeBackend());
|
|
452
|
+
expect(explainLifecycleBackend().layer).toBe('custom');
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
it('reports host layer when a host backend is installed', () => {
|
|
456
|
+
installLifecycleHostBackend(fakeBackend());
|
|
457
|
+
expect(explainLifecycleBackend().layer).toBe('host');
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
it('reports conflict when two different host backends are installed', () => {
|
|
461
|
+
installLifecycleHostBackend(fakeBackend());
|
|
462
|
+
installLifecycleHostBackend(fakeBackend());
|
|
463
|
+
expect(explainLifecycleBackend().conflict).toBe(true);
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
|
|
435
467
|
describe('getAppLaunchKind', () => {
|
|
436
468
|
it("returns 'warm' when backend does not implement getLaunchKind", () => {
|
|
437
469
|
const backend = fakeBackend();
|
|
@@ -465,6 +497,25 @@ describe('getLifecycleBackend', () => {
|
|
|
465
497
|
});
|
|
466
498
|
});
|
|
467
499
|
|
|
500
|
+
describe('installLifecycleHostBackend', () => {
|
|
501
|
+
afterEach(() => resetLifecycleBackendForTest());
|
|
502
|
+
|
|
503
|
+
it('installs a host backend that getLifecycleBackend returns', () => {
|
|
504
|
+
const backend = fakeBackend();
|
|
505
|
+
installLifecycleHostBackend(backend);
|
|
506
|
+
expect(getLifecycleBackend()).toBe(backend);
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
it('is first-host-wins: a second different backend sets conflict', () => {
|
|
510
|
+
const first = fakeBackend();
|
|
511
|
+
const second = fakeBackend();
|
|
512
|
+
installLifecycleHostBackend(first);
|
|
513
|
+
installLifecycleHostBackend(second);
|
|
514
|
+
expect(getLifecycleBackend()).toBe(first);
|
|
515
|
+
expect(explainLifecycleBackend().conflict).toBe(true);
|
|
516
|
+
});
|
|
517
|
+
});
|
|
518
|
+
|
|
468
519
|
describe('isAppActive', () => {
|
|
469
520
|
it("returns true when state is 'active'", () => {
|
|
470
521
|
const backend = fakeBackend();
|
|
@@ -520,6 +571,24 @@ describe('isAppInactive', () => {
|
|
|
520
571
|
});
|
|
521
572
|
});
|
|
522
573
|
|
|
574
|
+
describe('observeLifecycleHostResult', () => {
|
|
575
|
+
afterEach(() => resetLifecycleBackendForTest());
|
|
576
|
+
|
|
577
|
+
it('records a successful observation', () => {
|
|
578
|
+
installLifecycleHostBackend(fakeBackend());
|
|
579
|
+
observeLifecycleHostResult('getState', true);
|
|
580
|
+
const explanation = explainLifecycleBackend();
|
|
581
|
+
expect(explanation.operation).toBe('getState');
|
|
582
|
+
expect(explanation.viability).toBe('available');
|
|
583
|
+
});
|
|
584
|
+
|
|
585
|
+
it('records a failed observation', () => {
|
|
586
|
+
installLifecycleHostBackend(fakeBackend());
|
|
587
|
+
observeLifecycleHostResult('getState', false);
|
|
588
|
+
expect(explainLifecycleBackend().viability).toBe('runtime-api-unavailable');
|
|
589
|
+
});
|
|
590
|
+
});
|
|
591
|
+
|
|
523
592
|
describe('requestAppBack', () => {
|
|
524
593
|
it('returns true when no listener vetoes', () => {
|
|
525
594
|
const app = createAppLifecycle();
|
|
@@ -541,6 +610,18 @@ describe('requestAppBack', () => {
|
|
|
541
610
|
});
|
|
542
611
|
});
|
|
543
612
|
|
|
613
|
+
describe('resetLifecycleBackendForTest', () => {
|
|
614
|
+
it('clears all backend slots', () => {
|
|
615
|
+
setLifecycleBackend(fakeBackend());
|
|
616
|
+
installLifecycleHostBackend(fakeBackend());
|
|
617
|
+
observeLifecycleHostResult('getState', true);
|
|
618
|
+
resetLifecycleBackendForTest();
|
|
619
|
+
expect(explainLifecycleBackend().layer).toBe('host-not-enabled');
|
|
620
|
+
expect(explainLifecycleBackend().conflict).toBe(false);
|
|
621
|
+
expect(explainLifecycleBackend().viability).toBe('unobserved');
|
|
622
|
+
});
|
|
623
|
+
});
|
|
624
|
+
|
|
544
625
|
describe('setLifecycleBackend', () => {
|
|
545
626
|
it('clears back to the web fallback when passed null', () => {
|
|
546
627
|
setLifecycleBackend(fakeBackend());
|