@omniretail/omniflags-react-native 1.0.9 → 1.0.10

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.
@@ -9,6 +9,8 @@ export type ReactNativeAsyncStorage = typeof AsyncStorage;
9
9
  export declare class AsyncStorageCache implements CacheAdapter {
10
10
  private storage;
11
11
  constructor(storage: AsyncStorageLike);
12
+ /** Synchronous read from in-memory cache — available after first load. */
13
+ getSync(key: string): string | null;
12
14
  get(key: string): Promise<string | null>;
13
15
  set(key: string, value: string): Promise<void>;
14
16
  remove(key: string): Promise<void>;
@@ -3,20 +3,37 @@
3
3
  * Uses @react-native-async-storage/async-storage under the hood.
4
4
  */
5
5
  const PREFIX = "omniflags:snapshot:";
6
+ /**
7
+ * Module-level memory cache — survives component unmount/remount within the
8
+ * same JS session. Populated on first AsyncStorage read or write, allowing
9
+ * the OmniFlagsClient constructor to seed synchronously via getSync().
10
+ */
11
+ const memoryCache = new Map();
6
12
  export class AsyncStorageCache {
7
13
  storage;
8
14
  constructor(storage) {
9
15
  this.storage = storage;
10
16
  }
17
+ /** Synchronous read from in-memory cache — available after first load. */
18
+ getSync(key) {
19
+ return memoryCache.get(PREFIX + key) ?? null;
20
+ }
11
21
  async get(key) {
22
+ const inMemory = memoryCache.get(PREFIX + key);
23
+ if (inMemory !== undefined)
24
+ return inMemory;
12
25
  try {
13
- return await this.storage.getItem(PREFIX + key);
26
+ const raw = await this.storage.getItem(PREFIX + key);
27
+ if (raw !== null)
28
+ memoryCache.set(PREFIX + key, raw);
29
+ return raw;
14
30
  }
15
31
  catch {
16
32
  return null;
17
33
  }
18
34
  }
19
35
  async set(key, value) {
36
+ memoryCache.set(PREFIX + key, value);
20
37
  try {
21
38
  await this.storage.setItem(PREFIX + key, value);
22
39
  }
@@ -25,6 +42,7 @@ export class AsyncStorageCache {
25
42
  }
26
43
  }
27
44
  async remove(key) {
45
+ memoryCache.delete(PREFIX + key);
28
46
  try {
29
47
  await this.storage.removeItem(PREFIX + key);
30
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"async-storage-cache.js","sourceRoot":"","sources":["../src/async-storage-cache.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,MAAM,GAAG,qBAAqB,CAAC;AAUrC,MAAM,OAAO,iBAAiB;IACpB,OAAO,CAAmB;IAElC,YAAY,OAAyB;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"async-storage-cache.js","sourceRoot":"","sources":["../src/async-storage-cache.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,MAAM,GAAG,qBAAqB,CAAC;AAErC;;;;GAIG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;AAU9C,MAAM,OAAO,iBAAiB;IACpB,OAAO,CAAmB;IAElC,YAAY,OAAyB;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,0EAA0E;IAC1E,OAAO,CAAC,GAAW;QACjB,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAC/C,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;YACrD,IAAI,GAAG,KAAK,IAAI;gBAAE,WAAW,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;YACrD,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,WAAW,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;CACF"}
@@ -1,21 +1,9 @@
1
1
  import React, { type ReactNode } from "react";
2
- import type { FlagSnapshot } from "@omniretail/omniflags-core";
3
2
  import { type ReactNativeAsyncStorage } from "./async-storage-cache.js";
4
3
  export interface OmniFlagsProviderProps {
5
4
  sdkKey: string;
6
5
  children?: ReactNode;
7
6
  /** Optional override for AsyncStorage implementation (tests/custom runtimes). */
8
7
  asyncStorage?: ReactNativeAsyncStorage;
9
- /**
10
- * Pre-loaded snapshot to seed the client synchronously, avoiding a loading
11
- * flash on cold start. Read from AsyncStorage before mounting the provider:
12
- *
13
- * ```ts
14
- * const raw = await AsyncStorage.getItem(`omniflags:snapshot:${sdkKey}`);
15
- * const initialSnapshot = raw ? JSON.parse(raw) : undefined;
16
- * <OmniFlagsProvider sdkKey={sdkKey} initialSnapshot={initialSnapshot} />
17
- * ```
18
- */
19
- initialSnapshot?: FlagSnapshot;
20
8
  }
21
- export declare function OmniFlagsProvider({ sdkKey, children, asyncStorage, initialSnapshot, ...rest }: OmniFlagsProviderProps): React.FunctionComponentElement<React.ProviderProps<import("./context.js").OmniFlagsContextValue | null>>;
9
+ export declare function OmniFlagsProvider({ sdkKey, children, asyncStorage, ...rest }: OmniFlagsProviderProps): React.FunctionComponentElement<React.ProviderProps<import("./context.js").OmniFlagsContextValue | null>>;
package/dist/provider.js CHANGED
@@ -5,11 +5,9 @@ import AsyncStorage from "@react-native-async-storage/async-storage";
5
5
  import { OmniFlagsClient } from "@omniretail/omniflags-core";
6
6
  import { OmniFlagsContext } from "./context.js";
7
7
  import { AsyncStorageCache } from "./async-storage-cache.js";
8
- export function OmniFlagsProvider({ sdkKey, children, asyncStorage, initialSnapshot, ...rest }) {
8
+ export function OmniFlagsProvider({ sdkKey, children, asyncStorage, ...rest }) {
9
9
  const provider = rest.provider;
10
- const [client, setClient] = useState(() => new OmniFlagsClient(
11
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
- { sdkKey, provider, initialSnapshot }, new AsyncStorageCache(asyncStorage ?? AsyncStorage)));
10
+ const [client, setClient] = useState(() => new OmniFlagsClient({ sdkKey, provider }, new AsyncStorageCache(asyncStorage ?? AsyncStorage)));
13
11
  const [ready, setReady] = useState(() => client.status !== "not_ready");
14
12
  const prevSdkKeyRef = useRef(sdkKey);
15
13
  useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,YAAY,MAAM,2CAA2C,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAgC,MAAM,0BAA0B,CAAC;AAyB3F,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,GAAG,IAAI,EACgB;IACvB,MAAM,QAAQ,GAAI,IAAsB,CAAC,QAAQ,CAAC;IAClD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,eAAe;IAC5D,8DAA8D;IAC9D,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAS,EAC5C,IAAI,iBAAiB,CAAC,YAAY,IAAI,YAAY,CAAC,CACpD,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,aAAa,CAAC,OAAO,KAAK,MAAM;YAAE,OAAO;QAC7C,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,eAAe,CAC9B,EAAE,MAAM,EAAE,QAAQ,EAAE,EACpB,IAAI,iBAAiB,CAAC,YAAY,IAAI,YAAY,CAAC,CACpD,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QACtC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,uDAAuD;IACvD,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,MAAM,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC9B,IAAI,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;YAChB,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE;YACrE,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,KAAK,CAAC,aAAa,CACxB,gBAAgB,CAAC,QAAQ,EACzB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAC5B,QAAQ,CACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,YAAY,MAAM,2CAA2C,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAgC,MAAM,0BAA0B,CAAC;AAc3F,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,GAAG,IAAI,EACgB;IACvB,MAAM,QAAQ,GAAI,IAAsB,CAAC,QAAQ,CAAC;IAClD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,eAAe,CAC5D,EAAE,MAAM,EAAE,QAAQ,EAAE,EACpB,IAAI,iBAAiB,CAAC,YAAY,IAAI,YAAY,CAAC,CACpD,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,aAAa,CAAC,OAAO,KAAK,MAAM;YAAE,OAAO;QAC7C,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,eAAe,CAC9B,EAAE,MAAM,EAAE,QAAQ,EAAE,EACpB,IAAI,iBAAiB,CAAC,YAAY,IAAI,YAAY,CAAC,CACpD,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QACtC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,uDAAuD;IACvD,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,MAAM,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC9B,IAAI,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;YAChB,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE;YACrE,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,KAAK,CAAC,aAAa,CACxB,gBAAgB,CAAC,QAAQ,EACzB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAC5B,QAAQ,CACT,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omniretail/omniflags-react-native",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "OmniFlags React Native SDK — provider + hooks with built-in AsyncStorage offline cache",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -29,7 +29,7 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@omniretail/omniflags-core": "^1.0.9"
32
+ "@omniretail/omniflags-core": "^1.0.10"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@testing-library/react": "^16.0.0",