diff --git a/package-lock.json b/package-lock.json index 93cce58..0378ce8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2588,6 +2588,12 @@ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, + "@types/object-assign": { + "version": "4.0.30", + "resolved": "https://registry.npmjs.org/@types/object-assign/-/object-assign-4.0.30.tgz", + "integrity": "sha1-iUk3HVqZ9Dge4PHfCpt6GH4H5lI=", + "dev": true + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", diff --git a/package.json b/package.json index 79484e7..3bd9a21 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/index.ts b/src/index.ts index 6c4c862..d76a207 100644 --- a/src/index.ts +++ b/src/index.ts @@ -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'; diff --git a/src/platform/getModules.ts b/src/platform/getModules.ts new file mode 100644 index 0000000..1054621 --- /dev/null +++ b/src/platform/getModules.ts @@ -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, + }; +} diff --git a/src/settings/__tests__/defaults.spec.ts b/src/settings/__tests__/defaults.spec.ts index 93f2671..a68a904 100644 --- a/src/settings/__tests__/defaults.spec.ts +++ b/src/settings/__tests__/defaults.spec.ts @@ -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}`); }); diff --git a/src/settings/defaults.ts b/src/settings/defaults.ts index bb9e148..14445a4 100644 --- a/src/settings/defaults.ts +++ b/src/settings/defaults.ts @@ -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, +}; diff --git a/src/settings/index.ts b/src/settings/index.ts new file mode 100644 index 0000000..bd53491 --- /dev/null +++ b/src/settings/index.ts @@ -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); +} diff --git a/src/splitFactory.ts b/src/splitFactory.ts new file mode 100644 index 0000000..2cb7bc6 --- /dev/null +++ b/src/splitFactory.ts @@ -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 +) { + const settings = settingsValidator(config); + const modules = getModules(settings); + return sdkFactory( + customModules + ? (merge(modules, customModules) as ISdkFactoryParams) + : modules + ); +} diff --git a/tsconfig.json b/tsconfig.json index 0897c19..ad77c14 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -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, "resolveJsonModule": true, "skipLibCheck": true, "strict": true,