react-native-spike-sdk 1.0.23 → 2.1.1

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.
Files changed (58) hide show
  1. package/README.md +243 -185
  2. package/android/build.gradle +1 -1
  3. package/android/src/main/java/com/spikesdk/SpikeMappers.kt +9 -3
  4. package/android/src/main/java/com/spikesdk/SpikeSdkModule.kt +54 -98
  5. package/ios/SpikeConnectionListener.swift +1 -1
  6. package/ios/SpikeDataTypeMapper.swift +2 -2
  7. package/ios/SpikeExceptionMapper.swift +2 -0
  8. package/ios/SpikeSdk.m +1 -24
  9. package/ios/SpikeSdk.swift +15 -110
  10. package/lib/commonjs/Spike.js +4 -39
  11. package/lib/commonjs/Spike.js.map +1 -1
  12. package/lib/commonjs/SpikeBackgroundDeliveriesLogger.js +2 -0
  13. package/lib/{module/SpikeWebhookConnectionListener.js.map → commonjs/SpikeBackgroundDeliveriesLogger.js.map} +1 -1
  14. package/lib/commonjs/SpikeConnection.js +82 -8
  15. package/lib/commonjs/SpikeConnection.js.map +1 -1
  16. package/lib/commonjs/SpikeException.js +3 -1
  17. package/lib/commonjs/SpikeException.js.map +1 -1
  18. package/lib/commonjs/index.js +9 -8
  19. package/lib/commonjs/index.js.map +1 -1
  20. package/lib/module/Spike.js +4 -35
  21. package/lib/module/Spike.js.map +1 -1
  22. package/lib/module/SpikeBackgroundDeliveriesLogger.js +2 -0
  23. package/lib/{commonjs/SpikeWebhookConnectionListener.js.map → module/SpikeBackgroundDeliveriesLogger.js.map} +1 -1
  24. package/lib/module/SpikeConnection.js +82 -8
  25. package/lib/module/SpikeConnection.js.map +1 -1
  26. package/lib/module/SpikeException.js +1 -0
  27. package/lib/module/SpikeException.js.map +1 -1
  28. package/lib/module/index.js +4 -9
  29. package/lib/module/index.js.map +1 -1
  30. package/lib/typescript/Spike.d.ts +10 -8
  31. package/lib/typescript/Spike.d.ts.map +1 -1
  32. package/lib/typescript/SpikeBackgroundDeliveriesLogger.d.ts +4 -0
  33. package/lib/typescript/SpikeBackgroundDeliveriesLogger.d.ts.map +1 -0
  34. package/lib/typescript/SpikeConnection.d.ts +21 -4
  35. package/lib/typescript/SpikeConnection.d.ts.map +1 -1
  36. package/lib/typescript/SpikeException.d.ts +2 -0
  37. package/lib/typescript/SpikeException.d.ts.map +1 -1
  38. package/lib/typescript/index.d.ts +6 -10
  39. package/lib/typescript/index.d.ts.map +1 -1
  40. package/package.json +1 -1
  41. package/react-native-spike-sdk.podspec +2 -2
  42. package/src/Spike.ts +16 -71
  43. package/src/SpikeBackgroundDeliveriesLogger.ts +3 -0
  44. package/src/SpikeConnection.ts +157 -21
  45. package/src/SpikeException.ts +1 -0
  46. package/src/index.ts +6 -13
  47. package/lib/commonjs/SpikeWebhookConnection.js +0 -111
  48. package/lib/commonjs/SpikeWebhookConnection.js.map +0 -1
  49. package/lib/commonjs/SpikeWebhookConnectionListener.js +0 -2
  50. package/lib/module/SpikeWebhookConnection.js +0 -104
  51. package/lib/module/SpikeWebhookConnection.js.map +0 -1
  52. package/lib/module/SpikeWebhookConnectionListener.js +0 -2
  53. package/lib/typescript/SpikeWebhookConnection.d.ts +0 -22
  54. package/lib/typescript/SpikeWebhookConnection.d.ts.map +0 -1
  55. package/lib/typescript/SpikeWebhookConnectionListener.d.ts +0 -4
  56. package/lib/typescript/SpikeWebhookConnectionListener.d.ts.map +0 -1
  57. package/src/SpikeWebhookConnection.ts +0 -173
  58. package/src/SpikeWebhookConnectionListener.ts +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpikeBackgroundDeliveriesLogger.d.ts","sourceRoot":"","sources":["../../src/SpikeBackgroundDeliveriesLogger.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,+BAA+B;IAC9C,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC"}
@@ -1,8 +1,19 @@
1
1
  import type { SpikeLogger } from './SpikeLogger';
2
2
  import type { SpikeData, SpikeDataEntry } from './DataModels/SpikeData';
3
- import type { SpikeDataType } from './DataTypes/SpikeDataType';
3
+ import { type SpikeDataType } from './DataTypes/SpikeDataType';
4
+ import type { SpikeWebhookJob } from './DataModels/SpikeWebhookJob';
5
+ import type { SpikeBackgroundDeliveriesLogger } from './SpikeBackgroundDeliveriesLogger';
6
+ export type SpikeExtractConfig<DataEntry extends SpikeDataEntry> = {
7
+ dataType: SpikeDataType<DataEntry>;
8
+ } | {
9
+ dataType: SpikeDataType<DataEntry>;
10
+ from: Date;
11
+ to: Date;
12
+ };
4
13
  export declare class SpikeConnection {
5
14
  private logEventListener;
15
+ private eventListener;
16
+ private backgroundLogger;
6
17
  protected connectionUUID: string;
7
18
  protected logger: SpikeLogger | null;
8
19
  toString(): string;
@@ -15,11 +26,17 @@ export declare class SpikeConnection {
15
26
  getAppId(): Promise<string>;
16
27
  getSpikeEndUserId(): Promise<string>;
17
28
  getCustomerEndUserId(): Promise<string>;
29
+ getCallbackUrl(): Promise<string>;
18
30
  close(): Promise<void>;
19
- pack(): Promise<string>;
20
- extractData<DataEntry extends SpikeDataEntry>(dataType: SpikeDataType<DataEntry>): Promise<SpikeData<DataEntry>>;
21
- extractDataInRange<DataEntry extends SpikeDataEntry>(dataType: SpikeDataType<DataEntry>, from: Date, to: Date): Promise<SpikeData<DataEntry>>;
31
+ extractData<DataEntry extends SpikeDataEntry>(config: SpikeExtractConfig<DataEntry>): Promise<SpikeData<DataEntry>>;
32
+ extractAndPostData<DataEntry extends SpikeDataEntry>(config: SpikeExtractConfig<DataEntry>): Promise<SpikeWebhookJob>;
33
+ enableBackgroundDelivery<DataEntry extends SpikeDataEntry>(dataTypes: SpikeDataType<DataEntry>[]): Promise<void>;
34
+ getBackgroundDeliveryDataTypes<DataEntry extends SpikeDataEntry>(): Promise<SpikeDataType<DataEntry>[]>;
35
+ setListener(listener: SpikeBackgroundDeliveriesLogger | null): Promise<void>;
22
36
  private setupLogger;
23
37
  private removeLogger;
38
+ private setupListener;
39
+ private removeListeners;
40
+ private convertDataType;
24
41
  }
25
42
  //# sourceMappingURL=SpikeConnection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SpikeConnection.d.ts","sourceRoot":"","sources":["../../src/SpikeConnection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAM/D,qBAAa,eAAe;IAC1B,OAAO,CAAC,gBAAgB,CAAiC;IAEzD,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAQ;IAE5C,QAAQ;IAIR,MAAM,IAAI,MAAM;gBAOJ,cAAc,EAAE,MAAM,EAAE,MAAM,GAAE,WAAW,GAAG,IAAW;IAK/D,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOpC,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC;IAO3C,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOzC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAM3B,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAMpC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAMvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAMvB,WAAW,CAAC,SAAS,SAAS,cAAc,EAChD,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,GACjC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAW1B,kBAAkB,CAAC,SAAS,SAAS,cAAc,EACvD,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,EAClC,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,IAAI,GACP,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAchC,OAAO,CAAC,WAAW;IAgCnB,OAAO,CAAC,YAAY;CASrB"}
1
+ {"version":3,"file":"SpikeConnection.d.ts","sourceRoot":"","sources":["../../src/SpikeConnection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAML,KAAK,aAAa,EAOnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAYzF,MAAM,MAAM,kBAAkB,CAAC,SAAS,SAAS,cAAc,IAC3D;IAAE,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;CAAE,GACtC;IAAE,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC;AAEjE,qBAAa,eAAe;IAC1B,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,aAAa,CAAiC;IAEtD,OAAO,CAAC,gBAAgB,CAAgD;IAExE,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAQ;IAE5C,QAAQ;IAIR,MAAM,IAAI,MAAM;gBAOJ,cAAc,EAAE,MAAM,EAAE,MAAM,GAAE,WAAW,GAAG,IAAW;IAK/D,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOpC,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC;IAO3C,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOzC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAM3B,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAMpC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAMvC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAMjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,WAAW,CAAC,SAAS,SAAS,cAAc,EAChD,MAAM,EAAE,kBAAkB,CAAC,SAAS,CAAC,GACpC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAuB1B,kBAAkB,CAAC,SAAS,SAAS,cAAc,EACvD,MAAM,EAAE,kBAAkB,CAAC,SAAS,CAAC,GACpC,OAAO,CAAC,eAAe,CAAC;IAuBrB,wBAAwB,CAAC,SAAS,SAAS,cAAc,EAC7D,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,GACpC,OAAO,CAAC,IAAI,CAAC;IAUV,8BAA8B,CAClC,SAAS,SAAS,cAAc,KAC7B,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;IAUlC,WAAW,CACf,QAAQ,EAAE,+BAA+B,GAAG,IAAI,GAC/C,OAAO,CAAC,IAAI,CAAC;IAShB,OAAO,CAAC,WAAW;IAgCnB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,eAAe;CA4BxB"}
@@ -18,4 +18,6 @@ export declare class SpikeServerException extends SpikeException {
18
18
  }
19
19
  export declare class SpikeUnpackException extends SpikeException {
20
20
  }
21
+ export declare class SpikeCallbackURLNotProvidedException extends SpikeException {
22
+ }
21
23
  //# sourceMappingURL=SpikeException.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SpikeException.d.ts","sourceRoot":"","sources":["../../src/SpikeException.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;CAAG;AAE5C,qBAAa,qCAAsC,SAAQ,cAAc;CAAG;AAC5E,qBAAa,gCAAiC,SAAQ,cAAc;CAAG;AACvE,qBAAa,gCAAiC,SAAQ,cAAc;CAAG;AACvE,qBAAa,8BAA+B,SAAQ,cAAc;CAAG;AACrE,qBAAa,gCAAiC,SAAQ,cAAc;CAAG;AACvE,qBAAa,kBAAmB,SAAQ,cAAc;CAAG;AACzD,qBAAa,mCAAoC,SAAQ,cAAc;CAAG;AAC1E,qBAAa,oBAAqB,SAAQ,cAAc;CAAG;AAC3D,qBAAa,oBAAqB,SAAQ,cAAc;CAAG"}
1
+ {"version":3,"file":"SpikeException.d.ts","sourceRoot":"","sources":["../../src/SpikeException.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;CAAG;AAE5C,qBAAa,qCAAsC,SAAQ,cAAc;CAAG;AAC5E,qBAAa,gCAAiC,SAAQ,cAAc;CAAG;AACvE,qBAAa,gCAAiC,SAAQ,cAAc;CAAG;AACvE,qBAAa,8BAA+B,SAAQ,cAAc;CAAG;AACrE,qBAAa,gCAAiC,SAAQ,cAAc;CAAG;AACvE,qBAAa,kBAAmB,SAAQ,cAAc;CAAG;AACzD,qBAAa,mCAAoC,SAAQ,cAAc;CAAG;AAC1E,qBAAa,oBAAqB,SAAQ,cAAc;CAAG;AAC3D,qBAAa,oBAAqB,SAAQ,cAAc;CAAG;AAC3D,qBAAa,oCAAqC,SAAQ,cAAc;CAAG"}
@@ -1,20 +1,16 @@
1
1
  import { SpikeDataTypes } from './DataModels/SpikeDataTypes';
2
2
  import type { SpikeDataType } from './DataTypes/SpikeDataType';
3
3
  import type { SpikeDataEntry } from './DataModels/SpikeData';
4
- import { SpikeConnection } from './SpikeConnection';
5
- import { SpikeWebhookConnection } from './SpikeWebhookConnection';
4
+ import { SpikeConnectionConfig } from './Spike';
5
+ import { SpikeConnection, SpikeExtractConfig } from './SpikeConnection';
6
6
  import type { SpikeLogger } from './SpikeLogger';
7
- import type { SpikeWebhookConnectionListener } from './SpikeWebhookConnectionListener';
7
+ import type { SpikeBackgroundDeliveriesLogger } from './SpikeBackgroundDeliveriesLogger';
8
8
  import type { SpikeEnvironment } from './SpikeEnvironment';
9
9
  declare const _default: {
10
- setEnvironment: (env: SpikeEnvironment) => Promise<void>;
11
- createConnection: (appId: string, authToken: string, customerEndUserId: string, logger?: SpikeLogger | null) => Promise<SpikeConnection>;
12
- createWebhookConnection: (appId: string, authToken: string, customerEndUserId: string, callbackUrl: string, logger?: SpikeLogger | null) => Promise<SpikeWebhookConnection>;
13
- unpackConnection: (connection: string, logger?: SpikeLogger | null) => Promise<SpikeConnection>;
14
- getBackgroundConnections: () => Promise<SpikeWebhookConnection[]>;
10
+ createConnection: (config: SpikeConnectionConfig, logger?: SpikeLogger | undefined) => Promise<SpikeConnection>;
11
+ getBackgroundConnections: () => Promise<SpikeConnection[]>;
15
12
  ensurePermissionsAreGranted: <DataEntry extends SpikeDataEntry>(permissions: SpikeDataType<DataEntry>[]) => Promise<void>;
16
- initialize: () => void;
17
13
  };
18
14
  export default _default;
19
- export { SpikeConnection, SpikeWebhookConnection, SpikeDataTypes, SpikeDataType, SpikeDataEntry, SpikeLogger, SpikeWebhookConnectionListener, SpikeEnvironment, };
15
+ export { SpikeConnection, SpikeDataTypes, SpikeDataType, SpikeDataEntry, SpikeLogger, SpikeBackgroundDeliveriesLogger, SpikeEnvironment, SpikeConnectionConfig, SpikeExtractConfig, };
20
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAU7D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;;;;;;;;;;AAE3D,wBAQE;AAEF,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,8BAA8B,EAC9B,gBAAgB,GACjB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAIL,qBAAqB,EACtB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;;;;;;AAE3D,wBAIE;AAEF,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,+BAA+B,EAC/B,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,GACnB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-spike-sdk",
3
- "version": "1.0.23",
3
+ "version": "2.1.1",
4
4
  "description": "Spike API for health and productivity data from wearables and IoT devices",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -5,7 +5,7 @@ folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1
5
5
 
6
6
  Pod::Spec.new do |s|
7
7
  s.name = "react-native-spike-sdk"
8
- s.version = "1.0.23"
8
+ s.version = "2.1.1"
9
9
  s.summary = "Spike API for health and productivity data from wearables and IoT devices"
10
10
 
11
11
  s.description = <<-DESC
@@ -25,7 +25,7 @@ Pod::Spec.new do |s|
25
25
  s.swift_version = "5"
26
26
 
27
27
  s.dependency "React-Core"
28
- s.dependency "SpikeSDK", "1.0.24"
28
+ s.dependency "SpikeSDK", "2.1.0"
29
29
 
30
30
  # Don't install the dependencies when we run `pod install` in the old architecture.
31
31
  if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
package/src/Spike.ts CHANGED
@@ -6,19 +6,18 @@ import type { SpikeEnvironment } from './SpikeEnvironment';
6
6
  import { SpikeException } from './SpikeException';
7
7
  import type { SpikeLogger } from './SpikeLogger';
8
8
  import { SpikeSdk } from './SpikeSdk';
9
- import { SpikeWebhookConnection } from './SpikeWebhookConnection';
10
9
 
11
- const setEnvironment = async (env: SpikeEnvironment): Promise<void> => {
12
- if (!SpikeSdk) throw new SpikeException();
13
-
14
- await SpikeSdk.setEnvironment(env);
10
+ type SpikeConnectionConfig = {
11
+ appId: string;
12
+ authToken: string;
13
+ customerEndUserId: string;
14
+ callbackUrl?: string;
15
+ env?: SpikeEnvironment;
15
16
  };
16
17
 
17
18
  const createConnection = async (
18
- appId: string,
19
- authToken: string,
20
- customerEndUserId: string,
21
- logger: SpikeLogger | null = null
19
+ config: SpikeConnectionConfig,
20
+ logger?: SpikeLogger
22
21
  ): Promise<SpikeConnection> => {
23
22
  if (!SpikeSdk) throw new SpikeException();
24
23
 
@@ -27,68 +26,23 @@ const createConnection = async (
27
26
 
28
27
  await SpikeSdk.createConnection(
29
28
  connectionUUID,
30
- appId,
31
- authToken,
32
- customerEndUserId,
33
- !!logger
34
- );
35
-
36
- return spikeConnection;
37
- };
38
-
39
- const createWebhookConnection = async (
40
- appId: string,
41
- authToken: string,
42
- customerEndUserId: string,
43
- callbackUrl: string,
44
- logger: SpikeLogger | null = null
45
- ): Promise<SpikeWebhookConnection> => {
46
- if (!SpikeSdk) throw new SpikeException();
47
-
48
- const connectionUUID = generateUUID();
49
- const spikeConnection = new SpikeWebhookConnection(connectionUUID, logger);
50
-
51
- await SpikeSdk.createWebhookConnection(
52
- connectionUUID,
53
- appId,
54
- authToken,
55
- customerEndUserId,
56
- callbackUrl,
29
+ config.appId,
30
+ config.authToken,
31
+ config.customerEndUserId,
32
+ config.callbackUrl ?? null,
33
+ config.env ?? 'PROD',
57
34
  !!logger
58
35
  );
59
36
 
60
37
  return spikeConnection;
61
38
  };
62
39
 
63
- const unpackConnection = async (
64
- connection: string,
65
- logger: SpikeLogger | null = null
66
- ): Promise<SpikeConnection> => {
67
- if (!SpikeSdk) throw new SpikeException();
68
-
69
- const connectionUUID = generateUUID();
70
- const webhookConnection = new SpikeWebhookConnection(connectionUUID, logger);
71
-
72
- await SpikeSdk.unpackConnection(connectionUUID, connection, !!logger);
73
-
74
- try {
75
- await webhookConnection.getCallbackUrl();
76
- return webhookConnection;
77
- } catch (error) {
78
- return webhookConnection as SpikeConnection;
79
- }
80
- };
81
-
82
- const getBackgroundConnections = async (): Promise<
83
- SpikeWebhookConnection[]
84
- > => {
40
+ const getBackgroundConnections = async (): Promise<SpikeConnection[]> => {
85
41
  if (!SpikeSdk) throw new SpikeException();
86
42
 
87
43
  const connectionUUIDs: string[] = await SpikeSdk.getBackgroundConnections();
88
44
 
89
- const connections = connectionUUIDs.map(
90
- (uuid) => new SpikeWebhookConnection(uuid)
91
- );
45
+ const connections = connectionUUIDs.map((uuid) => new SpikeConnection(uuid));
92
46
  return connections;
93
47
  };
94
48
 
@@ -103,12 +57,6 @@ const ensurePermissionsAreGranted = async <DataEntry extends SpikeDataEntry>(
103
57
  );
104
58
  };
105
59
 
106
- const initialize = () => {
107
- if (!SpikeSdk) throw new SpikeException();
108
-
109
- SpikeSdk.initialize();
110
- };
111
-
112
60
  function generateUUID() {
113
61
  const S4 = function () {
114
62
  let str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXZ';
@@ -136,11 +84,8 @@ function generateUUID() {
136
84
  }
137
85
 
138
86
  export {
139
- setEnvironment,
140
87
  createConnection,
141
- createWebhookConnection,
142
- unpackConnection,
143
88
  getBackgroundConnections,
144
89
  ensurePermissionsAreGranted,
145
- initialize,
90
+ SpikeConnectionConfig,
146
91
  };
@@ -0,0 +1,3 @@
1
+ export interface SpikeBackgroundDeliveriesLogger {
2
+ onBackgroundLog: (log: string) => void;
3
+ }
@@ -3,14 +3,42 @@ import { SpikeException } from './SpikeException';
3
3
  import type { SpikeLogger } from './SpikeLogger';
4
4
  import { SpikeSdk } from './SpikeSdk';
5
5
  import type { SpikeData, SpikeDataEntry } from './DataModels/SpikeData';
6
- import type { SpikeDataType } from './DataTypes/SpikeDataType';
6
+ import {
7
+ SpikeActivitiesStreamDataType,
8
+ SpikeActivitiesSummaryDataType,
9
+ SpikeBreathingDataType,
10
+ SpikeCaloriesDataType,
11
+ SpikeDistanceDataType,
12
+ type SpikeDataType,
13
+ SpikeGlucoseDataType,
14
+ SpikeHeartDataType,
15
+ SpikeOxygenSaturationDataType,
16
+ SpikeSleepDataType,
17
+ SpikeStepsDataType,
18
+ SpikeBodyDataType,
19
+ } from './DataTypes/SpikeDataType';
20
+ import type { SpikeWebhookJob } from './DataModels/SpikeWebhookJob';
21
+ import type { SpikeBackgroundDeliveriesLogger } from './SpikeBackgroundDeliveriesLogger';
7
22
 
8
23
  interface ILogEvent {
9
24
  connectionUUID: string;
10
25
  message: string;
11
26
  }
27
+
28
+ interface IBackgroundLog {
29
+ connectionUUID: string;
30
+ log: string;
31
+ }
32
+
33
+ export type SpikeExtractConfig<DataEntry extends SpikeDataEntry> =
34
+ | { dataType: SpikeDataType<DataEntry> }
35
+ | { dataType: SpikeDataType<DataEntry>; from: Date; to: Date };
36
+
12
37
  export class SpikeConnection {
13
38
  private logEventListener: NativeEventEmitter | undefined;
39
+ private eventListener: NativeEventEmitter | undefined;
40
+
41
+ private backgroundLogger: SpikeBackgroundDeliveriesLogger | null = null;
14
42
 
15
43
  protected connectionUUID: string;
16
44
  protected logger: SpikeLogger | null = null;
@@ -77,47 +105,102 @@ export class SpikeConnection {
77
105
  return await SpikeSdk.getCustomerEndUserId(this.connectionUUID);
78
106
  }
79
107
 
80
- async close(): Promise<void> {
108
+ async getCallbackUrl(): Promise<string> {
81
109
  if (!SpikeSdk) throw new SpikeException();
82
110
 
83
- await SpikeSdk.close(this.connectionUUID);
111
+ return await SpikeSdk.getCallbackUrl(this.connectionUUID);
84
112
  }
85
113
 
86
- async pack(): Promise<string> {
114
+ async close(): Promise<void> {
87
115
  if (!SpikeSdk) throw new SpikeException();
88
116
 
89
- return await SpikeSdk.pack(this.connectionUUID);
117
+ await SpikeSdk.close(this.connectionUUID);
118
+ this.removeListeners();
90
119
  }
91
120
 
92
121
  async extractData<DataEntry extends SpikeDataEntry>(
93
- dataType: SpikeDataType<DataEntry>
122
+ config: SpikeExtractConfig<DataEntry>
94
123
  ): Promise<SpikeData<DataEntry>> {
95
124
  if (!SpikeSdk) throw new SpikeException();
96
125
 
97
- const json: string = await SpikeSdk.extractData(
98
- this.connectionUUID,
99
- dataType.rawValue
100
- );
126
+ let json: string = '';
127
+
128
+ if ('from' in config) {
129
+ json = await SpikeSdk.extractDataInRange(
130
+ this.connectionUUID,
131
+ config.dataType.rawValue,
132
+ config.from.getTime(),
133
+ config.to.getTime()
134
+ );
135
+ } else {
136
+ json = await SpikeSdk.extractData(
137
+ this.connectionUUID,
138
+ config.dataType.rawValue
139
+ );
140
+ }
141
+
101
142
  const data: SpikeData<DataEntry> = JSON.parse(json);
102
143
  return data;
103
144
  }
104
145
 
105
- async extractDataInRange<DataEntry extends SpikeDataEntry>(
106
- dataType: SpikeDataType<DataEntry>,
107
- from: Date,
108
- to: Date
109
- ): Promise<SpikeData<DataEntry>> {
146
+ async extractAndPostData<DataEntry extends SpikeDataEntry>(
147
+ config: SpikeExtractConfig<DataEntry>
148
+ ): Promise<SpikeWebhookJob> {
110
149
  if (!SpikeSdk) throw new SpikeException();
111
150
 
112
- const json: string = await SpikeSdk.extractDataInRange(
151
+ let json: string = '';
152
+
153
+ if ('from' in config) {
154
+ json = await SpikeSdk.extractAndPostDataInRange(
155
+ this.connectionUUID,
156
+ config.dataType.rawValue,
157
+ config.from.getTime(),
158
+ config.to.getTime()
159
+ );
160
+ } else {
161
+ json = await SpikeSdk.extractAndPostData(
162
+ this.connectionUUID,
163
+ config.dataType.rawValue
164
+ );
165
+ }
166
+
167
+ const data: SpikeWebhookJob = JSON.parse(json);
168
+ return data;
169
+ }
170
+
171
+ async enableBackgroundDelivery<DataEntry extends SpikeDataEntry>(
172
+ dataTypes: SpikeDataType<DataEntry>[]
173
+ ): Promise<void> {
174
+ if (Platform.OS !== 'ios') return;
175
+ if (!SpikeSdk) throw new SpikeException();
176
+
177
+ await SpikeSdk.enableBackgroundDelivery(
113
178
  this.connectionUUID,
114
- dataType.rawValue,
115
- from.getTime(),
116
- to.getTime()
179
+ dataTypes.map((type) => type.rawValue)
117
180
  );
181
+ }
118
182
 
119
- const data: SpikeData<DataEntry> = JSON.parse(json);
120
- return data;
183
+ async getBackgroundDeliveryDataTypes<
184
+ DataEntry extends SpikeDataEntry
185
+ >(): Promise<SpikeDataType<DataEntry>[]> {
186
+ if (Platform.OS !== 'ios') return [];
187
+ if (!SpikeSdk) throw new SpikeException();
188
+
189
+ const dataTypes: string[] = await SpikeSdk.getBackgroundDeliveryDataTypes(
190
+ this.connectionUUID
191
+ );
192
+ return dataTypes.map((type) => this.convertDataType(type));
193
+ }
194
+
195
+ async setListener(
196
+ listener: SpikeBackgroundDeliveriesLogger | null
197
+ ): Promise<void> {
198
+ if (Platform.OS !== 'ios') return;
199
+ if (!SpikeSdk) throw new SpikeException();
200
+
201
+ this.setupListener(listener);
202
+
203
+ await SpikeSdk.setListener(this.connectionUUID);
121
204
  }
122
205
 
123
206
  private setupLogger(logger: SpikeLogger | null) {
@@ -161,4 +244,57 @@ export class SpikeConnection {
161
244
  this.logEventListener = undefined;
162
245
  this.logger = null;
163
246
  }
247
+
248
+ private setupListener(listener: SpikeBackgroundDeliveriesLogger | null) {
249
+ if (!SpikeSdk) return;
250
+
251
+ this.removeListeners();
252
+
253
+ this.eventListener = new NativeEventEmitter(SpikeSdk);
254
+ this.backgroundLogger = listener;
255
+
256
+ this.eventListener?.addListener(
257
+ 'onBackgroundLog',
258
+ (data: IBackgroundLog) => {
259
+ if (this.connectionUUID !== data.connectionUUID) return;
260
+ this.backgroundLogger?.onBackgroundLog(data.log);
261
+ }
262
+ );
263
+ }
264
+
265
+ private removeListeners() {
266
+ if (!this.eventListener) return;
267
+
268
+ this.eventListener.removeAllListeners('onBackgroundLog');
269
+ this.eventListener = undefined;
270
+ }
271
+
272
+ private convertDataType<DataEntry extends SpikeDataEntry>(
273
+ dataType: string
274
+ ): SpikeDataType<DataEntry> {
275
+ if (dataType === 'activities_summary') {
276
+ return new SpikeActivitiesSummaryDataType();
277
+ } else if (dataType === 'activities_stream') {
278
+ return new SpikeActivitiesStreamDataType();
279
+ } else if (dataType === 'breathing') {
280
+ return new SpikeBreathingDataType();
281
+ } else if (dataType === 'calories') {
282
+ return new SpikeCaloriesDataType();
283
+ } else if (dataType === 'distance') {
284
+ return new SpikeDistanceDataType();
285
+ } else if (dataType === 'glucose') {
286
+ return new SpikeGlucoseDataType();
287
+ } else if (dataType === 'heart') {
288
+ return new SpikeHeartDataType();
289
+ } else if (dataType === 'oxygen_saturation') {
290
+ return new SpikeOxygenSaturationDataType();
291
+ } else if (dataType === 'sleep') {
292
+ return new SpikeSleepDataType();
293
+ } else if (dataType === 'steps') {
294
+ return new SpikeStepsDataType();
295
+ } else if (dataType === 'body') {
296
+ return new SpikeBodyDataType();
297
+ }
298
+ return new SpikeStepsDataType();
299
+ }
164
300
  }
@@ -9,3 +9,4 @@ export class SpikePackException extends SpikeException {}
9
9
  export class SpikePermissionsNotGrantedException extends SpikeException {}
10
10
  export class SpikeServerException extends SpikeException {}
11
11
  export class SpikeUnpackException extends SpikeException {}
12
+ export class SpikeCallbackURLNotProvidedException extends SpikeException {}
package/src/index.ts CHANGED
@@ -2,37 +2,30 @@ import { SpikeDataTypes } from './DataModels/SpikeDataTypes';
2
2
  import type { SpikeDataType } from './DataTypes/SpikeDataType';
3
3
  import type { SpikeDataEntry } from './DataModels/SpikeData';
4
4
  import {
5
- setEnvironment,
6
5
  createConnection,
7
- createWebhookConnection,
8
- unpackConnection,
9
6
  getBackgroundConnections,
10
7
  ensurePermissionsAreGranted,
11
- initialize,
8
+ SpikeConnectionConfig,
12
9
  } from './Spike';
13
- import { SpikeConnection } from './SpikeConnection';
14
- import { SpikeWebhookConnection } from './SpikeWebhookConnection';
10
+ import { SpikeConnection, SpikeExtractConfig } from './SpikeConnection';
15
11
  import type { SpikeLogger } from './SpikeLogger';
16
- import type { SpikeWebhookConnectionListener } from './SpikeWebhookConnectionListener';
12
+ import type { SpikeBackgroundDeliveriesLogger } from './SpikeBackgroundDeliveriesLogger';
17
13
  import type { SpikeEnvironment } from './SpikeEnvironment';
18
14
 
19
15
  export default {
20
- setEnvironment,
21
16
  createConnection,
22
- createWebhookConnection,
23
- unpackConnection,
24
17
  getBackgroundConnections,
25
18
  ensurePermissionsAreGranted,
26
- initialize,
27
19
  };
28
20
 
29
21
  export {
30
22
  SpikeConnection,
31
- SpikeWebhookConnection,
32
23
  SpikeDataTypes,
33
24
  SpikeDataType,
34
25
  SpikeDataEntry,
35
26
  SpikeLogger,
36
- SpikeWebhookConnectionListener,
27
+ SpikeBackgroundDeliveriesLogger,
37
28
  SpikeEnvironment,
29
+ SpikeConnectionConfig,
30
+ SpikeExtractConfig,
38
31
  };
@@ -1,111 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.SpikeWebhookConnection = void 0;
7
- var _reactNative = require("react-native");
8
- var _SpikeConnection = require("./SpikeConnection");
9
- var _SpikeException = require("./SpikeException");
10
- var _SpikeSdk = require("./SpikeSdk");
11
- var _SpikeDataType = require("./DataTypes/SpikeDataType");
12
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
13
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
14
- function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
15
- class SpikeWebhookConnection extends _SpikeConnection.SpikeConnection {
16
- constructor() {
17
- super(...arguments);
18
- _defineProperty(this, "eventListener", void 0);
19
- _defineProperty(this, "webhookListener", null);
20
- }
21
- toString() {
22
- return 'This is wrapper class. To get connection data use `getAppId()`, `getSpikeEndUserId()`, `getCustomerEndUserId()`, `getCallbackUrl()` methods.';
23
- }
24
- toJSON() {
25
- return JSON.stringify({
26
- warning: 'This is wrapper class. To get connection data use `getAppId()`, `getSpikeEndUserId()`, `getCustomerEndUserId()`, `getCallbackUrl()` methods.'
27
- });
28
- }
29
- async getCallbackUrl() {
30
- if (!_SpikeSdk.SpikeSdk) throw new _SpikeException.SpikeException();
31
- return await _SpikeSdk.SpikeSdk.getCallbackUrl(this.connectionUUID);
32
- }
33
- async extractAndPostData(dataType) {
34
- if (!_SpikeSdk.SpikeSdk) throw new _SpikeException.SpikeException();
35
- const json = await _SpikeSdk.SpikeSdk.extractAndPostData(this.connectionUUID, dataType.rawValue);
36
- const data = JSON.parse(json);
37
- return data;
38
- }
39
- async extractAndPostDataInRange(dataType, from, to) {
40
- if (!_SpikeSdk.SpikeSdk) throw new _SpikeException.SpikeException();
41
- const json = await _SpikeSdk.SpikeSdk.extractAndPostDataInRange(this.connectionUUID, dataType.rawValue, from.getTime(), to.getTime());
42
- const data = JSON.parse(json);
43
- return data;
44
- }
45
- async enableBackgroundDelivery(dataTypes) {
46
- if (_reactNative.Platform.OS !== 'ios') return;
47
- if (!_SpikeSdk.SpikeSdk) throw new _SpikeException.SpikeException();
48
- await _SpikeSdk.SpikeSdk.enableBackgroundDelivery(this.connectionUUID, dataTypes.map(type => type.rawValue));
49
- }
50
- async getBackgroundDeliveryDataTypes() {
51
- if (_reactNative.Platform.OS !== 'ios') return [];
52
- if (!_SpikeSdk.SpikeSdk) throw new _SpikeException.SpikeException();
53
- const dataTypes = await _SpikeSdk.SpikeSdk.getBackgroundDeliveryDataTypes(this.connectionUUID);
54
- return dataTypes.map(type => this.convertDataType(type));
55
- }
56
- async setListener(listener) {
57
- if (_reactNative.Platform.OS !== 'ios') return;
58
- if (!_SpikeSdk.SpikeSdk) throw new _SpikeException.SpikeException();
59
- this.setupListener(listener);
60
- await _SpikeSdk.SpikeSdk.setListener(this.connectionUUID);
61
- }
62
- async close() {
63
- await super.close();
64
- this.removeListeners();
65
- }
66
- setupListener(listener) {
67
- var _this$eventListener;
68
- if (!_SpikeSdk.SpikeSdk) return;
69
- this.removeListeners();
70
- this.eventListener = new _reactNative.NativeEventEmitter(_SpikeSdk.SpikeSdk);
71
- this.webhookListener = listener;
72
- (_this$eventListener = this.eventListener) === null || _this$eventListener === void 0 ? void 0 : _this$eventListener.addListener('onBackgroundLog', data => {
73
- var _this$webhookListener;
74
- if (this.connectionUUID !== data.connectionUUID) return;
75
- (_this$webhookListener = this.webhookListener) === null || _this$webhookListener === void 0 ? void 0 : _this$webhookListener.onBackgroundLog(data.log);
76
- });
77
- }
78
- removeListeners() {
79
- if (!this.eventListener) return;
80
- this.eventListener.removeAllListeners('onBackgroundLog');
81
- this.eventListener = undefined;
82
- }
83
- convertDataType(dataType) {
84
- if (dataType === 'activities_summary') {
85
- return new _SpikeDataType.SpikeActivitiesSummaryDataType();
86
- } else if (dataType === 'activities_stream') {
87
- return new _SpikeDataType.SpikeActivitiesStreamDataType();
88
- } else if (dataType === 'breathing') {
89
- return new _SpikeDataType.SpikeBreathingDataType();
90
- } else if (dataType === 'calories') {
91
- return new _SpikeDataType.SpikeCaloriesDataType();
92
- } else if (dataType === 'distance') {
93
- return new _SpikeDataType.SpikeDistanceDataType();
94
- } else if (dataType === 'glucose') {
95
- return new _SpikeDataType.SpikeGlucoseDataType();
96
- } else if (dataType === 'heart') {
97
- return new _SpikeDataType.SpikeHeartDataType();
98
- } else if (dataType === 'oxygen_saturation') {
99
- return new _SpikeDataType.SpikeOxygenSaturationDataType();
100
- } else if (dataType === 'sleep') {
101
- return new _SpikeDataType.SpikeSleepDataType();
102
- } else if (dataType === 'steps') {
103
- return new _SpikeDataType.SpikeStepsDataType();
104
- } else if (dataType === 'body') {
105
- return new _SpikeDataType.SpikeBodyDataType();
106
- }
107
- return new _SpikeDataType.SpikeStepsDataType();
108
- }
109
- }
110
- exports.SpikeWebhookConnection = SpikeWebhookConnection;
111
- //# sourceMappingURL=SpikeWebhookConnection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["SpikeWebhookConnection","SpikeConnection","toString","toJSON","JSON","stringify","warning","getCallbackUrl","SpikeSdk","SpikeException","connectionUUID","extractAndPostData","dataType","json","rawValue","data","parse","extractAndPostDataInRange","from","to","getTime","enableBackgroundDelivery","dataTypes","Platform","OS","map","type","getBackgroundDeliveryDataTypes","convertDataType","setListener","listener","setupListener","close","removeListeners","eventListener","NativeEventEmitter","webhookListener","addListener","onBackgroundLog","log","removeAllListeners","undefined","SpikeActivitiesSummaryDataType","SpikeActivitiesStreamDataType","SpikeBreathingDataType","SpikeCaloriesDataType","SpikeDistanceDataType","SpikeGlucoseDataType","SpikeHeartDataType","SpikeOxygenSaturationDataType","SpikeSleepDataType","SpikeStepsDataType","SpikeBodyDataType"],"sourceRoot":"../../src","sources":["SpikeWebhookConnection.ts"],"mappings":"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"}