@kubesense/kubesense-browser-core 1.2.0 → 1.4.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.
package/README.md CHANGED
@@ -14,6 +14,134 @@ helpers.
14
14
  > - [`@kubesense/kubesense-browser-rum-slim`][rum-slim] — RUM without Session Replay
15
15
  > - [`@kubesense/kubesense-browser-logs`][logs] — Log collection
16
16
 
17
+ ## Geolocation
18
+
19
+ The SDK provides utilities to collect user geolocation data using the browser's Geolocation API.
20
+
21
+ > **Note:** Collecting geolocation requires explicit user permission. The browser will prompt the user to allow location access.
22
+
23
+ ### API
24
+
25
+ ```typescript
26
+ import { canUseGeoLocation, getCurrentPosition, watchPosition, clearWatch } from '@kubesense/kubesense-browser-core'
27
+
28
+ // Check if geolocation is supported
29
+ if (canUseGeoLocation()) {
30
+ // Get position once
31
+ getCurrentPosition(
32
+ (position) => {
33
+ console.log(position.latitude, position.longitude, position.accuracy)
34
+ },
35
+ (error) => {
36
+ console.error(error.message)
37
+ },
38
+ { enableHighAccuracy: true, timeout: 10000 }
39
+ )
40
+
41
+ // Or watch position continuously
42
+ const watchId = watchPosition(
43
+ (position) => {
44
+ console.log(position.latitude, position.longitude)
45
+ },
46
+ (error) => {
47
+ console.error(error.message)
48
+ }
49
+ )
50
+
51
+ // Stop watching
52
+ clearWatch(watchId)
53
+ }
54
+ ```
55
+
56
+ ### Using with RUM
57
+
58
+ Add location data to all RUM events via global context:
59
+
60
+ ```typescript
61
+ import { getCurrentPosition, canUseGeoLocation } from '@kubesense/kubesense-browser-core'
62
+ import { kubsenseRum } from '@kubesense/kubesense-browser-rum'
63
+
64
+ if (canUseGeoLocation()) {
65
+ getCurrentPosition((position) => {
66
+ kubsenseRum.setGlobalContextProperty('geo', {
67
+ latitude: position.latitude,
68
+ longitude: position.longitude,
69
+ accuracy: position.accuracy,
70
+ })
71
+ })
72
+ }
73
+ ```
74
+
75
+ Or use the `beforeSend` hook to add location to individual events:
76
+
77
+ ```typescript
78
+ kubsenseRum.init({
79
+ beforeSend: (event) => {
80
+ if (canUseGeoLocation()) {
81
+ getCurrentPosition(
82
+ (position) => {
83
+ event.context.geo = {
84
+ latitude: position.latitude,
85
+ longitude: position.longitude,
86
+ }
87
+ },
88
+ () => {} // Ignore errors
89
+ )
90
+ }
91
+ }
92
+ })
93
+ ```
94
+
95
+ ### Reverse Geocoding
96
+
97
+ Convert coordinates to location names (city, country, etc.) using reverse geocoding:
98
+
99
+ ```typescript
100
+ import { getCurrentPosition, reverseGeocodeWithPosition, getLocationName } from '@kubesense/kubesense-browser-core'
101
+
102
+ getCurrentPosition((position) => {
103
+ reverseGeocodeWithPosition(position, (result) => {
104
+ console.log(result.city) // "San Francisco"
105
+ console.log(result.state) // "California"
106
+ console.log(result.country) // "United States of America"
107
+ console.log(getLocationName(result)) // "San Francisco, California, United States of America"
108
+ })
109
+ })
110
+ ```
111
+
112
+ #### API
113
+
114
+ ```typescript
115
+ // Sync callback style
116
+ reverseGeocode(lat, lon, onSuccess, onError)
117
+
118
+ // Async style
119
+ const result = await reverseGeocodeAsync(lat, lon)
120
+
121
+ // With position object
122
+ reverseGeocodeWithPosition(position, onSuccess, onError)
123
+ const result = await reverseGeocodeWithPositionAsync(position)
124
+ ```
125
+
126
+ #### Response Type
127
+
128
+ ```typescript
129
+ interface GeoLocationResult {
130
+ city?: string // "San Francisco"
131
+ state?: string // "California"
132
+ stateCode?: string // "CA"
133
+ country?: string // "United States of America"
134
+ countryCode?: string // "US"
135
+ continent?: string // "North America"
136
+ timezone?: string // "America/Los_Angeles"
137
+ locality?: string // Neighborhood or suburb
138
+ postalCode?: string // "94102"
139
+ raw?: GeocodingResponse // Raw API response
140
+ }
141
+ ```
142
+
143
+ > **Note:** By default, this uses OpenStreetMap's Nominatim API (free, no API key required). You can provide your own `baseUrl` for other geocoding services.
144
+
17
145
  ## License
18
146
 
19
147
  [Apache-2.0](https://github.com/kubesense-ai/kubesense-browser-sdk/blob/main/LICENSE)
package/cjs/boot/init.js CHANGED
@@ -7,7 +7,7 @@ const monitor_1 = require("../tools/monitor");
7
7
  const display_1 = require("../tools/display");
8
8
  function makePublicApi(stub) {
9
9
  const publicApi = {
10
- version: "1.2.0",
10
+ version: "1.4.0",
11
11
  // This API method is intentionally not monitored, since the only thing executed is the
12
12
  // user-provided 'callback'. All SDK usages executed in the callback should be monitored, and
13
13
  // we don't want to interfere with the user uncaught exceptions.
@@ -45,7 +45,7 @@ function buildEndpointParameters({ clientToken, internalAnalyticsSubdomain, sour
45
45
  const parameters = [
46
46
  `ksource=${source}`,
47
47
  `kubesense-api-key=${clientToken}`,
48
- `kubesense-evp-origin-version=${encodeURIComponent("1.2.0")}`,
48
+ `kubesense-evp-origin-version=${encodeURIComponent("1.4.0")}`,
49
49
  'kubesense-evp-origin=browser',
50
50
  `kubesense-request-id=${(0, stringUtils_1.generateUUID)()}`,
51
51
  ].concat(extraParameters);
@@ -9,7 +9,7 @@ const display_1 = require("../tools/display");
9
9
  exports.TAG_SIZE_LIMIT = 200;
10
10
  function buildTags(configuration) {
11
11
  const { env, service, version, datacenter, sdkVersion, variant } = configuration;
12
- const tags = [buildTag('sdk_version', sdkVersion !== null && sdkVersion !== void 0 ? sdkVersion : "1.2.0")];
12
+ const tags = [buildTag('sdk_version', sdkVersion !== null && sdkVersion !== void 0 ? sdkVersion : "1.4.0")];
13
13
  if (env) {
14
14
  tags.push(buildTag('env', env));
15
15
  }
@@ -109,7 +109,7 @@ function startTelemetryCollection(telemetryService, configuration, hooks, observ
109
109
  type: 'telemetry',
110
110
  date: clockNow.timeStamp,
111
111
  service: telemetryService,
112
- version: "1.2.0",
112
+ version: "1.4.0",
113
113
  source: 'browser',
114
114
  _kubesense: {
115
115
  format_version: 2,
package/cjs/index.d.ts CHANGED
@@ -81,6 +81,8 @@ export * from './domain/resourceUtils';
81
81
  export * from './domain/bufferedData';
82
82
  export * from './tools/utils/polyfills';
83
83
  export * from './tools/utils/timezone';
84
+ export * from './tools/utils/geolocation';
85
+ export * from './tools/utils/geocoding';
84
86
  export * from './tools/utils/numberUtils';
85
87
  export * from './tools/utils/byteUtils';
86
88
  export * from './tools/utils/objectUtils';
package/cjs/index.js CHANGED
@@ -178,6 +178,8 @@ __exportStar(require("./domain/resourceUtils"), exports);
178
178
  __exportStar(require("./domain/bufferedData"), exports);
179
179
  __exportStar(require("./tools/utils/polyfills"), exports);
180
180
  __exportStar(require("./tools/utils/timezone"), exports);
181
+ __exportStar(require("./tools/utils/geolocation"), exports);
182
+ __exportStar(require("./tools/utils/geocoding"), exports);
181
183
  __exportStar(require("./tools/utils/numberUtils"), exports);
182
184
  __exportStar(require("./tools/utils/byteUtils"), exports);
183
185
  __exportStar(require("./tools/utils/objectUtils"), exports);
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { GeoPosition } from './geolocation';
2
+ export interface GeoLocation {
3
+ latitude: number;
4
+ longitude: number;
5
+ accuracy?: number;
6
+ }
7
+ export interface GeoLocationResult {
8
+ city?: string;
9
+ state?: string;
10
+ stateCode?: string;
11
+ country?: string;
12
+ countryCode?: string;
13
+ continent?: string;
14
+ timezone?: string;
15
+ locality?: string;
16
+ postalCode?: string;
17
+ raw?: GeocodingResponse;
18
+ }
19
+ export interface GeocodingError {
20
+ code: number;
21
+ message: string;
22
+ }
23
+ interface GeocodingResponse {
24
+ address: {
25
+ city?: string;
26
+ town?: string;
27
+ village?: string;
28
+ municipality?: string;
29
+ state?: string;
30
+ state_code?: string;
31
+ country?: string;
32
+ country_code?: string;
33
+ continent?: string;
34
+ postcode?: string;
35
+ locality?: string;
36
+ suburb?: string;
37
+ neighborhood?: string;
38
+ };
39
+ timezone?: string;
40
+ lat: string;
41
+ lon: string;
42
+ }
43
+ export declare function reverseGeocode(latitude: number, longitude: number, onSuccess: (result: GeoLocationResult) => void, onError?: (error: GeocodingError) => void, options?: {
44
+ baseUrl?: string;
45
+ userAgent?: string;
46
+ }): void;
47
+ export declare function reverseGeocodeWithPosition(position: GeoPosition, onSuccess: (result: GeoLocationResult) => void, onError?: (error: GeocodingError) => void, options?: {
48
+ baseUrl?: string;
49
+ userAgent?: string;
50
+ }): void;
51
+ export declare function getLocationName(result: GeoLocationResult): string;
52
+ export declare function reverseGeocodeAsync(latitude: number, longitude: number, options?: {
53
+ baseUrl?: string;
54
+ userAgent?: string;
55
+ }): Promise<GeoLocationResult>;
56
+ export declare function reverseGeocodeWithPositionAsync(position: GeoPosition, options?: {
57
+ baseUrl?: string;
58
+ userAgent?: string;
59
+ }): Promise<GeoLocationResult>;
60
+ export {};
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reverseGeocode = reverseGeocode;
4
+ exports.reverseGeocodeWithPosition = reverseGeocodeWithPosition;
5
+ exports.getLocationName = getLocationName;
6
+ exports.reverseGeocodeAsync = reverseGeocodeAsync;
7
+ exports.reverseGeocodeWithPositionAsync = reverseGeocodeWithPositionAsync;
8
+ const NOMINATIM_BASE_URL = 'https://nominatim.openstreetmap.org';
9
+ function reverseGeocode(latitude, longitude, onSuccess, onError, options) {
10
+ var _a, _b;
11
+ const baseUrl = (_a = options === null || options === void 0 ? void 0 : options.baseUrl) !== null && _a !== void 0 ? _a : NOMINATIM_BASE_URL;
12
+ const userAgent = (_b = options === null || options === void 0 ? void 0 : options.userAgent) !== null && _b !== void 0 ? _b : 'KubesenseBrowserSDK/1.0';
13
+ const url = `${baseUrl}/reverse?lat=${latitude}&lon=${longitude}&format=json&addressdetails=1&timezone=1`;
14
+ fetch(url, {
15
+ headers: {
16
+ 'User-Agent': userAgent,
17
+ 'Accept': 'application/json',
18
+ },
19
+ })
20
+ .then((response) => {
21
+ if (!response.ok) {
22
+ throw new Error(`Geocoding failed: ${response.status}`);
23
+ }
24
+ return response.json();
25
+ })
26
+ .then((data) => {
27
+ const result = parseGeocodingResponse(data);
28
+ onSuccess(result);
29
+ })
30
+ .catch((error) => {
31
+ onError === null || onError === void 0 ? void 0 : onError({
32
+ code: -1,
33
+ message: error.message || 'Failed to reverse geocode',
34
+ });
35
+ });
36
+ }
37
+ function reverseGeocodeWithPosition(position, onSuccess, onError, options) {
38
+ reverseGeocode(position.latitude, position.longitude, onSuccess, onError, options);
39
+ }
40
+ function parseGeocodingResponse(data) {
41
+ var _a, _b, _c, _d, _e, _f;
42
+ const address = data.address || {};
43
+ return {
44
+ city: (_c = (_b = (_a = address.city) !== null && _a !== void 0 ? _a : address.town) !== null && _b !== void 0 ? _b : address.village) !== null && _c !== void 0 ? _c : address.municipality,
45
+ state: address.state,
46
+ stateCode: address.state_code,
47
+ country: address.country,
48
+ countryCode: (_d = address.country_code) === null || _d === void 0 ? void 0 : _d.toUpperCase(),
49
+ continent: address.continent,
50
+ timezone: data.timezone,
51
+ locality: (_f = (_e = address.locality) !== null && _e !== void 0 ? _e : address.suburb) !== null && _f !== void 0 ? _f : address.neighborhood,
52
+ postalCode: address.postcode,
53
+ raw: data,
54
+ };
55
+ }
56
+ function getLocationName(result) {
57
+ const parts = [];
58
+ if (result.locality) {
59
+ parts.push(result.locality);
60
+ }
61
+ if (result.city) {
62
+ parts.push(result.city);
63
+ }
64
+ if (result.state) {
65
+ parts.push(result.state);
66
+ }
67
+ if (result.country) {
68
+ parts.push(result.country);
69
+ }
70
+ return parts.join(', ');
71
+ }
72
+ async function reverseGeocodeAsync(latitude, longitude, options) {
73
+ return new Promise((resolve, reject) => {
74
+ reverseGeocode(latitude, longitude, resolve, (error) => reject(new Error(error.message)), options);
75
+ });
76
+ }
77
+ async function reverseGeocodeWithPositionAsync(position, options) {
78
+ return reverseGeocodeAsync(position.latitude, position.longitude, options);
79
+ }
80
+ //# sourceMappingURL=geocoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geocoding.js","sourceRoot":"","sources":["../../../src/tools/utils/geocoding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface GeoPosition {
2
+ latitude: number;
3
+ longitude: number;
4
+ accuracy: number;
5
+ altitude?: number;
6
+ altitudeAccuracy?: number;
7
+ heading?: number;
8
+ speed?: number;
9
+ }
10
+ export interface GeoPositionError {
11
+ code: number;
12
+ message: string;
13
+ }
14
+ export type GeoPositionCallback = (position: GeoPosition) => void;
15
+ export type GeoErrorCallback = (error: GeoPositionError) => void;
16
+ export interface GeoLocationOptions {
17
+ enableHighAccuracy?: boolean;
18
+ timeout?: number;
19
+ maximumAge?: number;
20
+ }
21
+ export declare function canUseGeoLocation(): boolean;
22
+ export declare function getCurrentPosition(onSuccess: GeoPositionCallback, onError?: GeoErrorCallback, options?: GeoLocationOptions): void;
23
+ export declare function watchPosition(onSuccess: GeoPositionCallback, onError?: GeoErrorCallback, options?: GeoLocationOptions): number;
24
+ export declare function clearWatch(watchId: number): void;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canUseGeoLocation = canUseGeoLocation;
4
+ exports.getCurrentPosition = getCurrentPosition;
5
+ exports.watchPosition = watchPosition;
6
+ exports.clearWatch = clearWatch;
7
+ function canUseGeoLocation() {
8
+ return 'geolocation' in navigator;
9
+ }
10
+ function getCurrentPosition(onSuccess, onError, options) {
11
+ var _a, _b, _c;
12
+ if (!canUseGeoLocation()) {
13
+ onError === null || onError === void 0 ? void 0 : onError({
14
+ code: -1,
15
+ message: 'Geolocation is not supported by this browser',
16
+ });
17
+ return;
18
+ }
19
+ navigator.geolocation.getCurrentPosition((position) => {
20
+ var _a, _b, _c, _d;
21
+ onSuccess({
22
+ latitude: position.coords.latitude,
23
+ longitude: position.coords.longitude,
24
+ accuracy: position.coords.accuracy,
25
+ altitude: (_a = position.coords.altitude) !== null && _a !== void 0 ? _a : undefined,
26
+ altitudeAccuracy: (_b = position.coords.altitudeAccuracy) !== null && _b !== void 0 ? _b : undefined,
27
+ heading: (_c = position.coords.heading) !== null && _c !== void 0 ? _c : undefined,
28
+ speed: (_d = position.coords.speed) !== null && _d !== void 0 ? _d : undefined,
29
+ });
30
+ }, (error) => {
31
+ onError === null || onError === void 0 ? void 0 : onError({
32
+ code: error.code,
33
+ message: error.message,
34
+ });
35
+ }, {
36
+ enableHighAccuracy: (_a = options === null || options === void 0 ? void 0 : options.enableHighAccuracy) !== null && _a !== void 0 ? _a : false,
37
+ timeout: (_b = options === null || options === void 0 ? void 0 : options.timeout) !== null && _b !== void 0 ? _b : 10000,
38
+ maximumAge: (_c = options === null || options === void 0 ? void 0 : options.maximumAge) !== null && _c !== void 0 ? _c : 0,
39
+ });
40
+ }
41
+ function watchPosition(onSuccess, onError, options) {
42
+ var _a, _b, _c;
43
+ if (!canUseGeoLocation()) {
44
+ onError === null || onError === void 0 ? void 0 : onError({
45
+ code: -1,
46
+ message: 'Geolocation is not supported by this browser',
47
+ });
48
+ return -1;
49
+ }
50
+ return navigator.geolocation.watchPosition((position) => {
51
+ var _a, _b, _c, _d;
52
+ onSuccess({
53
+ latitude: position.coords.latitude,
54
+ longitude: position.coords.longitude,
55
+ accuracy: position.coords.accuracy,
56
+ altitude: (_a = position.coords.altitude) !== null && _a !== void 0 ? _a : undefined,
57
+ altitudeAccuracy: (_b = position.coords.altitudeAccuracy) !== null && _b !== void 0 ? _b : undefined,
58
+ heading: (_c = position.coords.heading) !== null && _c !== void 0 ? _c : undefined,
59
+ speed: (_d = position.coords.speed) !== null && _d !== void 0 ? _d : undefined,
60
+ });
61
+ }, (error) => {
62
+ onError === null || onError === void 0 ? void 0 : onError({
63
+ code: error.code,
64
+ message: error.message,
65
+ });
66
+ }, {
67
+ enableHighAccuracy: (_a = options === null || options === void 0 ? void 0 : options.enableHighAccuracy) !== null && _a !== void 0 ? _a : false,
68
+ timeout: (_b = options === null || options === void 0 ? void 0 : options.timeout) !== null && _b !== void 0 ? _b : 10000,
69
+ maximumAge: (_c = options === null || options === void 0 ? void 0 : options.maximumAge) !== null && _c !== void 0 ? _c : 0,
70
+ });
71
+ }
72
+ function clearWatch(watchId) {
73
+ if (canUseGeoLocation() && watchId >= 0) {
74
+ navigator.geolocation.clearWatch(watchId);
75
+ }
76
+ }
77
+ //# sourceMappingURL=geolocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geolocation.js","sourceRoot":"","sources":["../../../src/tools/utils/geolocation.ts"],"names":[],"mappings":"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"}
package/esm/boot/init.js CHANGED
@@ -3,7 +3,7 @@ import { setDebugMode } from '../tools/monitor';
3
3
  import { display } from '../tools/display';
4
4
  export function makePublicApi(stub) {
5
5
  const publicApi = {
6
- version: "1.2.0",
6
+ version: "1.4.0",
7
7
  // This API method is intentionally not monitored, since the only thing executed is the
8
8
  // user-provided 'callback'. All SDK usages executed in the callback should be monitored, and
9
9
  // we don't want to interfere with the user uncaught exceptions.
@@ -41,7 +41,7 @@ function buildEndpointParameters({ clientToken, internalAnalyticsSubdomain, sour
41
41
  const parameters = [
42
42
  `ksource=${source}`,
43
43
  `kubesense-api-key=${clientToken}`,
44
- `kubesense-evp-origin-version=${encodeURIComponent("1.2.0")}`,
44
+ `kubesense-evp-origin-version=${encodeURIComponent("1.4.0")}`,
45
45
  'kubesense-evp-origin=browser',
46
46
  `kubesense-request-id=${generateUUID()}`,
47
47
  ].concat(extraParameters);
@@ -2,7 +2,7 @@ import { DOCS_ORIGIN, MORE_DETAILS, display } from '../tools/display';
2
2
  export const TAG_SIZE_LIMIT = 200;
3
3
  export function buildTags(configuration) {
4
4
  const { env, service, version, datacenter, sdkVersion, variant } = configuration;
5
- const tags = [buildTag('sdk_version', sdkVersion !== null && sdkVersion !== void 0 ? sdkVersion : "1.2.0")];
5
+ const tags = [buildTag('sdk_version', sdkVersion !== null && sdkVersion !== void 0 ? sdkVersion : "1.4.0")];
6
6
  if (env) {
7
7
  tags.push(buildTag('env', env));
8
8
  }
@@ -96,7 +96,7 @@ export function startTelemetryCollection(telemetryService, configuration, hooks,
96
96
  type: 'telemetry',
97
97
  date: clockNow.timeStamp,
98
98
  service: telemetryService,
99
- version: "1.2.0",
99
+ version: "1.4.0",
100
100
  source: 'browser',
101
101
  _kubesense: {
102
102
  format_version: 2,
package/esm/index.d.ts CHANGED
@@ -81,6 +81,8 @@ export * from './domain/resourceUtils';
81
81
  export * from './domain/bufferedData';
82
82
  export * from './tools/utils/polyfills';
83
83
  export * from './tools/utils/timezone';
84
+ export * from './tools/utils/geolocation';
85
+ export * from './tools/utils/geocoding';
84
86
  export * from './tools/utils/numberUtils';
85
87
  export * from './tools/utils/byteUtils';
86
88
  export * from './tools/utils/objectUtils';
package/esm/index.js CHANGED
@@ -57,6 +57,8 @@ export * from './domain/resourceUtils';
57
57
  export * from './domain/bufferedData';
58
58
  export * from './tools/utils/polyfills';
59
59
  export * from './tools/utils/timezone';
60
+ export * from './tools/utils/geolocation';
61
+ export * from './tools/utils/geocoding';
60
62
  export * from './tools/utils/numberUtils';
61
63
  export * from './tools/utils/byteUtils';
62
64
  export * from './tools/utils/objectUtils';
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { GeoPosition } from './geolocation';
2
+ export interface GeoLocation {
3
+ latitude: number;
4
+ longitude: number;
5
+ accuracy?: number;
6
+ }
7
+ export interface GeoLocationResult {
8
+ city?: string;
9
+ state?: string;
10
+ stateCode?: string;
11
+ country?: string;
12
+ countryCode?: string;
13
+ continent?: string;
14
+ timezone?: string;
15
+ locality?: string;
16
+ postalCode?: string;
17
+ raw?: GeocodingResponse;
18
+ }
19
+ export interface GeocodingError {
20
+ code: number;
21
+ message: string;
22
+ }
23
+ interface GeocodingResponse {
24
+ address: {
25
+ city?: string;
26
+ town?: string;
27
+ village?: string;
28
+ municipality?: string;
29
+ state?: string;
30
+ state_code?: string;
31
+ country?: string;
32
+ country_code?: string;
33
+ continent?: string;
34
+ postcode?: string;
35
+ locality?: string;
36
+ suburb?: string;
37
+ neighborhood?: string;
38
+ };
39
+ timezone?: string;
40
+ lat: string;
41
+ lon: string;
42
+ }
43
+ export declare function reverseGeocode(latitude: number, longitude: number, onSuccess: (result: GeoLocationResult) => void, onError?: (error: GeocodingError) => void, options?: {
44
+ baseUrl?: string;
45
+ userAgent?: string;
46
+ }): void;
47
+ export declare function reverseGeocodeWithPosition(position: GeoPosition, onSuccess: (result: GeoLocationResult) => void, onError?: (error: GeocodingError) => void, options?: {
48
+ baseUrl?: string;
49
+ userAgent?: string;
50
+ }): void;
51
+ export declare function getLocationName(result: GeoLocationResult): string;
52
+ export declare function reverseGeocodeAsync(latitude: number, longitude: number, options?: {
53
+ baseUrl?: string;
54
+ userAgent?: string;
55
+ }): Promise<GeoLocationResult>;
56
+ export declare function reverseGeocodeWithPositionAsync(position: GeoPosition, options?: {
57
+ baseUrl?: string;
58
+ userAgent?: string;
59
+ }): Promise<GeoLocationResult>;
60
+ export {};
@@ -0,0 +1,73 @@
1
+ const NOMINATIM_BASE_URL = 'https://nominatim.openstreetmap.org';
2
+ export function reverseGeocode(latitude, longitude, onSuccess, onError, options) {
3
+ var _a, _b;
4
+ const baseUrl = (_a = options === null || options === void 0 ? void 0 : options.baseUrl) !== null && _a !== void 0 ? _a : NOMINATIM_BASE_URL;
5
+ const userAgent = (_b = options === null || options === void 0 ? void 0 : options.userAgent) !== null && _b !== void 0 ? _b : 'KubesenseBrowserSDK/1.0';
6
+ const url = `${baseUrl}/reverse?lat=${latitude}&lon=${longitude}&format=json&addressdetails=1&timezone=1`;
7
+ fetch(url, {
8
+ headers: {
9
+ 'User-Agent': userAgent,
10
+ 'Accept': 'application/json',
11
+ },
12
+ })
13
+ .then((response) => {
14
+ if (!response.ok) {
15
+ throw new Error(`Geocoding failed: ${response.status}`);
16
+ }
17
+ return response.json();
18
+ })
19
+ .then((data) => {
20
+ const result = parseGeocodingResponse(data);
21
+ onSuccess(result);
22
+ })
23
+ .catch((error) => {
24
+ onError === null || onError === void 0 ? void 0 : onError({
25
+ code: -1,
26
+ message: error.message || 'Failed to reverse geocode',
27
+ });
28
+ });
29
+ }
30
+ export function reverseGeocodeWithPosition(position, onSuccess, onError, options) {
31
+ reverseGeocode(position.latitude, position.longitude, onSuccess, onError, options);
32
+ }
33
+ function parseGeocodingResponse(data) {
34
+ var _a, _b, _c, _d, _e, _f;
35
+ const address = data.address || {};
36
+ return {
37
+ city: (_c = (_b = (_a = address.city) !== null && _a !== void 0 ? _a : address.town) !== null && _b !== void 0 ? _b : address.village) !== null && _c !== void 0 ? _c : address.municipality,
38
+ state: address.state,
39
+ stateCode: address.state_code,
40
+ country: address.country,
41
+ countryCode: (_d = address.country_code) === null || _d === void 0 ? void 0 : _d.toUpperCase(),
42
+ continent: address.continent,
43
+ timezone: data.timezone,
44
+ locality: (_f = (_e = address.locality) !== null && _e !== void 0 ? _e : address.suburb) !== null && _f !== void 0 ? _f : address.neighborhood,
45
+ postalCode: address.postcode,
46
+ raw: data,
47
+ };
48
+ }
49
+ export function getLocationName(result) {
50
+ const parts = [];
51
+ if (result.locality) {
52
+ parts.push(result.locality);
53
+ }
54
+ if (result.city) {
55
+ parts.push(result.city);
56
+ }
57
+ if (result.state) {
58
+ parts.push(result.state);
59
+ }
60
+ if (result.country) {
61
+ parts.push(result.country);
62
+ }
63
+ return parts.join(', ');
64
+ }
65
+ export async function reverseGeocodeAsync(latitude, longitude, options) {
66
+ return new Promise((resolve, reject) => {
67
+ reverseGeocode(latitude, longitude, resolve, (error) => reject(new Error(error.message)), options);
68
+ });
69
+ }
70
+ export async function reverseGeocodeWithPositionAsync(position, options) {
71
+ return reverseGeocodeAsync(position.latitude, position.longitude, options);
72
+ }
73
+ //# sourceMappingURL=geocoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geocoding.js","sourceRoot":"","sources":["../../../src/tools/utils/geocoding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface GeoPosition {
2
+ latitude: number;
3
+ longitude: number;
4
+ accuracy: number;
5
+ altitude?: number;
6
+ altitudeAccuracy?: number;
7
+ heading?: number;
8
+ speed?: number;
9
+ }
10
+ export interface GeoPositionError {
11
+ code: number;
12
+ message: string;
13
+ }
14
+ export type GeoPositionCallback = (position: GeoPosition) => void;
15
+ export type GeoErrorCallback = (error: GeoPositionError) => void;
16
+ export interface GeoLocationOptions {
17
+ enableHighAccuracy?: boolean;
18
+ timeout?: number;
19
+ maximumAge?: number;
20
+ }
21
+ export declare function canUseGeoLocation(): boolean;
22
+ export declare function getCurrentPosition(onSuccess: GeoPositionCallback, onError?: GeoErrorCallback, options?: GeoLocationOptions): void;
23
+ export declare function watchPosition(onSuccess: GeoPositionCallback, onError?: GeoErrorCallback, options?: GeoLocationOptions): number;
24
+ export declare function clearWatch(watchId: number): void;
@@ -0,0 +1,71 @@
1
+ export function canUseGeoLocation() {
2
+ return 'geolocation' in navigator;
3
+ }
4
+ export function getCurrentPosition(onSuccess, onError, options) {
5
+ var _a, _b, _c;
6
+ if (!canUseGeoLocation()) {
7
+ onError === null || onError === void 0 ? void 0 : onError({
8
+ code: -1,
9
+ message: 'Geolocation is not supported by this browser',
10
+ });
11
+ return;
12
+ }
13
+ navigator.geolocation.getCurrentPosition((position) => {
14
+ var _a, _b, _c, _d;
15
+ onSuccess({
16
+ latitude: position.coords.latitude,
17
+ longitude: position.coords.longitude,
18
+ accuracy: position.coords.accuracy,
19
+ altitude: (_a = position.coords.altitude) !== null && _a !== void 0 ? _a : undefined,
20
+ altitudeAccuracy: (_b = position.coords.altitudeAccuracy) !== null && _b !== void 0 ? _b : undefined,
21
+ heading: (_c = position.coords.heading) !== null && _c !== void 0 ? _c : undefined,
22
+ speed: (_d = position.coords.speed) !== null && _d !== void 0 ? _d : undefined,
23
+ });
24
+ }, (error) => {
25
+ onError === null || onError === void 0 ? void 0 : onError({
26
+ code: error.code,
27
+ message: error.message,
28
+ });
29
+ }, {
30
+ enableHighAccuracy: (_a = options === null || options === void 0 ? void 0 : options.enableHighAccuracy) !== null && _a !== void 0 ? _a : false,
31
+ timeout: (_b = options === null || options === void 0 ? void 0 : options.timeout) !== null && _b !== void 0 ? _b : 10000,
32
+ maximumAge: (_c = options === null || options === void 0 ? void 0 : options.maximumAge) !== null && _c !== void 0 ? _c : 0,
33
+ });
34
+ }
35
+ export function watchPosition(onSuccess, onError, options) {
36
+ var _a, _b, _c;
37
+ if (!canUseGeoLocation()) {
38
+ onError === null || onError === void 0 ? void 0 : onError({
39
+ code: -1,
40
+ message: 'Geolocation is not supported by this browser',
41
+ });
42
+ return -1;
43
+ }
44
+ return navigator.geolocation.watchPosition((position) => {
45
+ var _a, _b, _c, _d;
46
+ onSuccess({
47
+ latitude: position.coords.latitude,
48
+ longitude: position.coords.longitude,
49
+ accuracy: position.coords.accuracy,
50
+ altitude: (_a = position.coords.altitude) !== null && _a !== void 0 ? _a : undefined,
51
+ altitudeAccuracy: (_b = position.coords.altitudeAccuracy) !== null && _b !== void 0 ? _b : undefined,
52
+ heading: (_c = position.coords.heading) !== null && _c !== void 0 ? _c : undefined,
53
+ speed: (_d = position.coords.speed) !== null && _d !== void 0 ? _d : undefined,
54
+ });
55
+ }, (error) => {
56
+ onError === null || onError === void 0 ? void 0 : onError({
57
+ code: error.code,
58
+ message: error.message,
59
+ });
60
+ }, {
61
+ enableHighAccuracy: (_a = options === null || options === void 0 ? void 0 : options.enableHighAccuracy) !== null && _a !== void 0 ? _a : false,
62
+ timeout: (_b = options === null || options === void 0 ? void 0 : options.timeout) !== null && _b !== void 0 ? _b : 10000,
63
+ maximumAge: (_c = options === null || options === void 0 ? void 0 : options.maximumAge) !== null && _c !== void 0 ? _c : 0,
64
+ });
65
+ }
66
+ export function clearWatch(watchId) {
67
+ if (canUseGeoLocation() && watchId >= 0) {
68
+ navigator.geolocation.clearWatch(watchId);
69
+ }
70
+ }
71
+ //# sourceMappingURL=geolocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geolocation.js","sourceRoot":"","sources":["../../../src/tools/utils/geolocation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,18 @@
1
1
  {
2
2
  "name": "@kubesense/kubesense-browser-core",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
+ "description": "Core utilities shared across the Kubesense Browser SDK (session management, transport, configuration, and context).",
4
5
  "license": "Apache-2.0",
6
+ "keywords": [
7
+ "kubesense",
8
+ "browser",
9
+ "sdk",
10
+ "monitoring",
11
+ "observability",
12
+ "telemetry",
13
+ "rum",
14
+ "core"
15
+ ],
5
16
  "main": "cjs/index.js",
6
17
  "module": "esm/index.js",
7
18
  "types": "cjs/index.d.ts",
@@ -24,5 +35,5 @@
24
35
  "publishConfig": {
25
36
  "access": "public"
26
37
  },
27
- "gitHead": "c49352eb57b271896c63b12053001be6a2684fb0"
38
+ "gitHead": "af1a0950e2441f45b4303b2dc17b09f9cd0d999d"
28
39
  }
package/src/index.ts CHANGED
@@ -149,6 +149,8 @@ export * from './domain/resourceUtils'
149
149
  export * from './domain/bufferedData'
150
150
  export * from './tools/utils/polyfills'
151
151
  export * from './tools/utils/timezone'
152
+ export * from './tools/utils/geolocation'
153
+ export * from './tools/utils/geocoding'
152
154
  export * from './tools/utils/numberUtils'
153
155
  export * from './tools/utils/byteUtils'
154
156
  export * from './tools/utils/objectUtils'
@@ -0,0 +1,170 @@
1
+ import type { GeoPosition } from './geolocation'
2
+
3
+ export interface GeoLocation {
4
+ latitude: number
5
+ longitude: number
6
+ accuracy?: number
7
+ }
8
+
9
+ export interface GeoLocationResult {
10
+ city?: string
11
+ state?: string
12
+ stateCode?: string
13
+ country?: string
14
+ countryCode?: string
15
+ continent?: string
16
+ timezone?: string
17
+ locality?: string
18
+ postalCode?: string
19
+ raw?: GeocodingResponse
20
+ }
21
+
22
+ export interface GeocodingError {
23
+ code: number
24
+ message: string
25
+ }
26
+
27
+ interface GeocodingResponse {
28
+ address: {
29
+ city?: string
30
+ town?: string
31
+ village?: string
32
+ municipality?: string
33
+ state?: string
34
+ state_code?: string
35
+ country?: string
36
+ country_code?: string
37
+ continent?: string
38
+ postcode?: string
39
+ locality?: string
40
+ suburb?: string
41
+ neighborhood?: string
42
+ }
43
+ timezone?: string
44
+ lat: string
45
+ lon: string
46
+ }
47
+
48
+ const NOMINATIM_BASE_URL = 'https://nominatim.openstreetmap.org'
49
+
50
+ export function reverseGeocode(
51
+ latitude: number,
52
+ longitude: number,
53
+ onSuccess: (result: GeoLocationResult) => void,
54
+ onError?: (error: GeocodingError) => void,
55
+ options?: {
56
+ baseUrl?: string
57
+ userAgent?: string
58
+ }
59
+ ): void {
60
+ const baseUrl = options?.baseUrl ?? NOMINATIM_BASE_URL
61
+ const userAgent = options?.userAgent ?? 'KubesenseBrowserSDK/1.0'
62
+
63
+ const url = `${baseUrl}/reverse?lat=${latitude}&lon=${longitude}&format=json&addressdetails=1&timezone=1`
64
+
65
+ fetch(url, {
66
+ headers: {
67
+ 'User-Agent': userAgent,
68
+ 'Accept': 'application/json',
69
+ },
70
+ })
71
+ .then((response) => {
72
+ if (!response.ok) {
73
+ throw new Error(`Geocoding failed: ${response.status}`)
74
+ }
75
+ return response.json()
76
+ })
77
+ .then((data: GeocodingResponse) => {
78
+ const result = parseGeocodingResponse(data)
79
+ onSuccess(result)
80
+ })
81
+ .catch((error) => {
82
+ onError?.({
83
+ code: -1,
84
+ message: error.message || 'Failed to reverse geocode',
85
+ })
86
+ })
87
+ }
88
+
89
+ export function reverseGeocodeWithPosition(
90
+ position: GeoPosition,
91
+ onSuccess: (result: GeoLocationResult) => void,
92
+ onError?: (error: GeocodingError) => void,
93
+ options?: {
94
+ baseUrl?: string
95
+ userAgent?: string
96
+ }
97
+ ): void {
98
+ reverseGeocode(
99
+ position.latitude,
100
+ position.longitude,
101
+ onSuccess,
102
+ onError,
103
+ options
104
+ )
105
+ }
106
+
107
+ function parseGeocodingResponse(data: GeocodingResponse): GeoLocationResult {
108
+ const address = data.address || {}
109
+
110
+ return {
111
+ city: address.city ?? address.town ?? address.village ?? address.municipality,
112
+ state: address.state,
113
+ stateCode: address.state_code,
114
+ country: address.country,
115
+ countryCode: address.country_code?.toUpperCase(),
116
+ continent: address.continent,
117
+ timezone: data.timezone,
118
+ locality: address.locality ?? address.suburb ?? address.neighborhood,
119
+ postalCode: address.postcode,
120
+ raw: data,
121
+ }
122
+ }
123
+
124
+ export function getLocationName(result: GeoLocationResult): string {
125
+ const parts: string[] = []
126
+
127
+ if (result.locality) {
128
+ parts.push(result.locality)
129
+ }
130
+ if (result.city) {
131
+ parts.push(result.city)
132
+ }
133
+ if (result.state) {
134
+ parts.push(result.state)
135
+ }
136
+ if (result.country) {
137
+ parts.push(result.country)
138
+ }
139
+
140
+ return parts.join(', ')
141
+ }
142
+
143
+ export async function reverseGeocodeAsync(
144
+ latitude: number,
145
+ longitude: number,
146
+ options?: {
147
+ baseUrl?: string
148
+ userAgent?: string
149
+ }
150
+ ): Promise<GeoLocationResult> {
151
+ return new Promise((resolve, reject) => {
152
+ reverseGeocode(
153
+ latitude,
154
+ longitude,
155
+ resolve,
156
+ (error) => reject(new Error(error.message)),
157
+ options
158
+ )
159
+ })
160
+ }
161
+
162
+ export async function reverseGeocodeWithPositionAsync(
163
+ position: GeoPosition,
164
+ options?: {
165
+ baseUrl?: string
166
+ userAgent?: string
167
+ }
168
+ ): Promise<GeoLocationResult> {
169
+ return reverseGeocodeAsync(position.latitude, position.longitude, options)
170
+ }
@@ -0,0 +1,111 @@
1
+ export interface GeoPosition {
2
+ latitude: number
3
+ longitude: number
4
+ accuracy: number
5
+ altitude?: number
6
+ altitudeAccuracy?: number
7
+ heading?: number
8
+ speed?: number
9
+ }
10
+
11
+ export interface GeoPositionError {
12
+ code: number
13
+ message: string
14
+ }
15
+
16
+ export type GeoPositionCallback = (position: GeoPosition) => void
17
+ export type GeoErrorCallback = (error: GeoPositionError) => void
18
+
19
+ export interface GeoLocationOptions {
20
+ enableHighAccuracy?: boolean
21
+ timeout?: number
22
+ maximumAge?: number
23
+ }
24
+
25
+ export function canUseGeoLocation(): boolean {
26
+ return 'geolocation' in navigator
27
+ }
28
+
29
+ export function getCurrentPosition(
30
+ onSuccess: GeoPositionCallback,
31
+ onError?: GeoErrorCallback,
32
+ options?: GeoLocationOptions
33
+ ): void {
34
+ if (!canUseGeoLocation()) {
35
+ onError?.({
36
+ code: -1,
37
+ message: 'Geolocation is not supported by this browser',
38
+ })
39
+ return
40
+ }
41
+
42
+ navigator.geolocation.getCurrentPosition(
43
+ (position) => {
44
+ onSuccess({
45
+ latitude: position.coords.latitude,
46
+ longitude: position.coords.longitude,
47
+ accuracy: position.coords.accuracy,
48
+ altitude: position.coords.altitude ?? undefined,
49
+ altitudeAccuracy: position.coords.altitudeAccuracy ?? undefined,
50
+ heading: position.coords.heading ?? undefined,
51
+ speed: position.coords.speed ?? undefined,
52
+ })
53
+ },
54
+ (error) => {
55
+ onError?.({
56
+ code: error.code,
57
+ message: error.message,
58
+ })
59
+ },
60
+ {
61
+ enableHighAccuracy: options?.enableHighAccuracy ?? false,
62
+ timeout: options?.timeout ?? 10000,
63
+ maximumAge: options?.maximumAge ?? 0,
64
+ }
65
+ )
66
+ }
67
+
68
+ export function watchPosition(
69
+ onSuccess: GeoPositionCallback,
70
+ onError?: GeoErrorCallback,
71
+ options?: GeoLocationOptions
72
+ ): number {
73
+ if (!canUseGeoLocation()) {
74
+ onError?.({
75
+ code: -1,
76
+ message: 'Geolocation is not supported by this browser',
77
+ })
78
+ return -1
79
+ }
80
+
81
+ return navigator.geolocation.watchPosition(
82
+ (position) => {
83
+ onSuccess({
84
+ latitude: position.coords.latitude,
85
+ longitude: position.coords.longitude,
86
+ accuracy: position.coords.accuracy,
87
+ altitude: position.coords.altitude ?? undefined,
88
+ altitudeAccuracy: position.coords.altitudeAccuracy ?? undefined,
89
+ heading: position.coords.heading ?? undefined,
90
+ speed: position.coords.speed ?? undefined,
91
+ })
92
+ },
93
+ (error) => {
94
+ onError?.({
95
+ code: error.code,
96
+ message: error.message,
97
+ })
98
+ },
99
+ {
100
+ enableHighAccuracy: options?.enableHighAccuracy ?? false,
101
+ timeout: options?.timeout ?? 10000,
102
+ maximumAge: options?.maximumAge ?? 0,
103
+ }
104
+ )
105
+ }
106
+
107
+ export function clearWatch(watchId: number): void {
108
+ if (canUseGeoLocation() && watchId >= 0) {
109
+ navigator.geolocation.clearWatch(watchId)
110
+ }
111
+ }