Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
"devDependencies": {
"@react-native-community/eslint-config": "^2.0.0",
"@types/jest": "^26.0.0",
"@types/object-assign": "^4.0.30",
"@types/react": "^16.9.19",
"@types/react-native": "0.62.13",
"eslint": "^7.2.0",
Expand Down
7 changes: 5 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
export { InMemoryStorageCSFactory } from '@splitsoftware/splitio-commons';
export { packageVersion } from './settings/defaults';
export { SplitFactory } from './splitFactory';
export { ErrorLogger } from '@splitsoftware/splitio-commons/src/logger/browser/ErrorLogger';
export { WarnLogger } from '@splitsoftware/splitio-commons/src/logger/browser/WarnLogger';
export { InfoLogger } from '@splitsoftware/splitio-commons/src/logger/browser/InfoLogger';
export { DebugLogger } from '@splitsoftware/splitio-commons/src/logger/browser/DebugLogger';
60 changes: 60 additions & 0 deletions src/platform/getModules.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { splitApiFactory } from '@splitsoftware/splitio-commons/src/services/splitApi';
import { syncManagerOnlineFactory } from '@splitsoftware/splitio-commons/src/sync/syncManagerOnline';
import pushManagerFactory from '@splitsoftware/splitio-commons/src/sync/streaming/pushManager';
import pollingManagerCSFactory from '@splitsoftware/splitio-commons/src/sync/polling/pollingManagerCS';
import { sdkManagerFactory } from '@splitsoftware/splitio-commons/src/sdkManager/index';
import { sdkClientMethodCSFactory } from '@splitsoftware/splitio-commons/src/sdkClient/sdkClientMethodCS';
import { impressionObserverCSFactory } from '@splitsoftware/splitio-commons/src/trackers/impressionObserver/impressionObserverCS';
import integrationsManagerFactory from '@splitsoftware/splitio-commons/src/integrations/pluggable';
import EventEmitter from '@splitsoftware/splitio-commons/src/utils/MinEvents';

import { shouldAddPt } from '@splitsoftware/splitio-commons/src/trackers/impressionObserver/utils';
import type { ISettingsInternal } from '@splitsoftware/splitio-commons/src/utils/settingsValidation/types';
import type { ISdkFactoryParams } from '@splitsoftware/splitio-commons/src/sdkFactory/types';

const rnPlatform = {
// No `getFetch` provided. RN provides global fetch.

// @TODO provide `getEventSource` implementation

EventEmitter,
};

const syncManagerOnlineCSFactory = syncManagerOnlineFactory(
pollingManagerCSFactory,
pushManagerFactory
);

/**
* Get minimal modules for RN client-side SDK in standalone mode and with online syncManager.
*/
export function getModules(settings: ISettingsInternal): ISdkFactoryParams {
return {
settings,

platform: rnPlatform,

storageFactory: settings.storage,

splitApiFactory,

syncManagerFactory: syncManagerOnlineCSFactory,

sdkManagerFactory,

sdkClientMethodFactory: sdkClientMethodCSFactory,
// @TODO provide RN signal listener
SignalListener: undefined,
// @ts-ignore
impressionListener: settings.impressionListener,

integrationsManagerFactory:
settings.integrations && settings.integrations.length > 0
? integrationsManagerFactory.bind(null, settings.integrations)
: undefined,

impressionsObserverFactory: shouldAddPt(settings)
? impressionObserverCSFactory
: undefined,
};
}
6 changes: 3 additions & 3 deletions src/settings/__tests__/defaults.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { packageVersion } from '../defaults';
import { defaults } from '../defaults';
import { version } from '../../../package.json';

test('sdk version should be the package.json version', () => {
expect(packageVersion).toBe(version);
test('sdk version should contain the package.json version', () => {
expect(defaults.version).toBe(`reactnative-${version}`);
});
21 changes: 20 additions & 1 deletion src/settings/defaults.ts
Original file line number Diff line number Diff line change
@@ -1 +1,20 @@
export const packageVersion = '0.0.1-beta.0';
const packageVersion = '0.0.1-beta.0';

export const defaults = {
startup: {
// Stress the request time used while starting up the SDK.
requestTimeoutBeforeReady: 5,
// How many quick retries we will do while starting up the SDK.
retriesOnFailureBeforeReady: 1,
// Maximum amount of time used before notifies me a timeout.
readyTimeout: 10,
// Amount of time we will wait before the first push of events.
eventsFirstPushWindow: 10,
},

// Instance version.
version: `reactnative-${packageVersion}`,

// @TODO check if we should provide some way to overwrite the default log level
debug: undefined,
};
16 changes: 16 additions & 0 deletions src/settings/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { settingsValidation } from '@splitsoftware/splitio-commons/src/utils/settingsValidation/index';
import { defaults } from './defaults';
import { validateStorageCS } from '@splitsoftware/splitio-commons/src/utils/settingsValidation/storage/storageCS';
import { validatePluggableIntegrations } from '@splitsoftware/splitio-commons/src/utils/settingsValidation/integrations/pluggable';
import { validateLogger } from '@splitsoftware/splitio-commons/src/utils/settingsValidation/logger/pluggableLogger';

const params = {
defaults,
storage: validateStorageCS,
integrations: validatePluggableIntegrations,
logger: validateLogger,
};

export function settingsValidator(config: any) {
return settingsValidation(config, params);
}
25 changes: 25 additions & 0 deletions src/splitFactory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { settingsValidator } from './settings';
import { getModules } from './platform/getModules';
import { sdkFactory } from '@splitsoftware/splitio-commons/src/sdkFactory/index';
import type { ISdkFactoryParams } from '@splitsoftware/splitio-commons/src/sdkFactory/types';
import { merge } from '@splitsoftware/splitio-commons/src/utils/lang';

/**
* SplitFactory for React Native.
*
* @param config Configuration object used to instantiates the SDK
* @param customModules Optional object of SDK modules to overwrite default ones. Use with caution since, unlike `config`, this param is not validated.
* @throws Will throw an error if the provided config is invalid.
*/
export function SplitFactory(
config: any,
customModules?: Partial<ISdkFactoryParams>
) {
const settings = settingsValidator(config);
const modules = getModules(settings);
return sdkFactory(
customModules
? (merge(modules, customModules) as ISdkFactoryParams)
: modules
);
}
8 changes: 3 additions & 5 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,16 @@
"allowUnreachableCode": false,
"allowUnusedLabels": false,
"esModuleInterop": true,
"importsNotUsedAsValues": "error",
// "importsNotUsedAsValues": "error",
"forceConsistentCasingInFileNames": true,
"jsx": "react",
"lib": ["esnext"],
// "lib": ["esnext"],
"module": "esnext",
"moduleResolution": "node",
"noFallthroughCasesInSwitch": true,
"noImplicitReturns": true,
"noImplicitUseStrict": false,
"noStrictGenericChecks": false,
"noUnusedLocals": true,
"noUnusedParameters": true,
// "noUnusedParameters": true,
Comment thread
EmilianoSanchez marked this conversation as resolved.
"resolveJsonModule": true,
"skipLibCheck": true,
"strict": true,
Expand Down