@splitsoftware/splitio-commons 3.1.1-rc.5 → 3.1.1-rc.6

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/CHANGES.txt CHANGED
@@ -1,5 +1,6 @@
1
- 3.2.0 (August 28, 2026)
1
+ 3.2.0 (September 18, 2026)
2
2
  - Added support for AI configs.
3
+ - Updated submitters to allow starting and executing them when the Configs SDK is ready.
3
4
  - Removed Configs SDK-related types and modules and moved them to the Configs SDK repository.
4
5
 
5
6
  3.1.0 (July 23, 2026)
@@ -6,41 +6,64 @@ var impressionsSubmitter_1 = require("./impressionsSubmitter");
6
6
  var impressionCountsSubmitter_1 = require("./impressionCountsSubmitter");
7
7
  var telemetrySubmitter_1 = require("./telemetrySubmitter");
8
8
  var uniqueKeysSubmitter_1 = require("./uniqueKeysSubmitter");
9
- function submitterManagerFactory(params) {
10
- var submitters = [
11
- (0, impressionsSubmitter_1.impressionsSubmitterFactory)(params),
12
- (0, eventsSubmitter_1.eventsSubmitterFactory)(params),
13
- (0, impressionCountsSubmitter_1.impressionCountsSubmitterFactory)(params),
14
- (0, uniqueKeysSubmitter_1.uniqueKeysSubmitterFactory)(params)
15
- ];
16
- var telemetrySubmitter = (0, telemetrySubmitter_1.telemetrySubmitterFactory)(params);
17
- return {
18
- // `onlyTelemetry` true if SDK is created with userConsent not GRANTED
19
- start: function (onlyTelemetry) {
9
+ var constants_1 = require("../../readiness/constants");
10
+ /**
11
+ * Creates a submitter manager.
12
+ *
13
+ * @param startWhenReady - If true, the submitters will only start and execute the underlying submitters when the SDK is ready.
14
+ * `true` for Configs SDK, `false` for Flags SDKs.
15
+ */
16
+ function submitterManagerFactory(startWhenReady) {
17
+ return function (params) {
18
+ var readiness = params.readiness;
19
+ var submitters = [
20
+ (0, impressionsSubmitter_1.impressionsSubmitterFactory)(params),
21
+ (0, eventsSubmitter_1.eventsSubmitterFactory)(params),
22
+ (0, impressionCountsSubmitter_1.impressionCountsSubmitterFactory)(params),
23
+ (0, uniqueKeysSubmitter_1.uniqueKeysSubmitterFactory)(params)
24
+ ];
25
+ var telemetrySubmitter = (0, telemetrySubmitter_1.telemetrySubmitterFactory)(params);
26
+ var isRunning = false;
27
+ function startSubmitters(onlyTelemetry) {
28
+ if (!isRunning)
29
+ return;
20
30
  if (!onlyTelemetry)
21
31
  submitters.forEach(function (submitter) { return submitter.start(); });
22
32
  if (telemetrySubmitter)
23
33
  telemetrySubmitter.start();
24
- },
25
- // `allExceptTelemetry` true if userConsent is changed to DECLINED
26
- stop: function (allExceptTelemetry) {
27
- submitters.forEach(function (submitter) { return submitter.stop(); });
28
- if (!allExceptTelemetry && telemetrySubmitter)
29
- telemetrySubmitter.stop();
30
- },
31
- isRunning: function () {
32
- return submitters.some(function (submitter) { return submitter.isRunning(); });
33
- },
34
- // Flush data. Called with `onlyTelemetry` true if SDK is destroyed with userConsent not GRANTED
35
- execute: function (onlyTelemetry) {
36
- var promises = onlyTelemetry ? [] : submitters.map(function (submitter) { return submitter.execute(); });
37
- if (telemetrySubmitter)
38
- promises.push(telemetrySubmitter.execute());
39
- return Promise.all(promises).then(function () { });
40
- },
41
- isExecuting: function () {
42
- return submitters.some(function (submitter) { return submitter.isExecuting(); });
43
34
  }
35
+ return {
36
+ // `onlyTelemetry` true if SDK is created with userConsent not GRANTED
37
+ start: function (onlyTelemetry) {
38
+ isRunning = true;
39
+ if (!startWhenReady || readiness.isReady())
40
+ startSubmitters(onlyTelemetry);
41
+ else
42
+ readiness.gate.once(constants_1.SDK_READY, function () { return startSubmitters(onlyTelemetry); });
43
+ },
44
+ // `allExceptTelemetry` true if userConsent is changed to DECLINED
45
+ stop: function (allExceptTelemetry) {
46
+ isRunning = false;
47
+ submitters.forEach(function (submitter) { return submitter.stop(); });
48
+ if (!allExceptTelemetry && telemetrySubmitter)
49
+ telemetrySubmitter.stop();
50
+ },
51
+ isRunning: function () {
52
+ return isRunning;
53
+ },
54
+ // Flush data. Called with `onlyTelemetry` true if SDK is destroyed with userConsent not GRANTED
55
+ execute: function (onlyTelemetry) {
56
+ if (startWhenReady && !readiness.isReady())
57
+ return Promise.resolve();
58
+ var promises = onlyTelemetry ? [] : submitters.map(function (submitter) { return submitter.execute(); });
59
+ if (telemetrySubmitter)
60
+ promises.push(telemetrySubmitter.execute());
61
+ return Promise.all(promises).then(function () { });
62
+ },
63
+ isExecuting: function () {
64
+ return submitters.some(function (submitter) { return submitter.isExecuting(); });
65
+ }
66
+ };
44
67
  };
45
68
  }
46
69
  exports.submitterManagerFactory = submitterManagerFactory;
@@ -15,8 +15,10 @@ var AbstractDefinitionsCacheSync_1 = require("../storages/AbstractDefinitionsCac
15
15
  * @param pollingManagerFactory - allows to specialize the SyncManager for server-side or client-side API by passing
16
16
  * `pollingManagerSSFactory` or `pollingManagerCSFactory` respectively.
17
17
  * @param pushManagerFactory - optional to build a SyncManager with or without streaming support
18
+ * @param submitterManagerFactory - specify the submitter manager factory to use
18
19
  */
19
- function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
20
+ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory, _submitterManagerFactory) {
21
+ if (_submitterManagerFactory === void 0) { _submitterManagerFactory = (0, submitterManager_1.submitterManagerFactory)(); }
20
22
  /**
21
23
  * SyncManager factory for modular SDK
22
24
  */
@@ -30,7 +32,7 @@ function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
30
32
  undefined;
31
33
  /** Submitter Manager */
32
34
  // It is not injected as push and polling managers, because at the moment it is required
33
- var submitterManager = (0, submitterManager_1.submitterManagerFactory)(params);
35
+ var submitterManager = _submitterManagerFactory(params);
34
36
  /** Sync Manager logic */
35
37
  function startPolling() {
36
38
  if (pollingManager.isRunning()) {
@@ -3,40 +3,63 @@ import { impressionsSubmitterFactory } from './impressionsSubmitter';
3
3
  import { impressionCountsSubmitterFactory } from './impressionCountsSubmitter';
4
4
  import { telemetrySubmitterFactory } from './telemetrySubmitter';
5
5
  import { uniqueKeysSubmitterFactory } from './uniqueKeysSubmitter';
6
- export function submitterManagerFactory(params) {
7
- var submitters = [
8
- impressionsSubmitterFactory(params),
9
- eventsSubmitterFactory(params),
10
- impressionCountsSubmitterFactory(params),
11
- uniqueKeysSubmitterFactory(params)
12
- ];
13
- var telemetrySubmitter = telemetrySubmitterFactory(params);
14
- return {
15
- // `onlyTelemetry` true if SDK is created with userConsent not GRANTED
16
- start: function (onlyTelemetry) {
6
+ import { SDK_READY } from '../../readiness/constants';
7
+ /**
8
+ * Creates a submitter manager.
9
+ *
10
+ * @param startWhenReady - If true, the submitters will only start and execute the underlying submitters when the SDK is ready.
11
+ * `true` for Configs SDK, `false` for Flags SDKs.
12
+ */
13
+ export function submitterManagerFactory(startWhenReady) {
14
+ return function (params) {
15
+ var readiness = params.readiness;
16
+ var submitters = [
17
+ impressionsSubmitterFactory(params),
18
+ eventsSubmitterFactory(params),
19
+ impressionCountsSubmitterFactory(params),
20
+ uniqueKeysSubmitterFactory(params)
21
+ ];
22
+ var telemetrySubmitter = telemetrySubmitterFactory(params);
23
+ var isRunning = false;
24
+ function startSubmitters(onlyTelemetry) {
25
+ if (!isRunning)
26
+ return;
17
27
  if (!onlyTelemetry)
18
28
  submitters.forEach(function (submitter) { return submitter.start(); });
19
29
  if (telemetrySubmitter)
20
30
  telemetrySubmitter.start();
21
- },
22
- // `allExceptTelemetry` true if userConsent is changed to DECLINED
23
- stop: function (allExceptTelemetry) {
24
- submitters.forEach(function (submitter) { return submitter.stop(); });
25
- if (!allExceptTelemetry && telemetrySubmitter)
26
- telemetrySubmitter.stop();
27
- },
28
- isRunning: function () {
29
- return submitters.some(function (submitter) { return submitter.isRunning(); });
30
- },
31
- // Flush data. Called with `onlyTelemetry` true if SDK is destroyed with userConsent not GRANTED
32
- execute: function (onlyTelemetry) {
33
- var promises = onlyTelemetry ? [] : submitters.map(function (submitter) { return submitter.execute(); });
34
- if (telemetrySubmitter)
35
- promises.push(telemetrySubmitter.execute());
36
- return Promise.all(promises).then(function () { });
37
- },
38
- isExecuting: function () {
39
- return submitters.some(function (submitter) { return submitter.isExecuting(); });
40
31
  }
32
+ return {
33
+ // `onlyTelemetry` true if SDK is created with userConsent not GRANTED
34
+ start: function (onlyTelemetry) {
35
+ isRunning = true;
36
+ if (!startWhenReady || readiness.isReady())
37
+ startSubmitters(onlyTelemetry);
38
+ else
39
+ readiness.gate.once(SDK_READY, function () { return startSubmitters(onlyTelemetry); });
40
+ },
41
+ // `allExceptTelemetry` true if userConsent is changed to DECLINED
42
+ stop: function (allExceptTelemetry) {
43
+ isRunning = false;
44
+ submitters.forEach(function (submitter) { return submitter.stop(); });
45
+ if (!allExceptTelemetry && telemetrySubmitter)
46
+ telemetrySubmitter.stop();
47
+ },
48
+ isRunning: function () {
49
+ return isRunning;
50
+ },
51
+ // Flush data. Called with `onlyTelemetry` true if SDK is destroyed with userConsent not GRANTED
52
+ execute: function (onlyTelemetry) {
53
+ if (startWhenReady && !readiness.isReady())
54
+ return Promise.resolve();
55
+ var promises = onlyTelemetry ? [] : submitters.map(function (submitter) { return submitter.execute(); });
56
+ if (telemetrySubmitter)
57
+ promises.push(telemetrySubmitter.execute());
58
+ return Promise.all(promises).then(function () { });
59
+ },
60
+ isExecuting: function () {
61
+ return submitters.some(function (submitter) { return submitter.isExecuting(); });
62
+ }
63
+ };
41
64
  };
42
65
  }
@@ -12,8 +12,10 @@ import { usesSegmentsSync } from '../storages/AbstractDefinitionsCacheSync';
12
12
  * @param pollingManagerFactory - allows to specialize the SyncManager for server-side or client-side API by passing
13
13
  * `pollingManagerSSFactory` or `pollingManagerCSFactory` respectively.
14
14
  * @param pushManagerFactory - optional to build a SyncManager with or without streaming support
15
+ * @param submitterManagerFactory - specify the submitter manager factory to use
15
16
  */
16
- export function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory) {
17
+ export function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFactory, _submitterManagerFactory) {
18
+ if (_submitterManagerFactory === void 0) { _submitterManagerFactory = submitterManagerFactory(); }
17
19
  /**
18
20
  * SyncManager factory for modular SDK
19
21
  */
@@ -27,7 +29,7 @@ export function syncManagerOnlineFactory(pollingManagerFactory, pushManagerFacto
27
29
  undefined;
28
30
  /** Submitter Manager */
29
31
  // It is not injected as push and polling managers, because at the moment it is required
30
- var submitterManager = submitterManagerFactory(params);
32
+ var submitterManager = _submitterManagerFactory(params);
31
33
  /** Sync Manager logic */
32
34
  function startPolling() {
33
35
  if (pollingManager.isRunning()) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splitsoftware/splitio-commons",
3
- "version": "3.1.1-rc.5",
3
+ "version": "3.1.1-rc.6",
4
4
  "description": "Split JavaScript SDK common components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",
@@ -5,44 +5,70 @@ import { telemetrySubmitterFactory } from './telemetrySubmitter';
5
5
  import { ISdkFactoryContextSync } from '../../sdkFactory/types';
6
6
  import { ISubmitterManager } from './types';
7
7
  import { uniqueKeysSubmitterFactory } from './uniqueKeysSubmitter';
8
+ import { SDK_READY } from '../../readiness/constants';
8
9
 
9
- export function submitterManagerFactory(params: ISdkFactoryContextSync): ISubmitterManager {
10
+ /**
11
+ * Creates a submitter manager.
12
+ *
13
+ * @param startWhenReady - If true, the submitters will only start and execute the underlying submitters when the SDK is ready.
14
+ * `true` for Configs SDK, `false` for Flags SDKs.
15
+ */
16
+ export function submitterManagerFactory(startWhenReady?: boolean) {
10
17
 
11
- const submitters = [
12
- impressionsSubmitterFactory(params),
13
- eventsSubmitterFactory(params),
14
- impressionCountsSubmitterFactory(params),
15
- uniqueKeysSubmitterFactory(params)
16
- ];
18
+ return function (params: ISdkFactoryContextSync): ISubmitterManager {
17
19
 
18
- const telemetrySubmitter = telemetrySubmitterFactory(params);
20
+ const { readiness } = params;
21
+
22
+ const submitters = [
23
+ impressionsSubmitterFactory(params),
24
+ eventsSubmitterFactory(params),
25
+ impressionCountsSubmitterFactory(params),
26
+ uniqueKeysSubmitterFactory(params)
27
+ ];
28
+
29
+ const telemetrySubmitter = telemetrySubmitterFactory(params);
30
+ let isRunning = false;
31
+
32
+ function startSubmitters(onlyTelemetry?: boolean) {
33
+ if (!isRunning) return;
19
34
 
20
- return {
21
- // `onlyTelemetry` true if SDK is created with userConsent not GRANTED
22
- start(onlyTelemetry?: boolean) {
23
35
  if (!onlyTelemetry) submitters.forEach(submitter => submitter.start());
24
36
  if (telemetrySubmitter) telemetrySubmitter.start();
25
- },
26
-
27
- // `allExceptTelemetry` true if userConsent is changed to DECLINED
28
- stop(allExceptTelemetry?: boolean) {
29
- submitters.forEach(submitter => submitter.stop());
30
- if (!allExceptTelemetry && telemetrySubmitter) telemetrySubmitter.stop();
31
- },
32
-
33
- isRunning() {
34
- return submitters.some(submitter => submitter.isRunning());
35
- },
36
-
37
- // Flush data. Called with `onlyTelemetry` true if SDK is destroyed with userConsent not GRANTED
38
- execute(onlyTelemetry?: boolean) {
39
- const promises = onlyTelemetry ? [] : submitters.map(submitter => submitter.execute());
40
- if (telemetrySubmitter) promises.push(telemetrySubmitter.execute());
41
- return Promise.all(promises).then(() => { });
42
- },
43
-
44
- isExecuting() {
45
- return submitters.some(submitter => submitter.isExecuting());
46
37
  }
38
+
39
+ return {
40
+ // `onlyTelemetry` true if SDK is created with userConsent not GRANTED
41
+ start(onlyTelemetry?: boolean) {
42
+ isRunning = true;
43
+
44
+ if (!startWhenReady || readiness.isReady()) startSubmitters(onlyTelemetry);
45
+ else readiness.gate.once(SDK_READY, () => startSubmitters(onlyTelemetry));
46
+ },
47
+
48
+ // `allExceptTelemetry` true if userConsent is changed to DECLINED
49
+ stop(allExceptTelemetry?: boolean) {
50
+ isRunning = false;
51
+
52
+ submitters.forEach(submitter => submitter.stop());
53
+ if (!allExceptTelemetry && telemetrySubmitter) telemetrySubmitter.stop();
54
+ },
55
+
56
+ isRunning() {
57
+ return isRunning;
58
+ },
59
+
60
+ // Flush data. Called with `onlyTelemetry` true if SDK is destroyed with userConsent not GRANTED
61
+ execute(onlyTelemetry?: boolean) {
62
+ if (startWhenReady && !readiness.isReady()) return Promise.resolve();
63
+
64
+ const promises = onlyTelemetry ? [] : submitters.map(submitter => submitter.execute());
65
+ if (telemetrySubmitter) promises.push(telemetrySubmitter.execute());
66
+ return Promise.all(promises).then(() => { });
67
+ },
68
+
69
+ isExecuting() {
70
+ return submitters.some(submitter => submitter.isExecuting());
71
+ }
72
+ };
47
73
  };
48
74
  }
@@ -19,10 +19,12 @@ import { usesSegmentsSync } from '../storages/AbstractDefinitionsCacheSync';
19
19
  * @param pollingManagerFactory - allows to specialize the SyncManager for server-side or client-side API by passing
20
20
  * `pollingManagerSSFactory` or `pollingManagerCSFactory` respectively.
21
21
  * @param pushManagerFactory - optional to build a SyncManager with or without streaming support
22
+ * @param submitterManagerFactory - specify the submitter manager factory to use
22
23
  */
23
24
  export function syncManagerOnlineFactory(
24
25
  pollingManagerFactory?: (params: ISdkFactoryContextSync) => IPollingManager,
25
26
  pushManagerFactory?: (params: ISdkFactoryContextSync, pollingManager: IPollingManager) => IPushManager | undefined,
27
+ _submitterManagerFactory = submitterManagerFactory(),
26
28
  ): (params: ISdkFactoryContextSync) => ISyncManagerCS {
27
29
 
28
30
  /**
@@ -42,7 +44,7 @@ export function syncManagerOnlineFactory(
42
44
 
43
45
  /** Submitter Manager */
44
46
  // It is not injected as push and polling managers, because at the moment it is required
45
- const submitterManager = submitterManagerFactory(params);
47
+ const submitterManager = _submitterManagerFactory(params);
46
48
 
47
49
  /** Sync Manager logic */
48
50