storion 0.8.3 → 0.10.0
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/CHANGELOG.md +127 -21
- package/README.md +42 -2021
- package/dist/async/abortable.d.ts +295 -0
- package/dist/async/abortable.d.ts.map +1 -0
- package/dist/async/async.d.ts +86 -5
- package/dist/async/async.d.ts.map +1 -1
- package/dist/async/context.d.ts +15 -0
- package/dist/async/context.d.ts.map +1 -0
- package/dist/async/index.d.ts +16 -3
- package/dist/async/index.d.ts.map +1 -1
- package/dist/async/index.js +407 -137
- package/dist/async/safe.d.ts +221 -0
- package/dist/async/safe.d.ts.map +1 -0
- package/dist/async/types.d.ts +77 -29
- package/dist/async/types.d.ts.map +1 -1
- package/dist/async/wrappers.d.ts +217 -0
- package/dist/async/wrappers.d.ts.map +1 -0
- package/dist/core/effect.d.ts +34 -26
- package/dist/core/effect.d.ts.map +1 -1
- package/dist/core/equality.d.ts +25 -0
- package/dist/core/equality.d.ts.map +1 -1
- package/dist/core/focus.d.ts +20 -0
- package/dist/core/focus.d.ts.map +1 -0
- package/dist/core/focusHelpers.d.ts +258 -0
- package/dist/core/focusHelpers.d.ts.map +1 -0
- package/dist/core/middleware.d.ts +4 -4
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/storeContext.d.ts +2 -9
- package/dist/core/storeContext.d.ts.map +1 -1
- package/dist/dev.d.ts +0 -10
- package/dist/dev.d.ts.map +1 -1
- package/dist/{index-C8B6Mo8r.js → effect-BDQU8Voz.js} +1241 -583
- package/dist/errors.d.ts +6 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/network/index.d.ts +69 -0
- package/dist/network/index.d.ts.map +1 -0
- package/dist/network/retry.d.ts +53 -0
- package/dist/network/retry.d.ts.map +1 -0
- package/dist/network/services.d.ts +58 -0
- package/dist/network/services.d.ts.map +1 -0
- package/dist/network/store.d.ts +36 -0
- package/dist/network/store.d.ts.map +1 -0
- package/dist/network/utils.d.ts +9 -0
- package/dist/network/utils.d.ts.map +1 -0
- package/dist/persist/index.d.ts +1 -1
- package/dist/persist/index.d.ts.map +1 -1
- package/dist/persist/index.js +55 -31
- package/dist/persist/persist.d.ts +119 -62
- package/dist/persist/persist.d.ts.map +1 -1
- package/dist/pool.d.ts +77 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +245 -244
- package/dist/react/stable.d.ts +27 -0
- package/dist/react/stable.d.ts.map +1 -0
- package/dist/react/useStore.d.ts +38 -13
- package/dist/react/useStore.d.ts.map +1 -1
- package/dist/react/withStore.d.ts.map +1 -1
- package/dist/storion.js +911 -37
- package/dist/trigger.d.ts +12 -7
- package/dist/trigger.d.ts.map +1 -1
- package/dist/types.d.ts +133 -22
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/storeTuple.d.ts +7 -0
- package/dist/utils/storeTuple.d.ts.map +1 -0
- package/package.json +5 -1
- package/dist/collection.d.ts +0 -34
- package/dist/collection.d.ts.map +0 -1
- package/dist/core/proxy.d.ts +0 -47
- package/dist/core/proxy.d.ts.map +0 -1
- package/dist/effect-C6h0PDDI.js +0 -446
- package/dist/isPromiseLike-bFkfHAbm.js +0 -6
- package/dist/react/useLocalStore.d.ts +0 -48
- package/dist/react/useLocalStore.d.ts.map +0 -1
package/dist/errors.d.ts
CHANGED
|
@@ -65,4 +65,10 @@ export declare class LocalStoreDependencyError extends StorionError {
|
|
|
65
65
|
export declare class EffectRefreshError extends StorionError {
|
|
66
66
|
constructor();
|
|
67
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Thrown when scoped() is called outside of a selector function.
|
|
70
|
+
*/
|
|
71
|
+
export declare class ScopedOutsideSelectorError extends StorionError {
|
|
72
|
+
constructor();
|
|
73
|
+
}
|
|
68
74
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAMD;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,YAAY;gBAE7C,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM;CAShB;AAMD;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;gBAEnD,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,WAAW,GAAG,QAAQ;CAUpC;AAMD;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAI1C;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAQnD;AAMD;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;CAOpD;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;gBACxC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAI3C;AAMD;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;gBAC7C,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;CAOvD;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;;CAKnD"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAMD;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,YAAY;gBAE7C,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM;CAShB;AAMD;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;gBAEnD,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,WAAW,GAAG,QAAQ;CAUpC;AAMD;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAI1C;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAQnD;AAMD;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;CAOpD;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;gBACxC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAI3C;AAMD;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;gBAC7C,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;CAOvD;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;;CAKnD;AAKD;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,YAAY;;CAQ3D"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,19 +3,20 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @packageDocumentation
|
|
5
5
|
*/
|
|
6
|
-
export
|
|
7
|
-
export { is
|
|
6
|
+
export * from './types';
|
|
7
|
+
export { is } from './is';
|
|
8
8
|
export { store } from './core/store';
|
|
9
9
|
export { container } from './core/container';
|
|
10
10
|
export { batch, untrack } from './core/tracking';
|
|
11
|
-
export { createResolver } from './core/createResolver';
|
|
11
|
+
export { createResolver as resolver } from './core/createResolver';
|
|
12
12
|
export { pick } from './core/pick';
|
|
13
|
+
export { list, map, toggle, increment, decrement, multiply, divide, clamp, append, prepend, merge, reset, type ListOptions, type MapOptions, type FocusList, type FocusMap, } from './core/focusHelpers';
|
|
13
14
|
export { effect, type EffectFn, type EffectContext, type EffectOptions, type EffectErrorStrategy, type EffectErrorContext, type EffectRetryConfig, } from './core/effect';
|
|
14
15
|
export { applyFor, applyExcept, forStores, type SpecPattern, type MiddlewareMap, } from './core/middleware';
|
|
15
16
|
export { equality, shallowEqual, deepEqual, strictEqual, } from './core/equality';
|
|
16
17
|
export { trigger, type TriggerOptions } from './trigger';
|
|
17
|
-
export { wrapFn as wrapFn, unwrapFn, isWrappedFn } from './core/fnWrapper';
|
|
18
18
|
export { StorionError, SetupPhaseError, LifetimeMismatchError, AsyncFunctionError, StoreDisposedError, InvalidActionError, HooksContextError, ProviderMissingError, LocalStoreDependencyError, EffectRefreshError, } from './errors';
|
|
19
19
|
export { meta } from './meta/meta';
|
|
20
20
|
export { withMeta } from './meta/withMeta';
|
|
21
|
+
export { pool } from './pool';
|
|
21
22
|
//# 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;;;;GAIG;AAGH,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAG1B,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGnE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnC,OAAO,EACL,IAAI,EACJ,GAAG,EAEH,MAAM,EACN,SAAS,EACT,SAAS,EACT,QAAQ,EACR,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,KAAK,EACL,KAAK,EAEL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,QAAQ,GACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,MAAM,EACN,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAGzD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network connectivity module.
|
|
3
|
+
*
|
|
4
|
+
* Provides platform-agnostic network state management:
|
|
5
|
+
* - `networkStore` - Reactive store with `online` state for React components
|
|
6
|
+
* - `networkService` - Provides `isOnline()`, `waitForOnline()`, and `offlineRetry()` wrapper
|
|
7
|
+
* - `onlineService` - Customizable online/offline event subscription
|
|
8
|
+
* - `pingService` - Customizable network reachability check
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { networkStore, networkService } from 'storion/network';
|
|
13
|
+
* import { abortable, retry } from 'storion/async';
|
|
14
|
+
*
|
|
15
|
+
* // React component - use store for reactive state
|
|
16
|
+
* function NetworkBanner() {
|
|
17
|
+
* const { online } = useStore(({ get }) => {
|
|
18
|
+
* const [state] = get(networkStore);
|
|
19
|
+
* return { online: state.online };
|
|
20
|
+
* });
|
|
21
|
+
* return online ? null : <div>You are offline</div>;
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* // In store setup - use service for logic
|
|
25
|
+
* setup({ get, focus }) {
|
|
26
|
+
* const network = get(networkService);
|
|
27
|
+
*
|
|
28
|
+
* const fetchUsers = abortable(async ({ signal }) => {
|
|
29
|
+
* const res = await fetch('/api/users', { signal });
|
|
30
|
+
* return res.json();
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* // Chain wrappers: retry 3 times, then wait for network
|
|
34
|
+
* const robustFetch = fetchUsers
|
|
35
|
+
* .use(retry(3))
|
|
36
|
+
* .use(network.offlineRetry());
|
|
37
|
+
*
|
|
38
|
+
* const usersQuery = async.action(focus("users"), robustFetch);
|
|
39
|
+
*
|
|
40
|
+
* return { fetchUsers: usersQuery.dispatch };
|
|
41
|
+
* }
|
|
42
|
+
*
|
|
43
|
+
* // Wait for connectivity
|
|
44
|
+
* const network = get(networkService);
|
|
45
|
+
* await network.waitForOnline();
|
|
46
|
+
* await uploadData();
|
|
47
|
+
*
|
|
48
|
+
* // Override for React Native
|
|
49
|
+
* container.set(onlineService, () => ({
|
|
50
|
+
* isOnline: () => true,
|
|
51
|
+
* subscribe: (listener) => NetInfo.addEventListener(s => listener(!!s.isConnected)),
|
|
52
|
+
* }));
|
|
53
|
+
*
|
|
54
|
+
* // Override for real connectivity check
|
|
55
|
+
* container.set(pingService, () => ({
|
|
56
|
+
* ping: async () => {
|
|
57
|
+
* try {
|
|
58
|
+
* await fetch('/api/health', { method: 'HEAD' });
|
|
59
|
+
* return true;
|
|
60
|
+
* } catch { return false; }
|
|
61
|
+
* },
|
|
62
|
+
* }));
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export { pingService, onlineService, type PingService, type OnlineService, } from './services';
|
|
66
|
+
export { networkStore } from './store';
|
|
67
|
+
export { isNetworkError } from './utils';
|
|
68
|
+
export { networkService, type NetworkService } from './retry';
|
|
69
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAGH,OAAO,EACL,WAAW,EACX,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Resolver } from '../types';
|
|
2
|
+
import { IdentityWrapper } from '../async';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Service for handling network detection and retry logic.
|
|
6
|
+
*
|
|
7
|
+
* Provides:
|
|
8
|
+
* - `isOnline()` - Check current connectivity
|
|
9
|
+
* - `subscribe()` - Listen to online/offline changes
|
|
10
|
+
* - `waitForOnline()` - Promise that resolves when online
|
|
11
|
+
* - `offlineRetry()` - Wrapper for automatic retry on reconnection
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { abortable, retry } from "storion/async";
|
|
16
|
+
* import { networkService } from "storion/network";
|
|
17
|
+
*
|
|
18
|
+
* setup({ get, focus }) {
|
|
19
|
+
* const network = get(networkService);
|
|
20
|
+
*
|
|
21
|
+
* const fetchUsers = abortable(async ({ signal }) => {
|
|
22
|
+
* const res = await fetch("/api/users", { signal });
|
|
23
|
+
* return res.json();
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* // Chain wrappers: retry 3 times, then wait for network
|
|
27
|
+
* const robustFetch = fetchUsers
|
|
28
|
+
* .use(retry(3))
|
|
29
|
+
* .use(network.offlineRetry());
|
|
30
|
+
*
|
|
31
|
+
* const usersQuery = async.action(focus("users"), robustFetch);
|
|
32
|
+
*
|
|
33
|
+
* return { fetchUsers: usersQuery.dispatch };
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare const networkService: ({ get }: Resolver) => {
|
|
38
|
+
isOnline: () => boolean;
|
|
39
|
+
subscribe: {
|
|
40
|
+
(listeners: import('..').SingleOrMultipleListeners<boolean>): VoidFunction;
|
|
41
|
+
<TValue>(map: (value: boolean) => {
|
|
42
|
+
value: TValue;
|
|
43
|
+
} | undefined, listeners: import('..').SingleOrMultipleListeners<TValue>): VoidFunction;
|
|
44
|
+
};
|
|
45
|
+
waitForOnline: () => Promise<void>;
|
|
46
|
+
offlineRetry: () => IdentityWrapper;
|
|
47
|
+
dispose: () => void;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Type of the network service instance.
|
|
51
|
+
*/
|
|
52
|
+
export type NetworkService = ReturnType<typeof networkService>;
|
|
53
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/network/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAShD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,QAAQ;oBAuCzB,OAAO;;;;;;;yBAoCF,OAAO,CAAC,IAAI,CAAC;wBAkCd,eAAe;mBAmBpB,IAAI;CAWzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Factory } from '../types';
|
|
2
|
+
|
|
3
|
+
export interface PingService {
|
|
4
|
+
/**
|
|
5
|
+
* Check if the network is reachable.
|
|
6
|
+
* Default: 300ms delay, returns true (optimistic).
|
|
7
|
+
*/
|
|
8
|
+
ping(): Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
export interface OnlineService {
|
|
11
|
+
/**
|
|
12
|
+
* Get current online status.
|
|
13
|
+
* Default: uses navigator.onLine if available.
|
|
14
|
+
*/
|
|
15
|
+
isOnline(): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Subscribe to online/offline events.
|
|
18
|
+
* Default: uses window 'online'/'offline' events.
|
|
19
|
+
*
|
|
20
|
+
* @returns Unsubscribe function
|
|
21
|
+
*/
|
|
22
|
+
subscribe(listener: (online: boolean) => void): VoidFunction;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Service for checking network reachability.
|
|
26
|
+
*
|
|
27
|
+
* Default implementation: 300ms delay, always returns true (optimistic).
|
|
28
|
+
*
|
|
29
|
+
* Override for real connectivity check:
|
|
30
|
+
* ```ts
|
|
31
|
+
* container.set(pingService, () => ({
|
|
32
|
+
* ping: async () => {
|
|
33
|
+
* try {
|
|
34
|
+
* await fetch('/api/health', { method: 'HEAD' });
|
|
35
|
+
* return true;
|
|
36
|
+
* } catch { return false; }
|
|
37
|
+
* },
|
|
38
|
+
* }));
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare const pingService: Factory<PingService>;
|
|
42
|
+
/**
|
|
43
|
+
* Service for online/offline event subscription.
|
|
44
|
+
*
|
|
45
|
+
* Default implementation: uses browser's navigator.onLine and window events.
|
|
46
|
+
*
|
|
47
|
+
* Override for React Native:
|
|
48
|
+
* ```ts
|
|
49
|
+
* import NetInfo from '@react-native-community/netinfo';
|
|
50
|
+
*
|
|
51
|
+
* container.set(onlineService, () => ({
|
|
52
|
+
* isOnline: () => true,
|
|
53
|
+
* subscribe: (listener) => NetInfo.addEventListener(s => listener(!!s.isConnected)),
|
|
54
|
+
* }));
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare const onlineService: Factory<OnlineService>;
|
|
58
|
+
//# sourceMappingURL=services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/network/services.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAOxC,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAAC;IAEpB;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,YAAY,CAAC;CAC9D;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,WAAW,EAAE,OAAO,CAAC,WAAW,CAO5C,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,aAAa,EAAE,OAAO,CAAC,aAAa,CAwBhD,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reactive network state store.
|
|
3
|
+
*
|
|
4
|
+
* This store consumes `networkService` to provide reactive state for React components.
|
|
5
|
+
* The actual logic lives in `networkService` - this store only syncs the state.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Reactive network state store.
|
|
9
|
+
*
|
|
10
|
+
* Provides reactive `state.online` for UI components.
|
|
11
|
+
* For logic (waitForOnline, offlineRetry), use `networkService` directly.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* // React component - use store for reactive state
|
|
16
|
+
* function NetworkIndicator() {
|
|
17
|
+
* const { online } = useStore(({ get }) => {
|
|
18
|
+
* const [state] = get(networkStore);
|
|
19
|
+
* return { online: state.online };
|
|
20
|
+
* });
|
|
21
|
+
* return online ? '🟢 Online' : '🔴 Offline';
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* // In store setup - use service for logic
|
|
25
|
+
* setup({ get, focus }) {
|
|
26
|
+
* const network = get(networkService);
|
|
27
|
+
* await network.waitForOnline();
|
|
28
|
+
* const robustFetch = fetchUsers.use(network.offlineRetry());
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare const networkStore: import('..').StoreSpec<{
|
|
33
|
+
/** Whether the network is currently online */
|
|
34
|
+
online: boolean;
|
|
35
|
+
}, {}>;
|
|
36
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/network/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,YAAY;IAGrB,8CAA8C;;MAoBhD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network utility functions.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check if an error is a network connectivity error.
|
|
6
|
+
* Works across Chrome, Firefox, Safari, React Native, and Apollo Client.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isNetworkError(error: unknown): boolean;
|
|
9
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/network/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAuDtD"}
|
package/dist/persist/index.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @packageDocumentation
|
|
7
7
|
*/
|
|
8
|
-
export {
|
|
8
|
+
export { persist, notPersisted, type PersistOptions, type PersistLoadResult, } from './persist';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persist/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persist/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC"}
|
package/dist/persist/index.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { m as meta } from "../meta-40r-AZfe.js";
|
|
2
|
-
|
|
2
|
+
function isPromiseLike(value) {
|
|
3
|
+
return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
|
|
4
|
+
}
|
|
3
5
|
const notPersisted = meta();
|
|
4
|
-
function
|
|
5
|
-
const { filter, fields,
|
|
6
|
+
function persist(options) {
|
|
7
|
+
const { filter, fields, handler, onError, force = false } = options;
|
|
6
8
|
return (context) => {
|
|
7
9
|
const { next, meta: meta2 } = context;
|
|
8
10
|
const instance = next();
|
|
9
|
-
|
|
11
|
+
const persistContext = {
|
|
12
|
+
...context,
|
|
13
|
+
store: instance
|
|
14
|
+
};
|
|
15
|
+
if (filter && !filter(persistContext)) {
|
|
10
16
|
return instance;
|
|
11
17
|
}
|
|
12
18
|
const notPersistedInfo = meta2(notPersisted);
|
|
@@ -18,7 +24,7 @@ function persistMiddleware(options) {
|
|
|
18
24
|
(field) => notPersistedInfo.fields[field] === true
|
|
19
25
|
)
|
|
20
26
|
);
|
|
21
|
-
const stateFields = (fields == null ? void 0 : fields(
|
|
27
|
+
const stateFields = (fields == null ? void 0 : fields(persistContext)) ?? context.spec.fields;
|
|
22
28
|
if (stateFields.length === 0) {
|
|
23
29
|
return instance;
|
|
24
30
|
}
|
|
@@ -38,44 +44,62 @@ function persistMiddleware(options) {
|
|
|
38
44
|
}
|
|
39
45
|
return filtered;
|
|
40
46
|
};
|
|
41
|
-
const
|
|
42
|
-
|
|
47
|
+
const setupPersistence = (persistHandler) => {
|
|
48
|
+
const { load, save } = persistHandler;
|
|
49
|
+
const hydrateWithState = (state) => {
|
|
50
|
+
if (state != null) {
|
|
51
|
+
try {
|
|
52
|
+
instance.hydrate(filterState(state), { force });
|
|
53
|
+
} catch (error) {
|
|
54
|
+
onError == null ? void 0 : onError(error, "load");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
if (load) {
|
|
43
59
|
try {
|
|
44
|
-
|
|
60
|
+
const loadResult = load();
|
|
61
|
+
if (loadResult) {
|
|
62
|
+
if (isPromiseLike(loadResult)) {
|
|
63
|
+
loadResult.then(
|
|
64
|
+
(state) => hydrateWithState(state),
|
|
65
|
+
(error) => onError == null ? void 0 : onError(error, "load")
|
|
66
|
+
);
|
|
67
|
+
} else {
|
|
68
|
+
hydrateWithState(loadResult);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
45
71
|
} catch (error) {
|
|
46
|
-
onError == null ? void 0 : onError(
|
|
72
|
+
onError == null ? void 0 : onError(error, "load");
|
|
47
73
|
}
|
|
48
74
|
}
|
|
75
|
+
if (save) {
|
|
76
|
+
instance.subscribe(() => {
|
|
77
|
+
try {
|
|
78
|
+
const state = instance.dehydrate();
|
|
79
|
+
save(filterState(state));
|
|
80
|
+
} catch (error) {
|
|
81
|
+
onError == null ? void 0 : onError(error, "save");
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
49
85
|
};
|
|
50
86
|
try {
|
|
51
|
-
const
|
|
52
|
-
if (
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
hydrateWithState(loadResult);
|
|
60
|
-
}
|
|
87
|
+
const handlerResult = handler(persistContext);
|
|
88
|
+
if (isPromiseLike(handlerResult)) {
|
|
89
|
+
handlerResult.then(
|
|
90
|
+
(persistHandler) => setupPersistence(persistHandler),
|
|
91
|
+
(error) => onError == null ? void 0 : onError(error, "init")
|
|
92
|
+
);
|
|
93
|
+
} else {
|
|
94
|
+
setupPersistence(handlerResult);
|
|
61
95
|
}
|
|
62
96
|
} catch (error) {
|
|
63
|
-
onError == null ? void 0 : onError(
|
|
64
|
-
}
|
|
65
|
-
if (save) {
|
|
66
|
-
instance.subscribe(() => {
|
|
67
|
-
try {
|
|
68
|
-
const state = instance.dehydrate();
|
|
69
|
-
save(context, filterState(state));
|
|
70
|
-
} catch (error) {
|
|
71
|
-
onError == null ? void 0 : onError(context, error, "save");
|
|
72
|
-
}
|
|
73
|
-
});
|
|
97
|
+
onError == null ? void 0 : onError(error, "init");
|
|
74
98
|
}
|
|
75
99
|
return instance;
|
|
76
100
|
};
|
|
77
101
|
}
|
|
78
102
|
export {
|
|
79
103
|
notPersisted,
|
|
80
|
-
|
|
104
|
+
persist
|
|
81
105
|
};
|