@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.
- package/CHANGELOG.md +13 -0
- package/dist/cjs/context/ensureKey.d.ts.map +1 -1
- package/dist/cjs/datasource/FDv2DataManagerBase.d.ts.map +1 -1
- package/dist/cjs/datasource/SourceFactoryProvider.d.ts.map +1 -1
- package/dist/cjs/datasource/fdv2/FDv2DataSource.d.ts.map +1 -1
- package/dist/cjs/datasource/fdv2/SourceManager.d.ts +28 -10
- package/dist/cjs/datasource/fdv2/SourceManager.d.ts.map +1 -1
- package/dist/cjs/index.cjs +117 -40
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/storage/getOrGenerateKey.d.ts +4 -1
- package/dist/cjs/storage/getOrGenerateKey.d.ts.map +1 -1
- package/dist/cjs/storage/namespaceUtils.d.ts +3 -6
- package/dist/cjs/storage/namespaceUtils.d.ts.map +1 -1
- package/dist/esm/context/ensureKey.d.ts.map +1 -1
- package/dist/esm/datasource/FDv2DataManagerBase.d.ts.map +1 -1
- package/dist/esm/datasource/SourceFactoryProvider.d.ts.map +1 -1
- package/dist/esm/datasource/fdv2/FDv2DataSource.d.ts.map +1 -1
- package/dist/esm/datasource/fdv2/SourceManager.d.ts +28 -10
- package/dist/esm/datasource/fdv2/SourceManager.d.ts.map +1 -1
- package/dist/esm/index.mjs +117 -40
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/storage/getOrGenerateKey.d.ts +4 -1
- package/dist/esm/storage/getOrGenerateKey.d.ts.map +1 -1
- package/dist/esm/storage/namespaceUtils.d.ts +3 -6
- package/dist/esm/storage/namespaceUtils.d.ts.map +1 -1
- package/package.json +1 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.26.0](https://github.com/launchdarkly/js-core/compare/js-client-sdk-common-v1.25.0...js-client-sdk-common-v1.26.0) (2026-04-23)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* support waitForNetworkResults in FDv2 data manager ([#1280](https://github.com/launchdarkly/js-core/issues/1280)) ([df7fa9e](https://github.com/launchdarkly/js-core/commit/df7fa9e571703132ffa697e8a005f31d7ab866dd))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* FDv2 Only -- Adjust the behavior of initialization when only cache initializers are available. ([#1304](https://github.com/launchdarkly/js-core/issues/1304)) ([9a2b25a](https://github.com/launchdarkly/js-core/commit/9a2b25afd1507b2b6e42b85a32edea7a40be8bb0))
|
|
14
|
+
* migrate anonymous context namespace to general namespace ([#1312](https://github.com/launchdarkly/js-core/issues/1312)) ([afbed0f](https://github.com/launchdarkly/js-core/commit/afbed0f299808f21dd4a8aa5159fe8d31879e1b9))
|
|
15
|
+
|
|
3
16
|
## [1.25.0](https://github.com/launchdarkly/js-core/compare/js-client-sdk-common-v1.24.0...js-client-sdk-common-v1.25.0) (2026-04-17)
|
|
4
17
|
|
|
5
18
|
|
|
@@ -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;
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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"}
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -698,13 +698,28 @@ async function digest(hasher, encoding) {
|
|
|
698
698
|
* @param storageKey keyed storage location where the generated key should live. See {@link namespaceForGeneratedContextKey}
|
|
699
699
|
* for related exmaples of generating a storage key and usage.
|
|
700
700
|
* @param platform crypto and storage implementations for necessary operations
|
|
701
|
+
* @param legacyStorageKey optional legacy storage key to migrate from. If the key is not found
|
|
702
|
+
* under {@link storageKey} but exists under this legacy key, it will be migrated to the new
|
|
703
|
+
* location and the legacy key will be cleared.
|
|
701
704
|
* @returns the generated key
|
|
702
705
|
*/
|
|
703
|
-
const getOrGenerateKey = async (storageKey, { crypto, storage }) => {
|
|
706
|
+
const getOrGenerateKey = async (storageKey, { crypto, storage }, legacyStorageKey) => {
|
|
704
707
|
let generatedKey = await storage?.get(storageKey);
|
|
705
|
-
if (
|
|
706
|
-
|
|
707
|
-
|
|
708
|
+
if (generatedKey == null) {
|
|
709
|
+
if (legacyStorageKey) {
|
|
710
|
+
generatedKey = await storage?.get(legacyStorageKey);
|
|
711
|
+
if (generatedKey != null) {
|
|
712
|
+
await storage?.set(storageKey, generatedKey);
|
|
713
|
+
const verified = await storage?.get(storageKey);
|
|
714
|
+
if (verified != null) {
|
|
715
|
+
await storage?.clear(legacyStorageKey);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
if (generatedKey == null) {
|
|
720
|
+
generatedKey = crypto.randomUUID();
|
|
721
|
+
await storage?.set(storageKey, generatedKey);
|
|
722
|
+
}
|
|
708
723
|
}
|
|
709
724
|
return generatedKey;
|
|
710
725
|
};
|
|
@@ -727,12 +742,9 @@ async function namespaceForEnvironment(crypto, sdkKey) {
|
|
|
727
742
|
]);
|
|
728
743
|
}
|
|
729
744
|
/**
|
|
730
|
-
* @deprecated
|
|
731
|
-
*
|
|
732
|
-
*
|
|
733
|
-
* feature and those were namespaced in LaunchDarkly_ContextKeys. This function can be removed
|
|
734
|
-
* when the data under the LaunchDarkly_AnonymousKeys namespace is merged with data under the
|
|
735
|
-
* LaunchDarkly_ContextKeys namespace.
|
|
745
|
+
* @deprecated Used only for migration in ensureKey. Data stored under LaunchDarkly_AnonymousKeys
|
|
746
|
+
* is now migrated to LaunchDarkly_ContextKeys on first access. This function can be removed once
|
|
747
|
+
* all clients have had the chance to run the migration.
|
|
736
748
|
*/
|
|
737
749
|
async function namespaceForAnonymousGeneratedContextKey(kind) {
|
|
738
750
|
return concatNamespacesAndValues([
|
|
@@ -915,10 +927,11 @@ const { isLegacyUser, isMultiKind, isSingleKind } = jsSdkCommon.internal;
|
|
|
915
927
|
const ensureKeyCommon = async (kind, c, platform) => {
|
|
916
928
|
const { anonymous, key } = c;
|
|
917
929
|
if (anonymous && !key) {
|
|
918
|
-
const storageKey = await
|
|
930
|
+
const storageKey = await namespaceForGeneratedContextKey(kind);
|
|
931
|
+
const legacyStorageKey = await namespaceForAnonymousGeneratedContextKey(kind);
|
|
919
932
|
// This mutates a cloned copy of the original context from ensureyKey so this is safe.
|
|
920
933
|
// eslint-disable-next-line no-param-reassign
|
|
921
|
-
c.key = await getOrGenerateKey(storageKey, platform);
|
|
934
|
+
c.key = await getOrGenerateKey(storageKey, platform, legacyStorageKey);
|
|
922
935
|
}
|
|
923
936
|
};
|
|
924
937
|
const ensureKeySingle = async (c, platform) => {
|
|
@@ -3305,21 +3318,24 @@ async function loadFromCache(config) {
|
|
|
3305
3318
|
* @internal
|
|
3306
3319
|
*/
|
|
3307
3320
|
function createCacheInitializerFactory(config) {
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
shutdownResolve
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
|
|
3317
|
-
|
|
3318
|
-
|
|
3319
|
-
|
|
3320
|
-
|
|
3321
|
-
|
|
3322
|
-
|
|
3321
|
+
return {
|
|
3322
|
+
isCache: true,
|
|
3323
|
+
// The selectorGetter is ignored -- cache data has no selector.
|
|
3324
|
+
create(_selectorGetter) {
|
|
3325
|
+
let shutdownResolve;
|
|
3326
|
+
const shutdownPromise = new Promise((resolve) => {
|
|
3327
|
+
shutdownResolve = resolve;
|
|
3328
|
+
});
|
|
3329
|
+
return {
|
|
3330
|
+
async run() {
|
|
3331
|
+
return Promise.race([shutdownPromise, loadFromCache(config)]);
|
|
3332
|
+
},
|
|
3333
|
+
close() {
|
|
3334
|
+
shutdownResolve?.(shutdown());
|
|
3335
|
+
shutdownResolve = undefined;
|
|
3336
|
+
},
|
|
3337
|
+
};
|
|
3338
|
+
},
|
|
3323
3339
|
};
|
|
3324
3340
|
}
|
|
3325
3341
|
|
|
@@ -3787,7 +3803,7 @@ function createSourceManager(initializerFactories, synchronizerSlots, selectorGe
|
|
|
3787
3803
|
return undefined;
|
|
3788
3804
|
}
|
|
3789
3805
|
closeActiveSource();
|
|
3790
|
-
const initializer = initializerFactories[initializerIndex](selectorGetter);
|
|
3806
|
+
const initializer = initializerFactories[initializerIndex].create(selectorGetter);
|
|
3791
3807
|
activeSource = initializer;
|
|
3792
3808
|
return initializer;
|
|
3793
3809
|
},
|
|
@@ -3807,7 +3823,7 @@ function createSourceManager(initializerFactories, synchronizerSlots, selectorGe
|
|
|
3807
3823
|
const candidate = synchronizerSlots[synchronizerIndex];
|
|
3808
3824
|
if (candidate.state === 'available') {
|
|
3809
3825
|
closeActiveSource();
|
|
3810
|
-
const synchronizer = candidate.factory(selectorGetter);
|
|
3826
|
+
const synchronizer = candidate.factory.create(selectorGetter);
|
|
3811
3827
|
activeSource = synchronizer;
|
|
3812
3828
|
return synchronizer;
|
|
3813
3829
|
}
|
|
@@ -4197,10 +4213,14 @@ function createDefaultSourceFactoryProvider() {
|
|
|
4197
4213
|
switch (entry.type) {
|
|
4198
4214
|
case 'polling': {
|
|
4199
4215
|
const requestor = resolvePollingRequestor(ctx, entry.endpoints);
|
|
4200
|
-
return
|
|
4216
|
+
return {
|
|
4217
|
+
create: (sg) => createPollingInitializer(requestor, ctx.logger, sg),
|
|
4218
|
+
};
|
|
4201
4219
|
}
|
|
4202
4220
|
case 'streaming':
|
|
4203
|
-
return
|
|
4221
|
+
return {
|
|
4222
|
+
create: (sg) => createStreamingInitializer(buildStreamingBase(entry, ctx, sg)),
|
|
4223
|
+
};
|
|
4204
4224
|
case 'cache':
|
|
4205
4225
|
return createCacheInitializerFactory({
|
|
4206
4226
|
storage: ctx.storage,
|
|
@@ -4218,13 +4238,14 @@ function createDefaultSourceFactoryProvider() {
|
|
|
4218
4238
|
case 'polling': {
|
|
4219
4239
|
const intervalMs = (entry.pollInterval ?? ctx.polling.intervalSeconds) * 1000;
|
|
4220
4240
|
const requestor = resolvePollingRequestor(ctx, entry.endpoints);
|
|
4221
|
-
|
|
4222
|
-
|
|
4223
|
-
|
|
4224
|
-
case 'streaming': {
|
|
4225
|
-
const factory = (sg) => createStreamingSynchronizer(buildStreamingBase(entry, ctx, sg));
|
|
4226
|
-
return createSynchronizerSlot(factory);
|
|
4241
|
+
return createSynchronizerSlot({
|
|
4242
|
+
create: (sg) => createPollingSynchronizer(requestor, ctx.logger, sg, intervalMs),
|
|
4243
|
+
});
|
|
4227
4244
|
}
|
|
4245
|
+
case 'streaming':
|
|
4246
|
+
return createSynchronizerSlot({
|
|
4247
|
+
create: (sg) => createStreamingSynchronizer(buildStreamingBase(entry, ctx, sg)),
|
|
4248
|
+
});
|
|
4228
4249
|
default:
|
|
4229
4250
|
return undefined;
|
|
4230
4251
|
}
|
|
@@ -4495,6 +4516,15 @@ function createFDv2DataSource(config) {
|
|
|
4495
4516
|
let dataReceived = false;
|
|
4496
4517
|
let initResolve;
|
|
4497
4518
|
let initReject;
|
|
4519
|
+
// When every initializer is a cache initializer and there are no
|
|
4520
|
+
// synchronizers, the cache is the only possible data source. A cache miss
|
|
4521
|
+
// in that configuration must not fail initialization -- there is nowhere
|
|
4522
|
+
// else for data to come from, and reporting an error would be meaningless.
|
|
4523
|
+
// Mirrors the Android SDK's InitializerFromCache / hasAvailableSources
|
|
4524
|
+
// behavior.
|
|
4525
|
+
const cacheOnlyDataSystem = initializerFactories.length > 0 &&
|
|
4526
|
+
initializerFactories.every((f) => f.isCache === true) &&
|
|
4527
|
+
synchronizerSlots.length === 0;
|
|
4498
4528
|
const sourceManager = createSourceManager(initializerFactories, synchronizerSlots, selectorGetter);
|
|
4499
4529
|
function markInitialized() {
|
|
4500
4530
|
if (!initialized) {
|
|
@@ -4524,6 +4554,10 @@ function createFDv2DataSource(config) {
|
|
|
4524
4554
|
// The orchestration loops intentionally use await-in-loop for sequential
|
|
4525
4555
|
// state machine processing — one result at a time.
|
|
4526
4556
|
async function runInitializers() {
|
|
4557
|
+
// Tracks whether any initializer reported interrupted/terminal_error.
|
|
4558
|
+
// Used below so the cache-only exhaustion branch does not overwrite
|
|
4559
|
+
// that error status with VALID.
|
|
4560
|
+
let errorReportedDuringInit = false;
|
|
4527
4561
|
while (!closed) {
|
|
4528
4562
|
const initializer = sourceManager.getNextInitializerAndSetActive();
|
|
4529
4563
|
if (initializer === undefined) {
|
|
@@ -4556,6 +4590,7 @@ function createFDv2DataSource(config) {
|
|
|
4556
4590
|
case 'terminal_error':
|
|
4557
4591
|
logger?.warn(`Initializer failed: ${result.errorInfo?.message ?? 'unknown error'}`);
|
|
4558
4592
|
reportStatusError(result);
|
|
4593
|
+
errorReportedDuringInit = true;
|
|
4559
4594
|
break;
|
|
4560
4595
|
case 'shutdown':
|
|
4561
4596
|
return;
|
|
@@ -4563,8 +4598,30 @@ function createFDv2DataSource(config) {
|
|
|
4563
4598
|
handleFdv1Fallback(result);
|
|
4564
4599
|
}
|
|
4565
4600
|
}
|
|
4601
|
+
// close() between the last loop iteration and the exhaustion branch.
|
|
4602
|
+
// Exit without marking initialized or emitting a spurious VALID; the
|
|
4603
|
+
// start() promise will be rejected by the post-orchestration handler
|
|
4604
|
+
// with "closed before initialization completed."
|
|
4605
|
+
if (closed) {
|
|
4606
|
+
return;
|
|
4607
|
+
}
|
|
4566
4608
|
// All initializers exhausted.
|
|
4567
|
-
if (
|
|
4609
|
+
if (cacheOnlyDataSystem) {
|
|
4610
|
+
// Cache-only data system with no synchronizer to produce a VALID
|
|
4611
|
+
// status on its own. On a cache miss with no errors, nothing else
|
|
4612
|
+
// has asserted VALID yet, so do it here. Skip the update if:
|
|
4613
|
+
// - dataReceived (cache hit): applyChangeSet already asserted VALID.
|
|
4614
|
+
// - errorReportedDuringInit: reportError set an error status that
|
|
4615
|
+
// must not be silently overwritten.
|
|
4616
|
+
if (!dataReceived && !errorReportedDuringInit) {
|
|
4617
|
+
statusManager.requestStateUpdate('VALID');
|
|
4618
|
+
}
|
|
4619
|
+
markInitialized();
|
|
4620
|
+
}
|
|
4621
|
+
else if (dataReceived) {
|
|
4622
|
+
// At least one initializer delivered data. Do not overwrite any
|
|
4623
|
+
// error status that a subsequent failed initializer may have
|
|
4624
|
+
// reported -- the status will be driven by the synchronizers.
|
|
4568
4625
|
markInitialized();
|
|
4569
4626
|
}
|
|
4570
4627
|
}
|
|
@@ -4795,6 +4852,13 @@ function createFDv2DataManagerBase(baseConfig) {
|
|
|
4795
4852
|
let bootstrapped = false;
|
|
4796
4853
|
let closed = false;
|
|
4797
4854
|
let flushCallback;
|
|
4855
|
+
/**
|
|
4856
|
+
* The minimum data availability required before the identify promise
|
|
4857
|
+
* resolves. Maps from the public `waitForNetworkResults` option:
|
|
4858
|
+
* - `'cached'` -- resolve as soon as any data (e.g. from cache) is delivered
|
|
4859
|
+
* - `'fresh'` -- wait for network data with a selector (REFRESHED state)
|
|
4860
|
+
*/
|
|
4861
|
+
let minimumDataAvailability = 'fresh';
|
|
4798
4862
|
// Explicit connection mode override — bypasses transition table entirely.
|
|
4799
4863
|
let connectionModeOverride;
|
|
4800
4864
|
// Forced/automatic streaming state for browser listener-driven streaming.
|
|
@@ -4897,7 +4961,9 @@ function createFDv2DataManagerBase(baseConfig) {
|
|
|
4897
4961
|
? new jsSdkCommon.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)
|
|
4898
4962
|
: ctx.serviceEndpoints;
|
|
4899
4963
|
const fdv1RequestorFactory = () => makeRequestor(ctx.plainContextString, fallbackServiceEndpoints, fdv1Endpoints.polling(), ctx.requests, ctx.encoding, ctx.baseHeaders, ctx.queryParams, config.withReasons, config.useReport);
|
|
4900
|
-
const fdv1SyncFactory =
|
|
4964
|
+
const fdv1SyncFactory = {
|
|
4965
|
+
create: () => createFDv1PollingSynchronizer(fdv1RequestorFactory(), fallbackPollIntervalMs, logger),
|
|
4966
|
+
};
|
|
4901
4967
|
synchronizerSlots.push(createSynchronizerSlot(fdv1SyncFactory, { isFDv1Fallback: true }));
|
|
4902
4968
|
}
|
|
4903
4969
|
return { initializerFactories, synchronizerSlots };
|
|
@@ -4916,11 +4982,21 @@ function createFDv2DataManagerBase(baseConfig) {
|
|
|
4916
4982
|
}
|
|
4917
4983
|
const descriptors = flagEvalPayloadToItemDescriptors(payload.updates ?? []);
|
|
4918
4984
|
// Flag updates and change events happen synchronously inside applyChanges.
|
|
4919
|
-
// The returned promise is only for async cache persistence
|
|
4985
|
+
// The returned promise is only for async cache persistence -- we intentionally
|
|
4920
4986
|
// do not await it so the data source pipeline is not blocked by storage I/O.
|
|
4921
4987
|
flagManager.applyChanges(context, descriptors, payload.type).catch((e) => {
|
|
4922
4988
|
logger.warn(`${logTag} Failed to persist flag cache: ${e}`);
|
|
4923
4989
|
});
|
|
4990
|
+
// When the minimum data availability is 'cached', resolve the identify
|
|
4991
|
+
// promise as soon as any data (e.g. from cache) has been delivered. The
|
|
4992
|
+
// data source continues its initialization pipeline normally --
|
|
4993
|
+
// subsequent changesets update flags and fire change events.
|
|
4994
|
+
if (minimumDataAvailability === 'cached' && !initialized && pendingIdentifyResolve) {
|
|
4995
|
+
initialized = true;
|
|
4996
|
+
pendingIdentifyResolve();
|
|
4997
|
+
pendingIdentifyResolve = undefined;
|
|
4998
|
+
pendingIdentifyReject = undefined;
|
|
4999
|
+
}
|
|
4924
5000
|
}
|
|
4925
5001
|
/**
|
|
4926
5002
|
* Create and start a new FDv2DataSource for the given mode.
|
|
@@ -5027,6 +5103,7 @@ function createFDv2DataManagerBase(baseConfig) {
|
|
|
5027
5103
|
selector = undefined;
|
|
5028
5104
|
initialized = false;
|
|
5029
5105
|
bootstrapped = false;
|
|
5106
|
+
minimumDataAvailability = identifyOptions?.waitForNetworkResults ? 'fresh' : 'cached';
|
|
5030
5107
|
identifiedContext = context;
|
|
5031
5108
|
pendingIdentifyResolve = identifyResolve;
|
|
5032
5109
|
pendingIdentifyReject = identifyReject;
|