spotny-sdk 0.2.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.

Potentially problematic release.


This version of spotny-sdk might be problematic. Click here for more details.

@@ -0,0 +1,120 @@
1
+ #import "SpotnySdk.h"
2
+ // Auto-generated Swift header (contains SpotnyBeaconScanner)
3
+ #import "SpotnySdk-Swift.h"
4
+
5
+ @implementation SpotnySdk {
6
+ SpotnyBeaconScanner *_scanner;
7
+ BOOL _hasListeners;
8
+ }
9
+
10
+ // ── Module registration ─────────────────────────────────────────────────────
11
+
12
+ RCT_EXPORT_MODULE()
13
+
14
+ + (BOOL)requiresMainQueueSetup {
15
+ return YES;
16
+ }
17
+
18
+ - (instancetype)init {
19
+ if (self = [super init]) {
20
+ __weak SpotnySdk *weakSelf = self;
21
+ _scanner = [[SpotnyBeaconScanner alloc] initWithEventCallback:^(NSString *name, NSDictionary *body) {
22
+ SpotnySdk *strongSelf = weakSelf;
23
+ if (strongSelf && strongSelf->_hasListeners) {
24
+ [strongSelf sendEventWithName:name body:body];
25
+ }
26
+ }];
27
+ }
28
+ return self;
29
+ }
30
+
31
+ // ── RCTEventEmitter ─────────────────────────────────────────────────────────
32
+
33
+ - (NSArray<NSString *> *)supportedEvents {
34
+ return @[@"onBeaconsRanged", @"onBeaconRegionEvent"];
35
+ }
36
+
37
+ - (void)startObserving {
38
+ _hasListeners = YES;
39
+ }
40
+
41
+ - (void)stopObserving {
42
+ _hasListeners = NO;
43
+ }
44
+
45
+ // ── Turbo Module: addListener / removeListeners ─────────────────────────────
46
+ // These are required by the codegen spec when the module emits events.
47
+
48
+ - (void)addListener:(NSString *)eventName {
49
+ [super addListener:eventName];
50
+ }
51
+
52
+ - (void)removeListeners:(double)count {
53
+ [super removeListeners:count];
54
+ }
55
+
56
+ // ── Method implementations ───────────────────────────────────────────────────
57
+
58
+ - (void)startScanner:(NSString *)userUUID
59
+ userId:(NSNumber *)userId
60
+ resolve:(RCTPromiseResolveBlock)resolve
61
+ reject:(RCTPromiseRejectBlock)reject {
62
+ [_scanner startScannerWithUserUUID:userUUID userId:userId resolve:resolve reject:reject];
63
+ }
64
+
65
+ - (void)stopScanner:(RCTPromiseResolveBlock)resolve
66
+ reject:(RCTPromiseRejectBlock)reject {
67
+ [_scanner stopScannerWithResolve:resolve reject:reject];
68
+ }
69
+
70
+ - (void)isScanning:(RCTPromiseResolveBlock)resolve
71
+ reject:(RCTPromiseRejectBlock)reject {
72
+ [_scanner isScanningWithResolve:resolve reject:reject];
73
+ }
74
+
75
+ - (void)configure:(NSDictionary *)config
76
+ resolve:(RCTPromiseResolveBlock)resolve
77
+ reject:(RCTPromiseRejectBlock)reject {
78
+ [_scanner configureWith:config resolve:resolve reject:reject];
79
+ }
80
+
81
+ - (void)requestNotificationPermissions:(RCTPromiseResolveBlock)resolve
82
+ reject:(RCTPromiseRejectBlock)reject {
83
+ [_scanner requestNotificationPermissionsWithResolve:resolve reject:reject];
84
+ }
85
+
86
+ - (void)getDebugLogs:(RCTPromiseResolveBlock)resolve
87
+ reject:(RCTPromiseRejectBlock)reject {
88
+ [_scanner getDebugLogsWithResolve:resolve reject:reject];
89
+ }
90
+
91
+ - (void)clearDebugLogs:(RCTPromiseResolveBlock)resolve
92
+ reject:(RCTPromiseRejectBlock)reject {
93
+ [_scanner clearDebugLogsWithResolve:resolve reject:reject];
94
+ }
95
+
96
+ - (void)setDebounceInterval:(double)interval
97
+ resolve:(RCTPromiseResolveBlock)resolve
98
+ reject:(RCTPromiseRejectBlock)reject {
99
+ [_scanner setDebounceInterval:interval resolve:resolve reject:reject];
100
+ }
101
+
102
+ - (void)clearDebounceCache:(RCTPromiseResolveBlock)resolve
103
+ reject:(RCTPromiseRejectBlock)reject {
104
+ [_scanner clearDebounceCacheWithResolve:resolve reject:reject];
105
+ }
106
+
107
+ - (void)getDebounceStatus:(RCTPromiseResolveBlock)resolve
108
+ reject:(RCTPromiseRejectBlock)reject {
109
+ [_scanner getDebounceStatusWithResolve:resolve reject:reject];
110
+ }
111
+
112
+ // ── TurboModule JSI bridge ───────────────────────────────────────────────────
113
+
114
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
115
+ (const facebook::react::ObjCTurboModule::InitParams &)params
116
+ {
117
+ return std::make_shared<facebook::react::NativeSpotnySdkSpecJSI>(params);
118
+ }
119
+
120
+ @end
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ import { TurboModuleRegistry } from 'react-native';
4
+ export default TurboModuleRegistry.getEnforcing('SpotnySdk');
5
+ //# sourceMappingURL=NativeSpotnySdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeSpotnySdk.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AA4BpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,WAAW,CAAC","ignoreList":[]}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ import { NativeEventEmitter, NativeModules } from 'react-native';
4
+ import NativeSpotnySdk from "./NativeSpotnySdk.js";
5
+
6
+ // ── Event names ──────────────────────────────────────────────────────────────
7
+ export const SpotnyEvents = {
8
+ ON_BEACONS_RANGED: 'onBeaconsRanged',
9
+ ON_BEACON_REGION_EVENT: 'onBeaconRegionEvent'
10
+ };
11
+
12
+ // ── Types ────────────────────────────────────────────────────────────────────
13
+
14
+ // ── Internal event emitter ───────────────────────────────────────────────────
15
+ const eventEmitter = new NativeEventEmitter(NativeModules.SpotnySdk);
16
+
17
+ // ── Core scanning ────────────────────────────────────────────────────────────
18
+
19
+ /**
20
+ * Start beacon scanning.
21
+ * @param userUUID A unique string identifying this installation / user session.
22
+ * @param userId Optional authenticated user ID.
23
+ */
24
+ export function startScanner(userUUID, userId) {
25
+ return NativeSpotnySdk.startScanner(userUUID, userId ?? null);
26
+ }
27
+
28
+ /** Stop beacon scanning and clean up all state. */
29
+ export function stopScanner() {
30
+ return NativeSpotnySdk.stopScanner();
31
+ }
32
+
33
+ /** Returns `true` if the SDK is currently scanning. */
34
+ export function isScanning() {
35
+ return NativeSpotnySdk.isScanning();
36
+ }
37
+
38
+ // ── Configuration ────────────────────────────────────────────────────────────
39
+
40
+ /**
41
+ * Override SDK configuration at runtime.
42
+ * Must be called **before** `startScanner`.
43
+ */
44
+ export function configure(config) {
45
+ return NativeSpotnySdk.configure(config);
46
+ }
47
+
48
+ // ── Permissions ──────────────────────────────────────────────────────────────
49
+
50
+ /** (iOS) Prompt the user for local-notification permissions. */
51
+ export function requestNotificationPermissions() {
52
+ return NativeSpotnySdk.requestNotificationPermissions();
53
+ }
54
+
55
+ // ── Debug helpers ─────────────────────────────────────────────────────────────
56
+
57
+ /** Read the on-device debug log file. */
58
+ export function getDebugLogs() {
59
+ return NativeSpotnySdk.getDebugLogs();
60
+ }
61
+
62
+ /** Delete the on-device debug log file. */
63
+ export function clearDebugLogs() {
64
+ return NativeSpotnySdk.clearDebugLogs();
65
+ }
66
+
67
+ // ── Debounce helpers ──────────────────────────────────────────────────────────
68
+
69
+ /** Override the proximity-event debounce interval (seconds). */
70
+ export function setDebounceInterval(interval) {
71
+ return NativeSpotnySdk.setDebounceInterval(interval);
72
+ }
73
+
74
+ /** Clear the debounce / cooldown cache for all beacons. */
75
+ export function clearDebounceCache() {
76
+ return NativeSpotnySdk.clearDebounceCache();
77
+ }
78
+
79
+ /** Return the current debounce status for all tracked beacons. */
80
+ export function getDebounceStatus() {
81
+ return NativeSpotnySdk.getDebounceStatus();
82
+ }
83
+
84
+ // ── Event subscriptions ───────────────────────────────────────────────────────
85
+
86
+ /**
87
+ * Subscribe to continuous ranging updates.
88
+ * The callback fires roughly every second while beacons are in range.
89
+ */
90
+ export function addBeaconsRangedListener(callback) {
91
+ return eventEmitter.addListener(SpotnyEvents.ON_BEACONS_RANGED, callback);
92
+ }
93
+
94
+ /**
95
+ * Subscribe to region enter/exit events.
96
+ * These fire in all app states (foreground, background, terminated on iOS).
97
+ */
98
+ export function addBeaconRegionListener(callback) {
99
+ return eventEmitter.addListener(SpotnyEvents.ON_BEACON_REGION_EVENT, callback);
100
+ }
101
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeEventEmitter","NativeModules","NativeSpotnySdk","SpotnyEvents","ON_BEACONS_RANGED","ON_BEACON_REGION_EVENT","eventEmitter","SpotnySdk","startScanner","userUUID","userId","stopScanner","isScanning","configure","config","requestNotificationPermissions","getDebugLogs","clearDebugLogs","setDebounceInterval","interval","clearDebounceCache","getDebounceStatus","addBeaconsRangedListener","callback","addListener","addBeaconRegionListener"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,kBAAkB,EAAEC,aAAa,QAAQ,cAAc;AAChE,OAAOC,eAAe,MAAM,sBAAmB;;AAE/C;AACA,OAAO,MAAMC,YAAY,GAAG;EAC1BC,iBAAiB,EAAE,iBAAiB;EACpCC,sBAAsB,EAAE;AAC1B,CAAU;;AAEV;;AAgCA;AACA,MAAMC,YAAY,GAAG,IAAIN,kBAAkB,CAACC,aAAa,CAACM,SAAS,CAAC;;AAEpE;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAC1BC,QAAgB,EAChBC,MAAsB,EACL;EACjB,OAAOR,eAAe,CAACM,YAAY,CAACC,QAAQ,EAAEC,MAAM,IAAI,IAAI,CAAC;AAC/D;;AAEA;AACA,OAAO,SAASC,WAAWA,CAAA,EAAoB;EAC7C,OAAOT,eAAe,CAACS,WAAW,CAAC,CAAC;AACtC;;AAEA;AACA,OAAO,SAASC,UAAUA,CAAA,EAAqB;EAC7C,OAAOV,eAAe,CAACU,UAAU,CAAC,CAAC;AACrC;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAACC,MAAuB,EAAmB;EAClE,OAAOZ,eAAe,CAACW,SAAS,CAACC,MAAgB,CAAC;AACpD;;AAEA;;AAEA;AACA,OAAO,SAASC,8BAA8BA,CAAA,EAAoB;EAChE,OAAOb,eAAe,CAACa,8BAA8B,CAAC,CAAC;AACzD;;AAEA;;AAEA;AACA,OAAO,SAASC,YAAYA,CAAA,EAAoB;EAC9C,OAAOd,eAAe,CAACc,YAAY,CAAC,CAAC;AACvC;;AAEA;AACA,OAAO,SAASC,cAAcA,CAAA,EAAoB;EAChD,OAAOf,eAAe,CAACe,cAAc,CAAC,CAAC;AACzC;;AAEA;;AAEA;AACA,OAAO,SAASC,mBAAmBA,CAACC,QAAgB,EAAmB;EACrE,OAAOjB,eAAe,CAACgB,mBAAmB,CAACC,QAAQ,CAAC;AACtD;;AAEA;AACA,OAAO,SAASC,kBAAkBA,CAAA,EAAoB;EACpD,OAAOlB,eAAe,CAACkB,kBAAkB,CAAC,CAAC;AAC7C;;AAEA;AACA,OAAO,SAASC,iBAAiBA,CAAA,EAAoB;EACnD,OAAOnB,eAAe,CAACmB,iBAAiB,CAAC,CAAC;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,wBAAwBA,CACtCC,QAA4C,EAC5C;EACA,OAAOjB,YAAY,CAACkB,WAAW,CAC7BrB,YAAY,CAACC,iBAAiB,EAC9BmB,QACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASE,uBAAuBA,CACrCF,QAA4C,EAC5C;EACA,OAAOjB,YAAY,CAACkB,WAAW,CAC7BrB,YAAY,CAACE,sBAAsB,EACnCkB,QACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,18 @@
1
+ import { type TurboModule } from 'react-native';
2
+ export interface Spec extends TurboModule {
3
+ startScanner(userUUID: string, userId: number | null): Promise<string>;
4
+ stopScanner(): Promise<string>;
5
+ isScanning(): Promise<boolean>;
6
+ configure(config: Object): Promise<string>;
7
+ requestNotificationPermissions(): Promise<string>;
8
+ getDebugLogs(): Promise<string>;
9
+ clearDebugLogs(): Promise<string>;
10
+ setDebounceInterval(interval: number): Promise<string>;
11
+ clearDebounceCache(): Promise<string>;
12
+ getDebounceStatus(): Promise<Object>;
13
+ addListener(eventName: string): void;
14
+ removeListeners(count: number): void;
15
+ }
16
+ declare const _default: Spec;
17
+ export default _default;
18
+ //# sourceMappingURL=NativeSpotnySdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeSpotnySdk.d.ts","sourceRoot":"","sources":["../../../src/NativeSpotnySdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAG/B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAG3C,8BAA8B,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAGlD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAGlC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAGrC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;;AAED,wBAAmE"}
@@ -0,0 +1,68 @@
1
+ export declare const SpotnyEvents: {
2
+ readonly ON_BEACONS_RANGED: "onBeaconsRanged";
3
+ readonly ON_BEACON_REGION_EVENT: "onBeaconRegionEvent";
4
+ };
5
+ export type BeaconData = {
6
+ uuid: string;
7
+ major: number;
8
+ minor: number;
9
+ /** Estimated distance in metres */
10
+ distance: number;
11
+ rssi: number;
12
+ /** 'immediate' | 'near' | 'far' | 'unknown' */
13
+ proximity: string;
14
+ };
15
+ export type BeaconRangedEvent = {
16
+ beacons: BeaconData[];
17
+ region: string;
18
+ };
19
+ export type BeaconRegionEvent = {
20
+ region: string;
21
+ /** 'enter' | 'exit' | 'determined' */
22
+ event: 'enter' | 'exit' | 'determined';
23
+ state?: 'inside' | 'outside' | 'unknown';
24
+ };
25
+ export type SpotnySdkConfig = {
26
+ /** Base URL for the backend API (default: https://api.spotny.app) */
27
+ backendURL?: string;
28
+ /** Maximum BLE detection distance in metres (default: 8.0) */
29
+ maxDetectionDistance?: number;
30
+ };
31
+ /**
32
+ * Start beacon scanning.
33
+ * @param userUUID A unique string identifying this installation / user session.
34
+ * @param userId Optional authenticated user ID.
35
+ */
36
+ export declare function startScanner(userUUID: string, userId?: number | null): Promise<string>;
37
+ /** Stop beacon scanning and clean up all state. */
38
+ export declare function stopScanner(): Promise<string>;
39
+ /** Returns `true` if the SDK is currently scanning. */
40
+ export declare function isScanning(): Promise<boolean>;
41
+ /**
42
+ * Override SDK configuration at runtime.
43
+ * Must be called **before** `startScanner`.
44
+ */
45
+ export declare function configure(config: SpotnySdkConfig): Promise<string>;
46
+ /** (iOS) Prompt the user for local-notification permissions. */
47
+ export declare function requestNotificationPermissions(): Promise<string>;
48
+ /** Read the on-device debug log file. */
49
+ export declare function getDebugLogs(): Promise<string>;
50
+ /** Delete the on-device debug log file. */
51
+ export declare function clearDebugLogs(): Promise<string>;
52
+ /** Override the proximity-event debounce interval (seconds). */
53
+ export declare function setDebounceInterval(interval: number): Promise<string>;
54
+ /** Clear the debounce / cooldown cache for all beacons. */
55
+ export declare function clearDebounceCache(): Promise<string>;
56
+ /** Return the current debounce status for all tracked beacons. */
57
+ export declare function getDebounceStatus(): Promise<Object>;
58
+ /**
59
+ * Subscribe to continuous ranging updates.
60
+ * The callback fires roughly every second while beacons are in range.
61
+ */
62
+ export declare function addBeaconsRangedListener(callback: (event: BeaconRangedEvent) => void): import("react-native").EventSubscription;
63
+ /**
64
+ * Subscribe to region enter/exit events.
65
+ * These fire in all app states (foreground, background, terminated on iOS).
66
+ */
67
+ export declare function addBeaconRegionListener(callback: (event: BeaconRegionEvent) => void): import("react-native").EventSubscription;
68
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAIX,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC;IACvC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAOF;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,mDAAmD;AACnD,wBAAgB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAE7C;AAED,uDAAuD;AACvD,wBAAgB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAE7C;AAID;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAElE;AAID,gEAAgE;AAChE,wBAAgB,8BAA8B,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhE;AAID,yCAAyC;AACzC,wBAAgB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAE9C;AAED,2CAA2C;AAC3C,wBAAgB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhD;AAID,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErE;AAED,2DAA2D;AAC3D,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAEpD;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAEnD;AAID;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,4CAM7C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,4CAM7C"}
package/package.json ADDED
@@ -0,0 +1,169 @@
1
+ {
2
+ "name": "spotny-sdk",
3
+ "version": "0.2.0",
4
+ "description": "Beacon Scanner",
5
+ "main": "./lib/module/index.js",
6
+ "types": "./lib/typescript/src/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "source": "./src/index.tsx",
10
+ "types": "./lib/typescript/src/index.d.ts",
11
+ "default": "./lib/module/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "files": [
16
+ "src",
17
+ "lib",
18
+ "android",
19
+ "ios",
20
+ "cpp",
21
+ "*.podspec",
22
+ "react-native.config.js",
23
+ "!ios/build",
24
+ "!android/build",
25
+ "!android/gradle",
26
+ "!android/gradlew",
27
+ "!android/gradlew.bat",
28
+ "!android/local.properties",
29
+ "!**/__tests__",
30
+ "!**/__fixtures__",
31
+ "!**/__mocks__",
32
+ "!**/.*"
33
+ ],
34
+ "scripts": {
35
+ "example": "yarn workspace spotny-sdk-example",
36
+ "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
37
+ "prepare": "bob build",
38
+ "typecheck": "tsc",
39
+ "lint": "eslint \"**/*.{js,ts,tsx}\"",
40
+ "test": "jest",
41
+ "release": "release-it --only-version"
42
+ },
43
+ "keywords": [
44
+ "react-native",
45
+ "ios",
46
+ "android"
47
+ ],
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "git+https://github.com/Spotny-SA/spotny-sdk.git"
51
+ },
52
+ "author": "Ahmad Freijeh <ahmadbfreijeh@gmail.com> (https://github.com/ahmadfreijeh)",
53
+ "license": "MIT",
54
+ "bugs": {
55
+ "url": "https://github.com/Spotny-SA/spotny-sdk/issues"
56
+ },
57
+ "homepage": "https://github.com/Spotny-SA/spotny-sdk#readme",
58
+ "publishConfig": {
59
+ "registry": "https://registry.npmjs.org/"
60
+ },
61
+ "devDependencies": {
62
+ "@commitlint/config-conventional": "^19.8.1",
63
+ "@eslint/compat": "^1.3.2",
64
+ "@eslint/eslintrc": "^3.3.1",
65
+ "@eslint/js": "^9.35.0",
66
+ "@react-native/babel-preset": "0.83.0",
67
+ "@react-native/eslint-config": "0.83.0",
68
+ "@release-it/conventional-changelog": "^10.0.1",
69
+ "@types/jest": "^29.5.14",
70
+ "@types/react": "^19.2.0",
71
+ "commitlint": "^19.8.1",
72
+ "del-cli": "^6.0.0",
73
+ "eslint": "^9.35.0",
74
+ "eslint-config-prettier": "^10.1.8",
75
+ "eslint-plugin-prettier": "^5.5.4",
76
+ "jest": "^29.7.0",
77
+ "lefthook": "^2.0.3",
78
+ "prettier": "^2.8.8",
79
+ "react": "19.2.0",
80
+ "react-native": "0.83.0",
81
+ "react-native-builder-bob": "^0.40.18",
82
+ "release-it": "^19.0.4",
83
+ "turbo": "^2.5.6",
84
+ "typescript": "^5.9.2"
85
+ },
86
+ "peerDependencies": {
87
+ "react": "*",
88
+ "react-native": "*"
89
+ },
90
+ "workspaces": [
91
+ "example"
92
+ ],
93
+ "packageManager": "yarn@4.11.0",
94
+ "react-native-builder-bob": {
95
+ "source": "src",
96
+ "output": "lib",
97
+ "targets": [
98
+ [
99
+ "module",
100
+ {
101
+ "esm": true
102
+ }
103
+ ],
104
+ [
105
+ "typescript",
106
+ {
107
+ "project": "tsconfig.build.json"
108
+ }
109
+ ]
110
+ ]
111
+ },
112
+ "codegenConfig": {
113
+ "name": "SpotnySdkSpec",
114
+ "type": "modules",
115
+ "jsSrcsDir": "src",
116
+ "android": {
117
+ "javaPackageName": "com.spotnysdk"
118
+ }
119
+ },
120
+ "prettier": {
121
+ "quoteProps": "consistent",
122
+ "singleQuote": true,
123
+ "tabWidth": 2,
124
+ "trailingComma": "es5",
125
+ "useTabs": false
126
+ },
127
+ "jest": {
128
+ "preset": "react-native",
129
+ "modulePathIgnorePatterns": [
130
+ "<rootDir>/example/node_modules",
131
+ "<rootDir>/lib/"
132
+ ]
133
+ },
134
+ "commitlint": {
135
+ "extends": [
136
+ "@commitlint/config-conventional"
137
+ ]
138
+ },
139
+ "release-it": {
140
+ "git": {
141
+ "commitMessage": "chore: release ${version}",
142
+ "tagName": "v${version}"
143
+ },
144
+ "npm": {
145
+ "publish": true
146
+ },
147
+ "github": {
148
+ "release": true
149
+ },
150
+ "plugins": {
151
+ "@release-it/conventional-changelog": {
152
+ "preset": {
153
+ "name": "angular"
154
+ }
155
+ }
156
+ }
157
+ },
158
+ "create-react-native-library": {
159
+ "type": "turbo-module",
160
+ "languages": "kotlin-objc",
161
+ "tools": [
162
+ "eslint",
163
+ "jest",
164
+ "lefthook",
165
+ "release-it"
166
+ ],
167
+ "version": "0.57.2"
168
+ }
169
+ }
@@ -0,0 +1,29 @@
1
+ import { TurboModuleRegistry, type TurboModule } from 'react-native';
2
+
3
+ export interface Spec extends TurboModule {
4
+ // ── Core scanning ──────────────────────────────────────────────────────────
5
+ startScanner(userUUID: string, userId: number | null): Promise<string>;
6
+ stopScanner(): Promise<string>;
7
+ isScanning(): Promise<boolean>;
8
+
9
+ // ── Configuration ──────────────────────────────────────────────────────────
10
+ configure(config: Object): Promise<string>;
11
+
12
+ // ── Permissions ────────────────────────────────────────────────────────────
13
+ requestNotificationPermissions(): Promise<string>;
14
+
15
+ // ── Debug ──────────────────────────────────────────────────────────────────
16
+ getDebugLogs(): Promise<string>;
17
+ clearDebugLogs(): Promise<string>;
18
+
19
+ // ── Debounce helpers ───────────────────────────────────────────────────────
20
+ setDebounceInterval(interval: number): Promise<string>;
21
+ clearDebounceCache(): Promise<string>;
22
+ getDebounceStatus(): Promise<Object>;
23
+
24
+ // ── Required by NativeEventEmitter ────────────────────────────────────────
25
+ addListener(eventName: string): void;
26
+ removeListeners(count: number): void;
27
+ }
28
+
29
+ export default TurboModuleRegistry.getEnforcing<Spec>('SpotnySdk');