@launchdarkly/js-client-sdk-common 1.25.0 → 1.26.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.
@@ -5,7 +5,10 @@ import { Platform } from '@launchdarkly/js-sdk-common';
5
5
  * @param storageKey keyed storage location where the generated key should live. See {@link namespaceForGeneratedContextKey}
6
6
  * for related exmaples of generating a storage key and usage.
7
7
  * @param platform crypto and storage implementations for necessary operations
8
+ * @param legacyStorageKey optional legacy storage key to migrate from. If the key is not found
9
+ * under {@link storageKey} but exists under this legacy key, it will be migrated to the new
10
+ * location and the legacy key will be cleared.
8
11
  * @returns the generated key
9
12
  */
10
- export declare const getOrGenerateKey: (storageKey: string, { crypto, storage }: Platform) => Promise<string>;
13
+ export declare const getOrGenerateKey: (storageKey: string, { crypto, storage }: Platform, legacyStorageKey?: string) => Promise<string>;
11
14
  //# sourceMappingURL=getOrGenerateKey.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getOrGenerateKey.d.ts","sourceRoot":"","sources":["../../src/storage/getOrGenerateKey.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAKvD;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,eAAsB,MAAM,uBAAuB,QAAQ,oBASvF,CAAC"}
1
+ {"version":3,"file":"getOrGenerateKey.d.ts","sourceRoot":"","sources":["../../src/storage/getOrGenerateKey.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAKvD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,eACf,MAAM,uBACG,QAAQ,qBACV,MAAM,oBAuB1B,CAAC"}
@@ -6,12 +6,9 @@ export declare function concatNamespacesAndValues(parts: {
6
6
  }[]): Promise<string>;
7
7
  export declare function namespaceForEnvironment(crypto: Crypto, sdkKey: string): Promise<string>;
8
8
  /**
9
- * @deprecated prefer {@link namespaceForGeneratedContextKey}. At one time we only generated keys for
10
- * anonymous contexts and they were namespaced in LaunchDarkly_AnonymousKeys. Eventually we started
11
- * generating context keys for non-anonymous contexts such as for the Auto Environment Attributes
12
- * feature and those were namespaced in LaunchDarkly_ContextKeys. This function can be removed
13
- * when the data under the LaunchDarkly_AnonymousKeys namespace is merged with data under the
14
- * LaunchDarkly_ContextKeys namespace.
9
+ * @deprecated Used only for migration in ensureKey. Data stored under LaunchDarkly_AnonymousKeys
10
+ * is now migrated to LaunchDarkly_ContextKeys on first access. This function can be removed once
11
+ * all clients have had the chance to run the migration.
15
12
  */
16
13
  export declare function namespaceForAnonymousGeneratedContextKey(kind: string): Promise<string>;
17
14
  export declare function namespaceForGeneratedContextKey(kind: string): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"namespaceUtils.d.ts","sourceRoot":"","sources":["../../src/storage/namespaceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAI9D,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,eAAe,GAAG,aAAa,GAAG,cAAc,CAAC;AAW1F,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE;IAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAAC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,EAAE,GACpF,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7F;AAED;;;;;;;GAOG;AACH,wBAAsB,wCAAwC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM5F;AAED,wBAAsB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnF;AAED,wBAAsB,wBAAwB,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK5F;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,MAAM,EAC5B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,CAKjB"}
1
+ {"version":3,"file":"namespaceUtils.d.ts","sourceRoot":"","sources":["../../src/storage/namespaceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAI9D,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,eAAe,GAAG,aAAa,GAAG,cAAc,CAAC;AAW1F,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE;IAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAAC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,EAAE,GACpF,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7F;AAED;;;;GAIG;AACH,wBAAsB,wCAAwC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM5F;AAED,wBAAsB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnF;AAED,wBAAsB,wBAAwB,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK5F;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,MAAM,EAC5B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,CAKjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ensureKey.d.ts","sourceRoot":"","sources":["../../src/context/ensureKey.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,QAAQ,EACT,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAgDnE;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,YACX,SAAS,YACR,QAAQ,KACjB,QAAQ,eAAe,CAgBzB,CAAC"}
1
+ {"version":3,"file":"ensureKey.d.ts","sourceRoot":"","sources":["../../src/context/ensureKey.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,QAAQ,EACT,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAoDnE;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,YACX,SAAS,YACR,QAAQ,KACjB,QAAQ,eAAe,CAgBzB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"FDv2DataManagerBase.d.ts","sourceRoot":"","sources":["../../src/datasource/FDv2DataManagerBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,SAAS,EACT,QAAQ,EAET,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,kBAAkB,EAElB,mBAAmB,EAEpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,mBAAmB,EAAiB,MAAM,aAAa,CAAC;AAQjE,OAAO,EAAwB,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAEL,cAAc,EACd,YAAY,EAGb,MAAM,wBAAwB,CAAC;AAIhC;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,SAAS,CAAC;IACvB,OAAO,EAAE,SAAS,CAAC;IAEnB,+CAA+C;IAC/C,eAAe,EAAE,mBAAmB,CAAC;IACrC,8FAA8F;IAC9F,cAAc,EAAE,kBAAkB,CAAC;IACnC,8CAA8C;IAC9C,cAAc,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC/C,+DAA+D;IAC/D,SAAS,EAAE,SAAS,CAAC;IACrB,gFAAgF;IAChF,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,eAAe,CAAC,EAAE,iBAAiB,KAAK;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAE5F;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAEpC,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,WAAW;IACzD,+DAA+D;IAC/D,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3C,iEAAiE;IACjE,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/C;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnD,kDAAkD;IAClD,cAAc,IAAI,kBAAkB,CAAC;IACrC,+EAA+E;IAC/E,QAAQ,CAAC,wBAAwB,EAAE,kBAAkB,CAAC;IACtD;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,yBAAyB,GACpC,sBAAsB,CA4fxB"}
1
+ {"version":3,"file":"FDv2DataManagerBase.d.ts","sourceRoot":"","sources":["../../src/datasource/FDv2DataManagerBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,SAAS,EACT,QAAQ,EAET,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,kBAAkB,EAElB,mBAAmB,EAEpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,mBAAmB,EAAiB,MAAM,aAAa,CAAC;AAQjE,OAAO,EAAwB,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAEL,cAAc,EACd,YAAY,EAGb,MAAM,wBAAwB,CAAC;AAIhC;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,SAAS,CAAC;IACvB,OAAO,EAAE,SAAS,CAAC;IAEnB,+CAA+C;IAC/C,eAAe,EAAE,mBAAmB,CAAC;IACrC,8FAA8F;IAC9F,cAAc,EAAE,kBAAkB,CAAC;IACnC,8CAA8C;IAC9C,cAAc,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC/C,+DAA+D;IAC/D,SAAS,EAAE,SAAS,CAAC;IACrB,gFAAgF;IAChF,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,eAAe,CAAC,EAAE,iBAAiB,KAAK;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAE5F;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAEpC,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,WAAW;IACzD,+DAA+D;IAC/D,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3C,iEAAiE;IACjE,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/C;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnD,kDAAkD;IAClD,cAAc,IAAI,kBAAkB,CAAC;IACrC,+EAA+E;IAC/E,QAAQ,CAAC,wBAAwB,EAAE,kBAAkB,CAAC;IACtD;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,yBAAyB,GACpC,sBAAsB,CAkhBxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"SourceFactoryProvider.d.ts","sourceRoot":"","sources":["../../src/datasource/SourceFactoryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,MAAM,EACN,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,OAAO,EACR,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAkB,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAqB,MAAM,sBAAsB,CAAC;AAIxE,OAAO,EAA0B,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKpG;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,SAAS,EAAE,aAAa,CAAC;IACzB,oCAAoC;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,qCAAqC;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,sCAAsC;IACtC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,4BAA4B;IAC5B,WAAW,EAAE,SAAS,CAAC;IACvB,oEAAoE;IACpE,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,0CAA0C;IAC1C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc;IACd,MAAM,EAAE,QAAQ,CAAC;IAEjB,sCAAsC;IACtC,OAAO,EAAE;QACP,kCAAkC;QAClC,KAAK,EAAE,eAAe,CAAC;QACvB,wCAAwC;QACxC,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IAEF,wCAAwC;IACxC,SAAS,EAAE;QACT,oCAAoC;QACpC,KAAK,EAAE,eAAe,CAAC;QACvB,kDAAkD;QAClD,4BAA4B,EAAE,MAAM,CAAC;KACtC,CAAC;IAGF,gDAAgD;IAChD,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,wBAAwB,CACtB,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,oBAAoB,GACxB,kBAAkB,GAAG,SAAS,CAAC;IAElC;;;OAGG;IACH,sBAAsB,CACpB,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,oBAAoB,GACxB,gBAAgB,GAAG,SAAS,CAAC;CACjC;AAkFD;;;GAGG;AACH,wBAAgB,kCAAkC,IAAI,qBAAqB,CAuD1E"}
1
+ {"version":3,"file":"SourceFactoryProvider.d.ts","sourceRoot":"","sources":["../../src/datasource/SourceFactoryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,MAAM,EACN,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,OAAO,EACR,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAkB,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAqB,MAAM,sBAAsB,CAAC;AAIxE,OAAO,EAA0B,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKpG;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,SAAS,EAAE,aAAa,CAAC;IACzB,oCAAoC;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,qCAAqC;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,sCAAsC;IACtC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,4BAA4B;IAC5B,WAAW,EAAE,SAAS,CAAC;IACvB,oEAAoE;IACpE,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,0CAA0C;IAC1C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc;IACd,MAAM,EAAE,QAAQ,CAAC;IAEjB,sCAAsC;IACtC,OAAO,EAAE;QACP,kCAAkC;QAClC,KAAK,EAAE,eAAe,CAAC;QACvB,wCAAwC;QACxC,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IAEF,wCAAwC;IACxC,SAAS,EAAE;QACT,oCAAoC;QACpC,KAAK,EAAE,eAAe,CAAC;QACvB,kDAAkD;QAClD,4BAA4B,EAAE,MAAM,CAAC;KACtC,CAAC;IAGF,gDAAgD;IAChD,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,wBAAwB,CACtB,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,oBAAoB,GACxB,kBAAkB,GAAG,SAAS,CAAC;IAElC;;;OAGG;IACH,sBAAsB,CACpB,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,oBAAoB,GACxB,gBAAgB,GAAG,SAAS,CAAC;CACjC;AAkFD;;;GAGG;AACH,wBAAgB,kCAAkC,IAAI,qBAAqB,CAwD1E"}
@@ -1 +1 @@
1
- {"version":3,"file":"FDv2DataSource.d.ts","sourceRoot":"","sources":["../../../src/datasource/fdv2/FDv2DataSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AASrE,OAAO,EAAuB,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE5F;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,oBAAoB,EAAE,kBAAkB,EAAE,CAAC;IAE3C,qDAAqD;IACrD,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAEtC,2DAA2D;IAC3D,YAAY,EAAE,YAAY,CAAC;IAE3B,kEAAkE;IAClE,aAAa,EAAE,uBAAuB,CAAC;IAEvC;;;;OAIG;IACH,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAEzC,uBAAuB;IACvB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAElB,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,wDAAwD;IACxD,KAAK,IAAI,IAAI,CAAC;CACf;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CA8QjF"}
1
+ {"version":3,"file":"FDv2DataSource.d.ts","sourceRoot":"","sources":["../../../src/datasource/fdv2/FDv2DataSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AASrE,OAAO,EAAuB,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE5F;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,oBAAoB,EAAE,kBAAkB,EAAE,CAAC;IAE3C,qDAAqD;IACrD,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAEtC,2DAA2D;IAC3D,YAAY,EAAE,YAAY,CAAC;IAE3B,kEAAkE;IAClE,aAAa,EAAE,uBAAuB,CAAC;IAEvC;;;;OAIG;IACH,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAEzC,uBAAuB;IACvB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAElB,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,wDAAwD;IACxD,KAAK,IAAI,IAAI,CAAC;CACf;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAqTjF"}
@@ -1,19 +1,37 @@
1
1
  import { Initializer } from './Initializer';
2
2
  import { Synchronizer } from './Synchronizer';
3
3
  /**
4
- * Factory function that creates an {@link Initializer} instance.
5
- *
6
- * @param selectorGetter Returns the current selector (basis) string, or
7
- * `undefined` if no selector is available.
4
+ * Factory that creates an {@link Initializer} instance and carries optional
5
+ * metadata about the kind of initializer it produces.
8
6
  */
9
- export type InitializerFactory = (selectorGetter: () => string | undefined) => Initializer;
7
+ export interface InitializerFactory {
8
+ /**
9
+ * Create an {@link Initializer} instance.
10
+ *
11
+ * @param selectorGetter Returns the current selector (basis) string, or
12
+ * `undefined` if no selector is available.
13
+ */
14
+ create(selectorGetter: () => string | undefined): Initializer;
15
+ /**
16
+ * True if this factory produces a cache initializer. Used by the data
17
+ * source orchestrator to distinguish cache-only data systems (where a
18
+ * cache miss should still complete initialization) from general
19
+ * initializer chains.
20
+ */
21
+ readonly isCache?: boolean;
22
+ }
10
23
  /**
11
- * Factory function that creates a {@link Synchronizer} instance.
12
- *
13
- * @param selectorGetter Returns the current selector (basis) string, or
14
- * `undefined` if no selector is available.
24
+ * Factory that creates a {@link Synchronizer} instance.
15
25
  */
16
- export type SynchronizerFactory = (selectorGetter: () => string | undefined) => Synchronizer;
26
+ export interface SynchronizerFactory {
27
+ /**
28
+ * Create a {@link Synchronizer} instance.
29
+ *
30
+ * @param selectorGetter Returns the current selector (basis) string, or
31
+ * `undefined` if no selector is available.
32
+ */
33
+ create(selectorGetter: () => string | undefined): Synchronizer;
34
+ }
17
35
  /**
18
36
  * State of a synchronizer slot.
19
37
  * - `'available'`: can be selected for use.
@@ -1 +1 @@
1
- {"version":3,"file":"SourceManager.d.ts","sourceRoot":"","sources":["../../../src/datasource/fdv2/SourceManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS,KAAK,WAAW,CAAC;AAE3F;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS,KAAK,YAAY,CAAC;AAE7F;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,SAAS,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,KAAK,EAAE,qBAAqB,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE;IACR,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC,GACA,gBAAgB,CAIlB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,8BAA8B,IAAI,WAAW,GAAG,SAAS,CAAC;IAE1D;;;;OAIG;IACH,wCAAwC,IAAI,YAAY,GAAG,SAAS,CAAC;IAErE,6EAA6E;IAC7E,wBAAwB,IAAI,IAAI,CAAC;IAEjC,qFAAqF;IACrF,gBAAgB,IAAI,IAAI,CAAC;IAEzB,uEAAuE;IACvE,YAAY,IAAI,IAAI,CAAC;IAErB,yEAAyE;IACzE,mBAAmB,IAAI,OAAO,CAAC;IAE/B,qDAAqD;IACrD,6BAA6B,IAAI,MAAM,CAAC;IAExC,mEAAmE;IACnE,eAAe,IAAI,OAAO,CAAC;IAE3B,iEAAiE;IACjE,KAAK,IAAI,IAAI,CAAC;IAEd,6CAA6C;IAC7C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,oBAAoB,EAAE,kBAAkB,EAAE,EAC1C,iBAAiB,EAAE,gBAAgB,EAAE,EACrC,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS,GACvC,aAAa,CAsGf"}
1
+ {"version":3,"file":"SourceManager.d.ts","sourceRoot":"","sources":["../../../src/datasource/fdv2/SourceManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,MAAM,CAAC,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IAE9D;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,MAAM,CAAC,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;CAChE;AAED;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,SAAS,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,KAAK,EAAE,qBAAqB,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE;IACR,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC,GACA,gBAAgB,CAIlB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,8BAA8B,IAAI,WAAW,GAAG,SAAS,CAAC;IAE1D;;;;OAIG;IACH,wCAAwC,IAAI,YAAY,GAAG,SAAS,CAAC;IAErE,6EAA6E;IAC7E,wBAAwB,IAAI,IAAI,CAAC;IAEjC,qFAAqF;IACrF,gBAAgB,IAAI,IAAI,CAAC;IAEzB,uEAAuE;IACvE,YAAY,IAAI,IAAI,CAAC;IAErB,yEAAyE;IACzE,mBAAmB,IAAI,OAAO,CAAC;IAE/B,qDAAqD;IACrD,6BAA6B,IAAI,MAAM,CAAC;IAExC,mEAAmE;IACnE,eAAe,IAAI,OAAO,CAAC;IAE3B,iEAAiE;IACjE,KAAK,IAAI,IAAI,CAAC;IAEd,6CAA6C;IAC7C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,oBAAoB,EAAE,kBAAkB,EAAE,EAC1C,iBAAiB,EAAE,gBAAgB,EAAE,EACrC,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS,GACvC,aAAa,CAsGf"}
@@ -680,13 +680,28 @@ async function digest(hasher, encoding) {
680
680
  * @param storageKey keyed storage location where the generated key should live. See {@link namespaceForGeneratedContextKey}
681
681
  * for related exmaples of generating a storage key and usage.
682
682
  * @param platform crypto and storage implementations for necessary operations
683
+ * @param legacyStorageKey optional legacy storage key to migrate from. If the key is not found
684
+ * under {@link storageKey} but exists under this legacy key, it will be migrated to the new
685
+ * location and the legacy key will be cleared.
683
686
  * @returns the generated key
684
687
  */
685
- const getOrGenerateKey = async (storageKey, { crypto, storage }) => {
688
+ const getOrGenerateKey = async (storageKey, { crypto, storage }, legacyStorageKey) => {
686
689
  let generatedKey = await storage?.get(storageKey);
687
- if (!generatedKey) {
688
- generatedKey = crypto.randomUUID();
689
- await storage?.set(storageKey, generatedKey);
690
+ if (generatedKey == null) {
691
+ if (legacyStorageKey) {
692
+ generatedKey = await storage?.get(legacyStorageKey);
693
+ if (generatedKey != null) {
694
+ await storage?.set(storageKey, generatedKey);
695
+ const verified = await storage?.get(storageKey);
696
+ if (verified != null) {
697
+ await storage?.clear(legacyStorageKey);
698
+ }
699
+ }
700
+ }
701
+ if (generatedKey == null) {
702
+ generatedKey = crypto.randomUUID();
703
+ await storage?.set(storageKey, generatedKey);
704
+ }
690
705
  }
691
706
  return generatedKey;
692
707
  };
@@ -709,12 +724,9 @@ async function namespaceForEnvironment(crypto, sdkKey) {
709
724
  ]);
710
725
  }
711
726
  /**
712
- * @deprecated prefer {@link namespaceForGeneratedContextKey}. At one time we only generated keys for
713
- * anonymous contexts and they were namespaced in LaunchDarkly_AnonymousKeys. Eventually we started
714
- * generating context keys for non-anonymous contexts such as for the Auto Environment Attributes
715
- * feature and those were namespaced in LaunchDarkly_ContextKeys. This function can be removed
716
- * when the data under the LaunchDarkly_AnonymousKeys namespace is merged with data under the
717
- * LaunchDarkly_ContextKeys namespace.
727
+ * @deprecated Used only for migration in ensureKey. Data stored under LaunchDarkly_AnonymousKeys
728
+ * is now migrated to LaunchDarkly_ContextKeys on first access. This function can be removed once
729
+ * all clients have had the chance to run the migration.
718
730
  */
719
731
  async function namespaceForAnonymousGeneratedContextKey(kind) {
720
732
  return concatNamespacesAndValues([
@@ -897,10 +909,11 @@ const { isLegacyUser, isMultiKind, isSingleKind } = internal;
897
909
  const ensureKeyCommon = async (kind, c, platform) => {
898
910
  const { anonymous, key } = c;
899
911
  if (anonymous && !key) {
900
- const storageKey = await namespaceForAnonymousGeneratedContextKey(kind);
912
+ const storageKey = await namespaceForGeneratedContextKey(kind);
913
+ const legacyStorageKey = await namespaceForAnonymousGeneratedContextKey(kind);
901
914
  // This mutates a cloned copy of the original context from ensureyKey so this is safe.
902
915
  // eslint-disable-next-line no-param-reassign
903
- c.key = await getOrGenerateKey(storageKey, platform);
916
+ c.key = await getOrGenerateKey(storageKey, platform, legacyStorageKey);
904
917
  }
905
918
  };
906
919
  const ensureKeySingle = async (c, platform) => {
@@ -3287,21 +3300,24 @@ async function loadFromCache(config) {
3287
3300
  * @internal
3288
3301
  */
3289
3302
  function createCacheInitializerFactory(config) {
3290
- // The selectorGetter is ignored — cache data has no selector.
3291
- return (_selectorGetter) => {
3292
- let shutdownResolve;
3293
- const shutdownPromise = new Promise((resolve) => {
3294
- shutdownResolve = resolve;
3295
- });
3296
- return {
3297
- async run() {
3298
- return Promise.race([shutdownPromise, loadFromCache(config)]);
3299
- },
3300
- close() {
3301
- shutdownResolve?.(shutdown());
3302
- shutdownResolve = undefined;
3303
- },
3304
- };
3303
+ return {
3304
+ isCache: true,
3305
+ // The selectorGetter is ignored -- cache data has no selector.
3306
+ create(_selectorGetter) {
3307
+ let shutdownResolve;
3308
+ const shutdownPromise = new Promise((resolve) => {
3309
+ shutdownResolve = resolve;
3310
+ });
3311
+ return {
3312
+ async run() {
3313
+ return Promise.race([shutdownPromise, loadFromCache(config)]);
3314
+ },
3315
+ close() {
3316
+ shutdownResolve?.(shutdown());
3317
+ shutdownResolve = undefined;
3318
+ },
3319
+ };
3320
+ },
3305
3321
  };
3306
3322
  }
3307
3323
 
@@ -3769,7 +3785,7 @@ function createSourceManager(initializerFactories, synchronizerSlots, selectorGe
3769
3785
  return undefined;
3770
3786
  }
3771
3787
  closeActiveSource();
3772
- const initializer = initializerFactories[initializerIndex](selectorGetter);
3788
+ const initializer = initializerFactories[initializerIndex].create(selectorGetter);
3773
3789
  activeSource = initializer;
3774
3790
  return initializer;
3775
3791
  },
@@ -3789,7 +3805,7 @@ function createSourceManager(initializerFactories, synchronizerSlots, selectorGe
3789
3805
  const candidate = synchronizerSlots[synchronizerIndex];
3790
3806
  if (candidate.state === 'available') {
3791
3807
  closeActiveSource();
3792
- const synchronizer = candidate.factory(selectorGetter);
3808
+ const synchronizer = candidate.factory.create(selectorGetter);
3793
3809
  activeSource = synchronizer;
3794
3810
  return synchronizer;
3795
3811
  }
@@ -4179,10 +4195,14 @@ function createDefaultSourceFactoryProvider() {
4179
4195
  switch (entry.type) {
4180
4196
  case 'polling': {
4181
4197
  const requestor = resolvePollingRequestor(ctx, entry.endpoints);
4182
- return (sg) => createPollingInitializer(requestor, ctx.logger, sg);
4198
+ return {
4199
+ create: (sg) => createPollingInitializer(requestor, ctx.logger, sg),
4200
+ };
4183
4201
  }
4184
4202
  case 'streaming':
4185
- return (sg) => createStreamingInitializer(buildStreamingBase(entry, ctx, sg));
4203
+ return {
4204
+ create: (sg) => createStreamingInitializer(buildStreamingBase(entry, ctx, sg)),
4205
+ };
4186
4206
  case 'cache':
4187
4207
  return createCacheInitializerFactory({
4188
4208
  storage: ctx.storage,
@@ -4200,13 +4220,14 @@ function createDefaultSourceFactoryProvider() {
4200
4220
  case 'polling': {
4201
4221
  const intervalMs = (entry.pollInterval ?? ctx.polling.intervalSeconds) * 1000;
4202
4222
  const requestor = resolvePollingRequestor(ctx, entry.endpoints);
4203
- const factory = (sg) => createPollingSynchronizer(requestor, ctx.logger, sg, intervalMs);
4204
- return createSynchronizerSlot(factory);
4205
- }
4206
- case 'streaming': {
4207
- const factory = (sg) => createStreamingSynchronizer(buildStreamingBase(entry, ctx, sg));
4208
- return createSynchronizerSlot(factory);
4223
+ return createSynchronizerSlot({
4224
+ create: (sg) => createPollingSynchronizer(requestor, ctx.logger, sg, intervalMs),
4225
+ });
4209
4226
  }
4227
+ case 'streaming':
4228
+ return createSynchronizerSlot({
4229
+ create: (sg) => createStreamingSynchronizer(buildStreamingBase(entry, ctx, sg)),
4230
+ });
4210
4231
  default:
4211
4232
  return undefined;
4212
4233
  }
@@ -4477,6 +4498,15 @@ function createFDv2DataSource(config) {
4477
4498
  let dataReceived = false;
4478
4499
  let initResolve;
4479
4500
  let initReject;
4501
+ // When every initializer is a cache initializer and there are no
4502
+ // synchronizers, the cache is the only possible data source. A cache miss
4503
+ // in that configuration must not fail initialization -- there is nowhere
4504
+ // else for data to come from, and reporting an error would be meaningless.
4505
+ // Mirrors the Android SDK's InitializerFromCache / hasAvailableSources
4506
+ // behavior.
4507
+ const cacheOnlyDataSystem = initializerFactories.length > 0 &&
4508
+ initializerFactories.every((f) => f.isCache === true) &&
4509
+ synchronizerSlots.length === 0;
4480
4510
  const sourceManager = createSourceManager(initializerFactories, synchronizerSlots, selectorGetter);
4481
4511
  function markInitialized() {
4482
4512
  if (!initialized) {
@@ -4506,6 +4536,10 @@ function createFDv2DataSource(config) {
4506
4536
  // The orchestration loops intentionally use await-in-loop for sequential
4507
4537
  // state machine processing — one result at a time.
4508
4538
  async function runInitializers() {
4539
+ // Tracks whether any initializer reported interrupted/terminal_error.
4540
+ // Used below so the cache-only exhaustion branch does not overwrite
4541
+ // that error status with VALID.
4542
+ let errorReportedDuringInit = false;
4509
4543
  while (!closed) {
4510
4544
  const initializer = sourceManager.getNextInitializerAndSetActive();
4511
4545
  if (initializer === undefined) {
@@ -4538,6 +4572,7 @@ function createFDv2DataSource(config) {
4538
4572
  case 'terminal_error':
4539
4573
  logger?.warn(`Initializer failed: ${result.errorInfo?.message ?? 'unknown error'}`);
4540
4574
  reportStatusError(result);
4575
+ errorReportedDuringInit = true;
4541
4576
  break;
4542
4577
  case 'shutdown':
4543
4578
  return;
@@ -4545,8 +4580,30 @@ function createFDv2DataSource(config) {
4545
4580
  handleFdv1Fallback(result);
4546
4581
  }
4547
4582
  }
4583
+ // close() between the last loop iteration and the exhaustion branch.
4584
+ // Exit without marking initialized or emitting a spurious VALID; the
4585
+ // start() promise will be rejected by the post-orchestration handler
4586
+ // with "closed before initialization completed."
4587
+ if (closed) {
4588
+ return;
4589
+ }
4548
4590
  // All initializers exhausted.
4549
- if (dataReceived) {
4591
+ if (cacheOnlyDataSystem) {
4592
+ // Cache-only data system with no synchronizer to produce a VALID
4593
+ // status on its own. On a cache miss with no errors, nothing else
4594
+ // has asserted VALID yet, so do it here. Skip the update if:
4595
+ // - dataReceived (cache hit): applyChangeSet already asserted VALID.
4596
+ // - errorReportedDuringInit: reportError set an error status that
4597
+ // must not be silently overwritten.
4598
+ if (!dataReceived && !errorReportedDuringInit) {
4599
+ statusManager.requestStateUpdate('VALID');
4600
+ }
4601
+ markInitialized();
4602
+ }
4603
+ else if (dataReceived) {
4604
+ // At least one initializer delivered data. Do not overwrite any
4605
+ // error status that a subsequent failed initializer may have
4606
+ // reported -- the status will be driven by the synchronizers.
4550
4607
  markInitialized();
4551
4608
  }
4552
4609
  }
@@ -4777,6 +4834,13 @@ function createFDv2DataManagerBase(baseConfig) {
4777
4834
  let bootstrapped = false;
4778
4835
  let closed = false;
4779
4836
  let flushCallback;
4837
+ /**
4838
+ * The minimum data availability required before the identify promise
4839
+ * resolves. Maps from the public `waitForNetworkResults` option:
4840
+ * - `'cached'` -- resolve as soon as any data (e.g. from cache) is delivered
4841
+ * - `'fresh'` -- wait for network data with a selector (REFRESHED state)
4842
+ */
4843
+ let minimumDataAvailability = 'fresh';
4780
4844
  // Explicit connection mode override — bypasses transition table entirely.
4781
4845
  let connectionModeOverride;
4782
4846
  // Forced/automatic streaming state for browser listener-driven streaming.
@@ -4879,7 +4943,9 @@ function createFDv2DataManagerBase(baseConfig) {
4879
4943
  ? new ServiceEndpoints(fallbackConfig.endpoints.streamingBaseUri ?? ctx.serviceEndpoints.streaming, fallbackConfig.endpoints.pollingBaseUri ?? ctx.serviceEndpoints.polling, ctx.serviceEndpoints.events, ctx.serviceEndpoints.analyticsEventPath, ctx.serviceEndpoints.diagnosticEventPath, ctx.serviceEndpoints.includeAuthorizationHeader, ctx.serviceEndpoints.payloadFilterKey)
4880
4944
  : ctx.serviceEndpoints;
4881
4945
  const fdv1RequestorFactory = () => makeRequestor(ctx.plainContextString, fallbackServiceEndpoints, fdv1Endpoints.polling(), ctx.requests, ctx.encoding, ctx.baseHeaders, ctx.queryParams, config.withReasons, config.useReport);
4882
- const fdv1SyncFactory = () => createFDv1PollingSynchronizer(fdv1RequestorFactory(), fallbackPollIntervalMs, logger);
4946
+ const fdv1SyncFactory = {
4947
+ create: () => createFDv1PollingSynchronizer(fdv1RequestorFactory(), fallbackPollIntervalMs, logger),
4948
+ };
4883
4949
  synchronizerSlots.push(createSynchronizerSlot(fdv1SyncFactory, { isFDv1Fallback: true }));
4884
4950
  }
4885
4951
  return { initializerFactories, synchronizerSlots };
@@ -4898,11 +4964,21 @@ function createFDv2DataManagerBase(baseConfig) {
4898
4964
  }
4899
4965
  const descriptors = flagEvalPayloadToItemDescriptors(payload.updates ?? []);
4900
4966
  // Flag updates and change events happen synchronously inside applyChanges.
4901
- // The returned promise is only for async cache persistence we intentionally
4967
+ // The returned promise is only for async cache persistence -- we intentionally
4902
4968
  // do not await it so the data source pipeline is not blocked by storage I/O.
4903
4969
  flagManager.applyChanges(context, descriptors, payload.type).catch((e) => {
4904
4970
  logger.warn(`${logTag} Failed to persist flag cache: ${e}`);
4905
4971
  });
4972
+ // When the minimum data availability is 'cached', resolve the identify
4973
+ // promise as soon as any data (e.g. from cache) has been delivered. The
4974
+ // data source continues its initialization pipeline normally --
4975
+ // subsequent changesets update flags and fire change events.
4976
+ if (minimumDataAvailability === 'cached' && !initialized && pendingIdentifyResolve) {
4977
+ initialized = true;
4978
+ pendingIdentifyResolve();
4979
+ pendingIdentifyResolve = undefined;
4980
+ pendingIdentifyReject = undefined;
4981
+ }
4906
4982
  }
4907
4983
  /**
4908
4984
  * Create and start a new FDv2DataSource for the given mode.
@@ -5009,6 +5085,7 @@ function createFDv2DataManagerBase(baseConfig) {
5009
5085
  selector = undefined;
5010
5086
  initialized = false;
5011
5087
  bootstrapped = false;
5088
+ minimumDataAvailability = identifyOptions?.waitForNetworkResults ? 'fresh' : 'cached';
5012
5089
  identifiedContext = context;
5013
5090
  pendingIdentifyResolve = identifyResolve;
5014
5091
  pendingIdentifyReject = identifyReject;