spotny-sdk 1.0.17 → 1.0.19
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.
|
@@ -53,6 +53,8 @@ public class SpotnyBeaconScanner: NSObject {
|
|
|
53
53
|
// backendURL and kontaktAPIKey are fixed — not overridable by consumers.
|
|
54
54
|
// backendURL is var to allow owner-only debug override via superDebugConfig in initialize().
|
|
55
55
|
private var backendURL: String = "https://api.spotny.app"
|
|
56
|
+
/// When true, full API response bodies (success and error) are printed to the console.
|
|
57
|
+
private var debugMode: Bool = false
|
|
56
58
|
private let apiBasePath: String = "/api/app/sdk"
|
|
57
59
|
private let kontaktAPIKey: String = "mgrz08TOKNHafeY02cWIs9mxUHbynNQJ"
|
|
58
60
|
private var maxDetectionDistance: Double = 8.0
|
|
@@ -95,8 +97,6 @@ public class SpotnyBeaconScanner: NSObject {
|
|
|
95
97
|
private var campaignFetchInProgress: [String: Bool] = [:]
|
|
96
98
|
private var campaignFetched: [String: Bool] = [:]
|
|
97
99
|
private var campaignFetchCooldown: [String: Date] = [:] // backoff after failed fetch
|
|
98
|
-
// session_id returned by /proximity NEARBY response — sent with every /track heartbeat
|
|
99
|
-
private var beaconSessionIds: [String: String] = [:]
|
|
100
100
|
|
|
101
101
|
// MARK: - Init
|
|
102
102
|
|
|
@@ -244,6 +244,10 @@ public class SpotnyBeaconScanner: NSObject {
|
|
|
244
244
|
backendURL = url
|
|
245
245
|
print("⚠️ [OWNER DEBUG] SpotnySDK: backendURL overridden → \(backendURL)")
|
|
246
246
|
}
|
|
247
|
+
if let debug = config["debug"] as? Bool {
|
|
248
|
+
debugMode = debug
|
|
249
|
+
print("⚙️ SpotnySDK: debugMode = \(debug)")
|
|
250
|
+
}
|
|
247
251
|
guard let token = config["token"] as? String, !token.isEmpty else {
|
|
248
252
|
reject("MISSING_TOKEN", "initialize() requires a token", nil)
|
|
249
253
|
return
|
|
@@ -584,14 +588,23 @@ public class SpotnyBeaconScanner: NSObject {
|
|
|
584
588
|
completion(.failure(error)); return
|
|
585
589
|
}
|
|
586
590
|
|
|
587
|
-
URLSession.shared.dataTask(with: req) { data, response, error in
|
|
591
|
+
URLSession.shared.dataTask(with: req) { [weak self] data, response, error in
|
|
588
592
|
DispatchQueue.main.async {
|
|
589
593
|
if bg != .invalid { UIApplication.shared.endBackgroundTask(bg); bg = .invalid }
|
|
590
|
-
if let error = error {
|
|
594
|
+
if let error = error {
|
|
595
|
+
if self?.debugMode == true {
|
|
596
|
+
print("🔍 SpotnySDK [DEBUG] \(endpoint) → error: \(error)")
|
|
597
|
+
}
|
|
598
|
+
completion(.failure(error)); return
|
|
599
|
+
}
|
|
591
600
|
guard let http = response as? HTTPURLResponse, let data = data else {
|
|
592
601
|
completion(.failure(NSError(domain: "SpotnySDK", code: -2,
|
|
593
602
|
userInfo: [NSLocalizedDescriptionKey: "Bad response"]))); return
|
|
594
603
|
}
|
|
604
|
+
if self?.debugMode == true {
|
|
605
|
+
let body = String(data: data, encoding: .utf8) ?? "(unreadable)"
|
|
606
|
+
print("🔍 SpotnySDK [DEBUG] \(endpoint) → \(http.statusCode): \(body)")
|
|
607
|
+
}
|
|
595
608
|
completion(.success((http.statusCode, data)))
|
|
596
609
|
}
|
|
597
610
|
}.resume()
|
|
@@ -639,7 +652,6 @@ public class SpotnyBeaconScanner: NSObject {
|
|
|
639
652
|
return
|
|
640
653
|
}
|
|
641
654
|
if let cid = campaign.campaignId { payload["campaign_id"] = cid }
|
|
642
|
-
if let sid = beaconSessionIds[key] { payload["session_id"] = sid }
|
|
643
655
|
} else {
|
|
644
656
|
if let cid = activeCampaigns[key]?.campaignId { payload["campaign_id"] = cid }
|
|
645
657
|
}
|
|
@@ -649,14 +661,6 @@ public class SpotnyBeaconScanner: NSObject {
|
|
|
649
661
|
switch result {
|
|
650
662
|
case .success(let (status, data)):
|
|
651
663
|
if 200...299 ~= status {
|
|
652
|
-
// Capture backend-generated session_id from the NEARBY proximity response
|
|
653
|
-
if eventType == "NEARBY",
|
|
654
|
-
let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
|
|
655
|
-
let dataObj = json["data"] as? [String: Any],
|
|
656
|
-
let sid = dataObj["session_id"] as? String, !sid.isEmpty {
|
|
657
|
-
self.beaconSessionIds[key] = sid
|
|
658
|
-
print("✅ SpotnySDK: NEARBY session_id stored — \(sid)")
|
|
659
|
-
}
|
|
660
664
|
print("✅ SpotnySDK: \(eventType) — \(String(format: "%.2f", distance))m")
|
|
661
665
|
self.logToFile("\(eventType) beacon \(key) @ \(String(format: "%.2f", distance))m")
|
|
662
666
|
} else if status == 429 {
|
|
@@ -745,7 +749,6 @@ public class SpotnyBeaconScanner: NSObject {
|
|
|
745
749
|
campaignFetchInProgress.removeValue(forKey: key)
|
|
746
750
|
campaignFetched.removeValue(forKey: key)
|
|
747
751
|
campaignFetchCooldown.removeValue(forKey: key)
|
|
748
|
-
beaconSessionIds.removeValue(forKey: key)
|
|
749
752
|
print("🧹 SpotnySDK: Cleaned up \(key)")
|
|
750
753
|
}
|
|
751
754
|
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeEventEmitter","NativeModules","NativeSpotnySdk","SpotnyEvents","ON_BEACONS_RANGED","ON_BEACON_REGION_EVENT","eventEmitter","SpotnySdk","startScanner","stopScanner","isScanning","initialize","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;;
|
|
1
|
+
{"version":3,"names":["NativeEventEmitter","NativeModules","NativeSpotnySdk","SpotnyEvents","ON_BEACONS_RANGED","ON_BEACON_REGION_EVENT","eventEmitter","SpotnySdk","startScanner","stopScanner","isScanning","initialize","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;;AA0DA;AACA,MAAMC,YAAY,GAAG,IAAIN,kBAAkB,CAACC,aAAa,CAACM,SAAS,CAAC;;AAEpE;;AAEA;AACA,OAAO,SAASC,YAAYA,CAAA,EAAoB;EAC9C,OAAON,eAAe,CAACM,YAAY,CAAC,CAAC;AACvC;;AAEA;AACA,OAAO,SAASC,WAAWA,CAAA,EAAoB;EAC7C,OAAOP,eAAe,CAACO,WAAW,CAAC,CAAC;AACtC;;AAEA;AACA,OAAO,SAASC,UAAUA,CAAA,EAAqB;EAC7C,OAAOR,eAAe,CAACQ,UAAU,CAAC,CAAC;AACrC;;AAEA;;AAEA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAACC,MAAuB,EAAmB;EACnE,OAAOV,eAAe,CAACS,UAAU,CAACC,MAAgB,CAAC;AACrD;;AAEA;;AAEA;AACA,OAAO,SAASC,8BAA8BA,CAAA,EAAoB;EAChE,OAAOX,eAAe,CAACW,8BAA8B,CAAC,CAAC;AACzD;;AAEA;;AAEA;AACA,OAAO,SAASC,YAAYA,CAAA,EAAoB;EAC9C,OAAOZ,eAAe,CAACY,YAAY,CAAC,CAAC;AACvC;;AAEA;AACA,OAAO,SAASC,cAAcA,CAAA,EAAoB;EAChD,OAAOb,eAAe,CAACa,cAAc,CAAC,CAAC;AACzC;;AAEA;;AAEA;AACA,OAAO,SAASC,mBAAmBA,CAACC,QAAgB,EAAmB;EACrE,OAAOf,eAAe,CAACc,mBAAmB,CAACC,QAAQ,CAAC;AACtD;;AAEA;AACA,OAAO,SAASC,kBAAkBA,CAAA,EAAoB;EACpD,OAAOhB,eAAe,CAACgB,kBAAkB,CAAC,CAAC;AAC7C;;AAEA;AACA,OAAO,SAASC,iBAAiBA,CAAA,EAAoB;EACnD,OAAOjB,eAAe,CAACiB,iBAAiB,CAAC,CAAC;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,wBAAwBA,CACtCC,QAA4C,EAC5C;EACA,OAAOf,YAAY,CAACgB,WAAW,CAC7BnB,YAAY,CAACC,iBAAiB,EAC9BiB,QACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASE,uBAAuBA,CACrCF,QAA4C,EAC5C;EACA,OAAOf,YAAY,CAACgB,WAAW,CAC7BnB,YAAY,CAACE,sBAAsB,EACnCgB,QACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -45,6 +45,12 @@ export type SpotnySdkConfig = {
|
|
|
45
45
|
* TX power variance (default: 0.5, tuned for Kontakt.io -12 dBm beacons).
|
|
46
46
|
*/
|
|
47
47
|
distanceCorrectionFactor?: number;
|
|
48
|
+
/**
|
|
49
|
+
* When `true`, full API response bodies (status + JSON) are printed to the
|
|
50
|
+
* console for every SDK network call. Useful for diagnosing backend errors.
|
|
51
|
+
* Default: `false`.
|
|
52
|
+
*/
|
|
53
|
+
debug?: boolean;
|
|
48
54
|
/** @internal Owner-only: override the backend URL for local API debugging. */
|
|
49
55
|
superDebugConfig?: {
|
|
50
56
|
backendURL: string;
|
|
@@ -1 +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;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C,CAAC;AAOF,6BAA6B;AAC7B,wBAAgB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAE9C;AAED,mDAAmD;AACnD,wBAAgB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAE7C;AAED,uDAAuD;AACvD,wBAAgB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAE7C;AAID;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;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"}
|
|
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;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C,CAAC;AAOF,6BAA6B;AAC7B,wBAAgB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAE9C;AAED,mDAAmD;AACnD,wBAAgB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAE7C;AAED,uDAAuD;AACvD,wBAAgB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAE7C;AAID;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;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
CHANGED
package/src/index.tsx
CHANGED
|
@@ -55,6 +55,12 @@ export type SpotnySdkConfig = {
|
|
|
55
55
|
* TX power variance (default: 0.5, tuned for Kontakt.io -12 dBm beacons).
|
|
56
56
|
*/
|
|
57
57
|
distanceCorrectionFactor?: number;
|
|
58
|
+
/**
|
|
59
|
+
* When `true`, full API response bodies (status + JSON) are printed to the
|
|
60
|
+
* console for every SDK network call. Useful for diagnosing backend errors.
|
|
61
|
+
* Default: `false`.
|
|
62
|
+
*/
|
|
63
|
+
debug?: boolean;
|
|
58
64
|
/** @internal Owner-only: override the backend URL for local API debugging. */
|
|
59
65
|
superDebugConfig?: { backendURL: string };
|
|
60
66
|
};
|