@omniretail/omniflags-react-native 1.0.8 → 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"}
package/dist/provider.js CHANGED
@@ -7,12 +7,18 @@ import { OmniFlagsContext } from "./context.js";
7
7
  import { AsyncStorageCache } from "./async-storage-cache.js";
8
8
  export function OmniFlagsProvider({ sdkKey, children, asyncStorage, ...rest }) {
9
9
  const provider = rest.provider;
10
- const [ready, setReady] = useState(false);
11
- const clientRef = useRef(null);
12
- if (!clientRef.current) {
13
- clientRef.current = new OmniFlagsClient({ sdkKey, provider }, new AsyncStorageCache(asyncStorage ?? AsyncStorage));
14
- }
15
- const client = clientRef.current;
10
+ const [client, setClient] = useState(() => new OmniFlagsClient({ sdkKey, provider }, new AsyncStorageCache(asyncStorage ?? AsyncStorage)));
11
+ const [ready, setReady] = useState(() => client.status !== "not_ready");
12
+ const prevSdkKeyRef = useRef(sdkKey);
13
+ useEffect(() => {
14
+ if (prevSdkKeyRef.current === sdkKey)
15
+ return;
16
+ prevSdkKeyRef.current = sdkKey;
17
+ const next = new OmniFlagsClient({ sdkKey, provider }, new AsyncStorageCache(asyncStorage ?? AsyncStorage));
18
+ setReady(next.status !== "not_ready");
19
+ setClient(next);
20
+ // eslint-disable-next-line react-hooks/exhaustive-deps
21
+ }, [sdkKey]);
16
22
  useEffect(() => {
17
23
  let mounted = true;
18
24
  client.waitForReady().then(() => {
@@ -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;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,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAyB,IAAI,CAAC,CAAC;IAEvD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACvB,SAAS,CAAC,OAAO,GAAG,IAAI,eAAe,CACrC,EAAE,MAAM,EAAE,QAAQ,EAAE,EACpB,IAAI,iBAAiB,CAAC,YAAY,IAAI,YAAY,CAAC,CACpD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;IAEjC,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.8",
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.8"
32
+ "@omniretail/omniflags-core": "^1.0.10"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@testing-library/react": "^16.0.0",