@plushanalytics/react-native-session-replay 1.2.6 → 3.0.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 +85 -3
- package/lib/commonjs/adapters/mobileReplayAdapter.js +98 -0
- package/lib/commonjs/adapters/mobileReplayAdapter.js.map +1 -0
- package/lib/commonjs/client.js +41 -0
- package/lib/commonjs/client.js.map +1 -0
- package/lib/commonjs/index.js +31 -37
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/nativeBridge.js +45 -0
- package/lib/commonjs/nativeBridge.js.map +1 -0
- package/lib/commonjs/provider.js +45 -0
- package/lib/commonjs/provider.js.map +1 -0
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/adapters/mobileReplayAdapter.js +93 -0
- package/lib/module/adapters/mobileReplayAdapter.js.map +1 -0
- package/lib/module/client.js +32 -0
- package/lib/module/client.js.map +1 -0
- package/lib/module/index.js +3 -33
- package/lib/module/index.js.map +1 -1
- package/lib/module/nativeBridge.js +36 -0
- package/lib/module/nativeBridge.js.map +1 -0
- package/lib/module/provider.js +39 -0
- package/lib/module/provider.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/commonjs/src/adapters/mobileReplayAdapter.d.ts +8 -0
- package/lib/typescript/commonjs/src/adapters/mobileReplayAdapter.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/client.d.ts +6 -0
- package/lib/typescript/commonjs/src/client.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +4 -28
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/nativeBridge.d.ts +29 -0
- package/lib/typescript/commonjs/src/nativeBridge.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/provider.d.ts +12 -0
- package/lib/typescript/commonjs/src/provider.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/types.d.ts +21 -0
- package/lib/typescript/commonjs/src/types.d.ts.map +1 -0
- package/lib/typescript/module/src/adapters/mobileReplayAdapter.d.ts +8 -0
- package/lib/typescript/module/src/adapters/mobileReplayAdapter.d.ts.map +1 -0
- package/lib/typescript/module/src/client.d.ts +6 -0
- package/lib/typescript/module/src/client.d.ts.map +1 -0
- package/lib/typescript/module/src/index.d.ts +4 -28
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/nativeBridge.d.ts +29 -0
- package/lib/typescript/module/src/nativeBridge.d.ts.map +1 -0
- package/lib/typescript/module/src/provider.d.ts +12 -0
- package/lib/typescript/module/src/provider.d.ts.map +1 -0
- package/lib/typescript/module/src/types.d.ts +21 -0
- package/lib/typescript/module/src/types.d.ts.map +1 -0
- package/package.json +22 -25
- package/src/adapters/mobileReplayAdapter.ts +113 -0
- package/src/client.ts +42 -0
- package/src/index.tsx +23 -79
- package/src/nativeBridge.ts +79 -0
- package/src/provider.tsx +46 -0
- package/src/types.ts +59 -0
package/README.md
CHANGED
|
@@ -1,9 +1,91 @@
|
|
|
1
1
|
# @plushanalytics/react-native-session-replay
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
React Native SDK for Plush Analytics (events + session replay) with a React Provider/hook.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Install
|
|
6
6
|
|
|
7
|
-
```
|
|
7
|
+
```bash
|
|
8
8
|
npm install @plushanalytics/react-native-session-replay
|
|
9
9
|
```
|
|
10
|
+
|
|
11
|
+
> [!NOTE]
|
|
12
|
+
> This package includes native code and is not compatible with Expo Go. Use development builds:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx expo run:ios
|
|
16
|
+
npx expo run:android
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Quick Setup (Provider + Hook)
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
import React from "react";
|
|
23
|
+
import { Button } from "react-native";
|
|
24
|
+
import { PlushAnalyticsProvider, usePlushAnalytics } from "@plushanalytics/react-native-session-replay";
|
|
25
|
+
|
|
26
|
+
function CheckoutButton(): JSX.Element {
|
|
27
|
+
const analytics = usePlushAnalytics();
|
|
28
|
+
return (
|
|
29
|
+
<Button
|
|
30
|
+
title="Purchase"
|
|
31
|
+
onPress={() => {
|
|
32
|
+
void analytics.track("purchase_clicked", { properties: { plan: "pro" } });
|
|
33
|
+
}}
|
|
34
|
+
/>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export default function App(): JSX.Element {
|
|
39
|
+
return (
|
|
40
|
+
<PlushAnalyticsProvider
|
|
41
|
+
config={{
|
|
42
|
+
apiKey: "plsh_live_...",
|
|
43
|
+
projectId: "mobile_app",
|
|
44
|
+
context: { platform: "react-native" }
|
|
45
|
+
}}
|
|
46
|
+
>
|
|
47
|
+
<CheckoutButton />
|
|
48
|
+
</PlushAnalyticsProvider>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Direct Client Usage (No React)
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
import { createPlushAnalyticsClient } from "@plushanalytics/react-native-session-replay";
|
|
57
|
+
|
|
58
|
+
const analytics = createPlushAnalyticsClient({
|
|
59
|
+
apiKey: "plsh_live_...",
|
|
60
|
+
projectId: "mobile_app"
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await analytics.track("app_opened");
|
|
64
|
+
await analytics.shutdown();
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Common Usage
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
await analytics.track("cta_clicked", { properties: { plan: "pro" } });
|
|
71
|
+
await analytics.identify("user_123", { traits: { plan: "pro" } });
|
|
72
|
+
await analytics.screen("Settings", { properties: { tab: "billing" } });
|
|
73
|
+
await analytics.group("org_456", { traits: { tier: "enterprise" } });
|
|
74
|
+
|
|
75
|
+
await analytics.flush();
|
|
76
|
+
await analytics.reset();
|
|
77
|
+
|
|
78
|
+
await analytics.startSessionRecording();
|
|
79
|
+
await analytics.flushSessionRecording();
|
|
80
|
+
await analytics.stopSessionRecording();
|
|
81
|
+
|
|
82
|
+
analytics.setProject("mobile_app");
|
|
83
|
+
analytics.setContext({ build: 42 });
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## API Surface
|
|
87
|
+
|
|
88
|
+
- `PlushAnalyticsProvider`
|
|
89
|
+
- `usePlushAnalytics()`
|
|
90
|
+
- `createPlushAnalyticsClient(config)`
|
|
91
|
+
- `PlushAnalyticsClient`
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createMobileReplayRecorderAdapter = createMobileReplayRecorderAdapter;
|
|
7
|
+
var replayModule = _interopRequireWildcard(require("../nativeBridge.js"));
|
|
8
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
9
|
+
const DEFAULT_SNAPSHOT_PATH = "/v1/events/batch";
|
|
10
|
+
const UUID_PATTERN = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
|
|
11
|
+
function assertNonEmpty(value, field) {
|
|
12
|
+
if (!value || !value.trim()) {
|
|
13
|
+
throw new Error(`${field} is required.`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function normalizeHost(value) {
|
|
17
|
+
return value.replace(/\/+$/, "");
|
|
18
|
+
}
|
|
19
|
+
function normalizeSnapshotPath(value) {
|
|
20
|
+
const trimmed = value?.trim();
|
|
21
|
+
if (!trimmed) return DEFAULT_SNAPSHOT_PATH;
|
|
22
|
+
return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
23
|
+
}
|
|
24
|
+
function isUuid(value) {
|
|
25
|
+
return UUID_PATTERN.test(value);
|
|
26
|
+
}
|
|
27
|
+
function generateUuid() {
|
|
28
|
+
const cryptoApi = globalThis.crypto;
|
|
29
|
+
if (cryptoApi?.randomUUID) return cryptoApi.randomUUID();
|
|
30
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, char => {
|
|
31
|
+
const random = Math.floor(Math.random() * 16);
|
|
32
|
+
const value = char === "x" ? random : random & 0x3 | 0x8;
|
|
33
|
+
return value.toString(16);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function normalizeReplayConfig(config) {
|
|
37
|
+
return {
|
|
38
|
+
maskAllTextInputs: config?.maskAllTextInputs ?? true,
|
|
39
|
+
maskAllImages: config?.maskAllImages ?? true,
|
|
40
|
+
maskAllSandboxedViews: config?.maskAllSandboxedViews ?? true,
|
|
41
|
+
captureLog: config?.captureLog ?? true,
|
|
42
|
+
captureNetworkTelemetry: config?.captureNetworkTelemetry ?? true,
|
|
43
|
+
throttleDelayMs: config?.throttleDelayMs ?? 1000
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function resolveSessionId(options) {
|
|
47
|
+
const requestedSessionId = options?.sessionId?.trim();
|
|
48
|
+
if (requestedSessionId && isUuid(requestedSessionId)) {
|
|
49
|
+
return requestedSessionId;
|
|
50
|
+
}
|
|
51
|
+
return generateUuid();
|
|
52
|
+
}
|
|
53
|
+
function assertNoPosthogDotCom(host) {
|
|
54
|
+
const lowered = host.toLowerCase();
|
|
55
|
+
const hostName = (() => {
|
|
56
|
+
try {
|
|
57
|
+
return new URL(host).hostname.toLowerCase();
|
|
58
|
+
} catch {
|
|
59
|
+
return lowered;
|
|
60
|
+
}
|
|
61
|
+
})();
|
|
62
|
+
if (hostName === "posthog.com" || hostName.endsWith(".posthog.com")) {
|
|
63
|
+
throw new Error("replayHost must not point to posthog.com (or a subdomain).");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function createMobileReplayRecorderAdapter(defaults) {
|
|
67
|
+
assertNonEmpty(defaults.apiKey, "apiKey");
|
|
68
|
+
assertNonEmpty(defaults.endpoint, "endpoint");
|
|
69
|
+
return {
|
|
70
|
+
start: async ({
|
|
71
|
+
onSessionId,
|
|
72
|
+
options
|
|
73
|
+
}) => {
|
|
74
|
+
const host = normalizeHost(options?.replayHost?.trim() || defaults.endpoint);
|
|
75
|
+
assertNoPosthogDotCom(host);
|
|
76
|
+
const snapshotPath = normalizeSnapshotPath(options?.replaySnapshotPath);
|
|
77
|
+
const activeSessionId = resolveSessionId(options);
|
|
78
|
+
const sdkOptions = {
|
|
79
|
+
apiKey: defaults.apiKey,
|
|
80
|
+
host,
|
|
81
|
+
debug: false,
|
|
82
|
+
distinctId: options?.userId?.trim() || "",
|
|
83
|
+
anonymousId: "",
|
|
84
|
+
sdkVersion: "plushanalytics-react-native",
|
|
85
|
+
flushAt: 20
|
|
86
|
+
};
|
|
87
|
+
await replayModule.start(activeSessionId, sdkOptions, normalizeReplayConfig(options?.replayConfig), {
|
|
88
|
+
endpoint: snapshotPath
|
|
89
|
+
});
|
|
90
|
+
await replayModule.startSession(activeSessionId);
|
|
91
|
+
onSessionId?.(activeSessionId);
|
|
92
|
+
return () => {
|
|
93
|
+
void replayModule.endSession();
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=mobileReplayAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["replayModule","_interopRequireWildcard","require","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DEFAULT_SNAPSHOT_PATH","UUID_PATTERN","assertNonEmpty","value","field","trim","Error","normalizeHost","replace","normalizeSnapshotPath","trimmed","startsWith","isUuid","test","generateUuid","cryptoApi","globalThis","crypto","randomUUID","char","random","Math","floor","toString","normalizeReplayConfig","config","maskAllTextInputs","maskAllImages","maskAllSandboxedViews","captureLog","captureNetworkTelemetry","throttleDelayMs","resolveSessionId","options","requestedSessionId","sessionId","assertNoPosthogDotCom","host","lowered","toLowerCase","hostName","URL","hostname","endsWith","createMobileReplayRecorderAdapter","defaults","apiKey","endpoint","start","onSessionId","replayHost","snapshotPath","replaySnapshotPath","activeSessionId","sdkOptions","debug","distinctId","userId","anonymousId","sdkVersion","flushAt","replayConfig","startSession","endSession"],"sourceRoot":"../../../src","sources":["adapters/mobileReplayAdapter.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "PlushAnalyticsClient", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _javascript.PlushAnalyticsClient;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
exports.createPlushAnalyticsClient = createPlushAnalyticsClient;
|
|
13
|
+
var _javascript = require("@plushanalytics/javascript");
|
|
14
|
+
var _mobileReplayAdapter = require("./adapters/mobileReplayAdapter.js");
|
|
15
|
+
const DEFAULT_ENDPOINT = "https://apim-plushanalytics-prod-rwth6ltqgdxg2.azure-api.net/api";
|
|
16
|
+
function normalizeSource(value) {
|
|
17
|
+
if (typeof value !== "string") return undefined;
|
|
18
|
+
const trimmed = value.trim();
|
|
19
|
+
if (!trimmed) return undefined;
|
|
20
|
+
return trimmed.length > 64 ? trimmed.slice(0, 64) : trimmed;
|
|
21
|
+
}
|
|
22
|
+
function createPlushAnalyticsClient(config) {
|
|
23
|
+
const endpoint = config.endpoint ?? DEFAULT_ENDPOINT;
|
|
24
|
+
const source = normalizeSource(config.source) ?? "mobile";
|
|
25
|
+
const wrapped = {
|
|
26
|
+
...config,
|
|
27
|
+
endpoint,
|
|
28
|
+
source,
|
|
29
|
+
replay: {
|
|
30
|
+
...(config.replay ?? {}),
|
|
31
|
+
defaultRecorder: config.replay?.defaultRecorder ?? (0, _mobileReplayAdapter.createMobileReplayRecorderAdapter)({
|
|
32
|
+
apiKey: config.apiKey,
|
|
33
|
+
endpoint
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
return (0, _javascript.createPlushAnalyticsClient)(wrapped);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Re-export the type so consumers can pass platform-specific options while using the core surface.
|
|
41
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_javascript","require","_mobileReplayAdapter","DEFAULT_ENDPOINT","normalizeSource","value","undefined","trimmed","trim","length","slice","createPlushAnalyticsClient","config","endpoint","source","wrapped","replay","defaultRecorder","createMobileReplayRecorderAdapter","apiKey","createCoreClient"],"sourceRoot":"../../src","sources":["client.ts"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAIA,IAAAC,oBAAA,GAAAD,OAAA;AAKA,MAAME,gBAAgB,GAAG,kEAAkE;AAE3F,SAASC,eAAeA,CAACC,KAAc,EAAsB;EAC3D,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOC,SAAS;EAC/C,MAAMC,OAAO,GAAGF,KAAK,CAACG,IAAI,CAAC,CAAC;EAC5B,IAAI,CAACD,OAAO,EAAE,OAAOD,SAAS;EAC9B,OAAOC,OAAO,CAACE,MAAM,GAAG,EAAE,GAAGF,OAAO,CAACG,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAGH,OAAO;AAC7D;AAEO,SAASI,0BAA0BA,CAACC,MAA4B,EAAwB;EAC7F,MAAMC,QAAQ,GAAGD,MAAM,CAACC,QAAQ,IAAIV,gBAAgB;EACpD,MAAMW,MAAM,GAAGV,eAAe,CAACQ,MAAM,CAACE,MAAM,CAAC,IAAI,QAAQ;EAEzD,MAAMC,OAA6B,GAAG;IACpC,GAAGH,MAAM;IACTC,QAAQ;IACRC,MAAM;IACNE,MAAM,EAAE;MACN,IAAIJ,MAAM,CAACI,MAAM,IAAI,CAAC,CAAC,CAAC;MACxBC,eAAe,EACbL,MAAM,CAACI,MAAM,EAAEC,eAAe,IAC9B,IAAAC,sDAAiC,EAAC;QAChCC,MAAM,EAAEP,MAAM,CAACO,MAAM;QACrBN;MACF,CAAC;IACL;EACF,CAAC;EAED,OAAO,IAAAO,sCAAgB,EAACL,OAAO,CAAC;AAClC;;AAEA","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -3,43 +3,37 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
exports.start = start;
|
|
11
|
-
exports.startSession = startSession;
|
|
12
|
-
var _reactNative = require("react-native");
|
|
13
|
-
const LINKING_ERROR = `The package '@plushanalytics/react-native-session-replay' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
|
|
14
|
-
ios: "- You have run 'pod install'\n",
|
|
15
|
-
default: ''
|
|
16
|
-
}) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
|
|
17
|
-
const PosthogReactNativeSessionReplay = _reactNative.NativeModules.PosthogReactNativeSessionReplay ? _reactNative.NativeModules.PosthogReactNativeSessionReplay : new Proxy({}, {
|
|
18
|
-
get() {
|
|
19
|
-
throw new Error(LINKING_ERROR);
|
|
6
|
+
Object.defineProperty(exports, "PlushAnalyticsClient", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _client.PlushAnalyticsClient;
|
|
20
10
|
}
|
|
21
11
|
});
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
12
|
+
Object.defineProperty(exports, "PlushAnalyticsProvider", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _provider.PlushAnalyticsProvider;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "createMobileReplayRecorderAdapter", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _mobileReplayAdapter.createMobileReplayRecorderAdapter;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "createPlushAnalyticsClient", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () {
|
|
27
|
+
return _client.createPlushAnalyticsClient;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(exports, "usePlushAnalytics", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () {
|
|
33
|
+
return _provider.usePlushAnalytics;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
var _client = require("./client.js");
|
|
37
|
+
var _mobileReplayAdapter = require("./adapters/mobileReplayAdapter.js");
|
|
38
|
+
var _provider = require("./provider.js");
|
|
45
39
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["_client","require","_mobileReplayAdapter","_provider"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,oBAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA","ignoreList":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
exports.endSession = endSession;
|
|
8
|
+
exports.identify = identify;
|
|
9
|
+
exports.isEnabled = isEnabled;
|
|
10
|
+
exports.start = start;
|
|
11
|
+
exports.startSession = startSession;
|
|
12
|
+
var _reactNative = require("react-native");
|
|
13
|
+
const LINKING_ERROR = `The package '@plushanalytics/react-native-session-replay' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
|
|
14
|
+
ios: "- You have run 'pod install'\n",
|
|
15
|
+
default: ''
|
|
16
|
+
}) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
|
|
17
|
+
const PosthogReactNativeSessionReplay = _reactNative.NativeModules.PosthogReactNativeSessionReplay ? _reactNative.NativeModules.PosthogReactNativeSessionReplay : new Proxy({}, {
|
|
18
|
+
get() {
|
|
19
|
+
throw new Error(LINKING_ERROR);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
function start(sessionId, sdkOptions, sdkReplayConfig, decideReplayConfig) {
|
|
23
|
+
return PosthogReactNativeSessionReplay.start(sessionId, sdkOptions, sdkReplayConfig, decideReplayConfig);
|
|
24
|
+
}
|
|
25
|
+
function startSession(sessionId) {
|
|
26
|
+
return PosthogReactNativeSessionReplay.startSession(sessionId);
|
|
27
|
+
}
|
|
28
|
+
function endSession() {
|
|
29
|
+
return PosthogReactNativeSessionReplay.endSession();
|
|
30
|
+
}
|
|
31
|
+
function isEnabled() {
|
|
32
|
+
return PosthogReactNativeSessionReplay.isEnabled();
|
|
33
|
+
}
|
|
34
|
+
function identify(distinctId, anonymousId) {
|
|
35
|
+
return PosthogReactNativeSessionReplay.identify(distinctId, anonymousId);
|
|
36
|
+
}
|
|
37
|
+
const PostHogReactNativeSessionReplay = {
|
|
38
|
+
start,
|
|
39
|
+
startSession,
|
|
40
|
+
endSession,
|
|
41
|
+
isEnabled,
|
|
42
|
+
identify
|
|
43
|
+
};
|
|
44
|
+
var _default = exports.default = PostHogReactNativeSessionReplay;
|
|
45
|
+
//# sourceMappingURL=nativeBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","PosthogReactNativeSessionReplay","NativeModules","Proxy","get","Error","start","sessionId","sdkOptions","sdkReplayConfig","decideReplayConfig","startSession","endSession","isEnabled","identify","distinctId","anonymousId","PostHogReactNativeSessionReplay","_default","exports"],"sourceRoot":"../../src","sources":["nativeBridge.ts"],"mappings":";;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA,MAAMC,aAAa,GACjB,sGAAsG,GACtGC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,+BAA+B,GACnCC,0BAAa,CAACD,+BAA+B,GACzCC,0BAAa,CAACD,+BAA+B,GAC7C,IAAIE,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACT,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEA,SAASU,KAAKA,CACnBC,SAAiB,EACjBC,UAAkC,EAClCC,eAAuC,EACvCC,kBAA0C,EAC3B;EACf,OAAOT,+BAA+B,CAACK,KAAK,CAC1CC,SAAS,EACTC,UAAU,EACVC,eAAe,EACfC,kBACF,CAAC;AACH;AAEO,SAASC,YAAYA,CAACJ,SAAiB,EAAiB;EAC7D,OAAON,+BAA+B,CAACU,YAAY,CAACJ,SAAS,CAAC;AAChE;AAEO,SAASK,UAAUA,CAAA,EAAkB;EAC1C,OAAOX,+BAA+B,CAACW,UAAU,CAAC,CAAC;AACrD;AAEO,SAASC,SAASA,CAAA,EAAqB;EAC5C,OAAOZ,+BAA+B,CAACY,SAAS,CAAC,CAAC;AACpD;AAEO,SAASC,QAAQA,CACtBC,UAAkB,EAClBC,WAAmB,EACJ;EACf,OAAOf,+BAA+B,CAACa,QAAQ,CAACC,UAAU,EAAEC,WAAW,CAAC;AAC1E;AAmBA,MAAMC,+BAAsE,GAAG;EAC7EX,KAAK;EACLK,YAAY;EACZC,UAAU;EACVC,SAAS;EACTC;AACF,CAAC;AAAC,IAAAI,QAAA,GAAAC,OAAA,CAAAnB,OAAA,GAEaiB,+BAA+B","ignoreList":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PlushAnalyticsProvider = PlushAnalyticsProvider;
|
|
7
|
+
exports.usePlushAnalytics = usePlushAnalytics;
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _client = require("./client.js");
|
|
10
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
11
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
12
|
+
const PlushAnalyticsContext = /*#__PURE__*/(0, _react.createContext)(null);
|
|
13
|
+
function PlushAnalyticsProvider({
|
|
14
|
+
children,
|
|
15
|
+
config,
|
|
16
|
+
client
|
|
17
|
+
}) {
|
|
18
|
+
const clientRef = (0, _react.useRef)(null);
|
|
19
|
+
if (!clientRef.current) {
|
|
20
|
+
if (client) {
|
|
21
|
+
clientRef.current = client;
|
|
22
|
+
} else if (config) {
|
|
23
|
+
clientRef.current = (0, _client.createPlushAnalyticsClient)(config);
|
|
24
|
+
} else {
|
|
25
|
+
throw new Error("PlushAnalyticsProvider requires either a `client` or `config` prop.");
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
(0, _react.useEffect)(() => {
|
|
29
|
+
return () => {
|
|
30
|
+
void clientRef.current?.shutdown();
|
|
31
|
+
};
|
|
32
|
+
}, []);
|
|
33
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(PlushAnalyticsContext.Provider, {
|
|
34
|
+
value: clientRef.current,
|
|
35
|
+
children: children
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function usePlushAnalytics() {
|
|
39
|
+
const context = (0, _react.useContext)(PlushAnalyticsContext);
|
|
40
|
+
if (!context) {
|
|
41
|
+
throw new Error("usePlushAnalytics must be used inside PlushAnalyticsProvider.");
|
|
42
|
+
}
|
|
43
|
+
return context;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_client","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","PlushAnalyticsContext","createContext","PlushAnalyticsProvider","children","config","client","clientRef","useRef","current","createPlushAnalyticsClient","Error","useEffect","shutdown","jsx","Provider","value","usePlushAnalytics","context","useContext"],"sourceRoot":"../../src","sources":["provider.tsx"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAAiF,IAAAE,WAAA,GAAAF,OAAA;AAAA,SAAAD,wBAAAI,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAN,uBAAA,YAAAA,CAAAI,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AASjF,MAAMkB,qBAAqB,gBAAG,IAAAC,oBAAa,EAAwB,IAAI,CAAC;AAEjE,SAASC,sBAAsBA,CAAC;EACrCC,QAAQ;EACRC,MAAM;EACNC;AAC2B,CAAC,EAAsB;EAClD,MAAMC,SAAS,GAAG,IAAAC,aAAM,EAA8B,IAAI,CAAC;EAE3D,IAAI,CAACD,SAAS,CAACE,OAAO,EAAE;IACtB,IAAIH,MAAM,EAAE;MACVC,SAAS,CAACE,OAAO,GAAGH,MAAM;IAC5B,CAAC,MAAM,IAAID,MAAM,EAAE;MACjBE,SAAS,CAACE,OAAO,GAAG,IAAAC,kCAA0B,EAACL,MAAM,CAAC;IACxD,CAAC,MAAM;MACL,MAAM,IAAIM,KAAK,CAAC,qEAAqE,CAAC;IACxF;EACF;EAEA,IAAAC,gBAAS,EAAC,MAAM;IACd,OAAO,MAAM;MACX,KAAKL,SAAS,CAACE,OAAO,EAAEI,QAAQ,CAAC,CAAC;IACpC,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,oBAAO,IAAAhC,WAAA,CAAAiC,GAAA,EAACb,qBAAqB,CAACc,QAAQ;IAACC,KAAK,EAAET,SAAS,CAACE,OAAQ;IAAAL,QAAA,EAAEA;EAAQ,CAAiC,CAAC;AAC9G;AAEO,SAASa,iBAAiBA,CAAA,EAAmB;EAClD,MAAMC,OAAO,GAAG,IAAAC,iBAAU,EAAClB,qBAAqB,CAAC;EACjD,IAAI,CAACiB,OAAO,EAAE;IACZ,MAAM,IAAIP,KAAK,CAAC,+DAA+D,CAAC;EAClF;EAEA,OAAOO,OAAO;AAChB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import * as replayModule from "../nativeBridge.js";
|
|
4
|
+
const DEFAULT_SNAPSHOT_PATH = "/v1/events/batch";
|
|
5
|
+
const UUID_PATTERN = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
|
|
6
|
+
function assertNonEmpty(value, field) {
|
|
7
|
+
if (!value || !value.trim()) {
|
|
8
|
+
throw new Error(`${field} is required.`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function normalizeHost(value) {
|
|
12
|
+
return value.replace(/\/+$/, "");
|
|
13
|
+
}
|
|
14
|
+
function normalizeSnapshotPath(value) {
|
|
15
|
+
const trimmed = value?.trim();
|
|
16
|
+
if (!trimmed) return DEFAULT_SNAPSHOT_PATH;
|
|
17
|
+
return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
18
|
+
}
|
|
19
|
+
function isUuid(value) {
|
|
20
|
+
return UUID_PATTERN.test(value);
|
|
21
|
+
}
|
|
22
|
+
function generateUuid() {
|
|
23
|
+
const cryptoApi = globalThis.crypto;
|
|
24
|
+
if (cryptoApi?.randomUUID) return cryptoApi.randomUUID();
|
|
25
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, char => {
|
|
26
|
+
const random = Math.floor(Math.random() * 16);
|
|
27
|
+
const value = char === "x" ? random : random & 0x3 | 0x8;
|
|
28
|
+
return value.toString(16);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function normalizeReplayConfig(config) {
|
|
32
|
+
return {
|
|
33
|
+
maskAllTextInputs: config?.maskAllTextInputs ?? true,
|
|
34
|
+
maskAllImages: config?.maskAllImages ?? true,
|
|
35
|
+
maskAllSandboxedViews: config?.maskAllSandboxedViews ?? true,
|
|
36
|
+
captureLog: config?.captureLog ?? true,
|
|
37
|
+
captureNetworkTelemetry: config?.captureNetworkTelemetry ?? true,
|
|
38
|
+
throttleDelayMs: config?.throttleDelayMs ?? 1000
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function resolveSessionId(options) {
|
|
42
|
+
const requestedSessionId = options?.sessionId?.trim();
|
|
43
|
+
if (requestedSessionId && isUuid(requestedSessionId)) {
|
|
44
|
+
return requestedSessionId;
|
|
45
|
+
}
|
|
46
|
+
return generateUuid();
|
|
47
|
+
}
|
|
48
|
+
function assertNoPosthogDotCom(host) {
|
|
49
|
+
const lowered = host.toLowerCase();
|
|
50
|
+
const hostName = (() => {
|
|
51
|
+
try {
|
|
52
|
+
return new URL(host).hostname.toLowerCase();
|
|
53
|
+
} catch {
|
|
54
|
+
return lowered;
|
|
55
|
+
}
|
|
56
|
+
})();
|
|
57
|
+
if (hostName === "posthog.com" || hostName.endsWith(".posthog.com")) {
|
|
58
|
+
throw new Error("replayHost must not point to posthog.com (or a subdomain).");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function createMobileReplayRecorderAdapter(defaults) {
|
|
62
|
+
assertNonEmpty(defaults.apiKey, "apiKey");
|
|
63
|
+
assertNonEmpty(defaults.endpoint, "endpoint");
|
|
64
|
+
return {
|
|
65
|
+
start: async ({
|
|
66
|
+
onSessionId,
|
|
67
|
+
options
|
|
68
|
+
}) => {
|
|
69
|
+
const host = normalizeHost(options?.replayHost?.trim() || defaults.endpoint);
|
|
70
|
+
assertNoPosthogDotCom(host);
|
|
71
|
+
const snapshotPath = normalizeSnapshotPath(options?.replaySnapshotPath);
|
|
72
|
+
const activeSessionId = resolveSessionId(options);
|
|
73
|
+
const sdkOptions = {
|
|
74
|
+
apiKey: defaults.apiKey,
|
|
75
|
+
host,
|
|
76
|
+
debug: false,
|
|
77
|
+
distinctId: options?.userId?.trim() || "",
|
|
78
|
+
anonymousId: "",
|
|
79
|
+
sdkVersion: "plushanalytics-react-native",
|
|
80
|
+
flushAt: 20
|
|
81
|
+
};
|
|
82
|
+
await replayModule.start(activeSessionId, sdkOptions, normalizeReplayConfig(options?.replayConfig), {
|
|
83
|
+
endpoint: snapshotPath
|
|
84
|
+
});
|
|
85
|
+
await replayModule.startSession(activeSessionId);
|
|
86
|
+
onSessionId?.(activeSessionId);
|
|
87
|
+
return () => {
|
|
88
|
+
void replayModule.endSession();
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=mobileReplayAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["replayModule","DEFAULT_SNAPSHOT_PATH","UUID_PATTERN","assertNonEmpty","value","field","trim","Error","normalizeHost","replace","normalizeSnapshotPath","trimmed","startsWith","isUuid","test","generateUuid","cryptoApi","globalThis","crypto","randomUUID","char","random","Math","floor","toString","normalizeReplayConfig","config","maskAllTextInputs","maskAllImages","maskAllSandboxedViews","captureLog","captureNetworkTelemetry","throttleDelayMs","resolveSessionId","options","requestedSessionId","sessionId","assertNoPosthogDotCom","host","lowered","toLowerCase","hostName","URL","hostname","endsWith","createMobileReplayRecorderAdapter","defaults","apiKey","endpoint","start","onSessionId","replayHost","snapshotPath","replaySnapshotPath","activeSessionId","sdkOptions","debug","distinctId","userId","anonymousId","sdkVersion","flushAt","replayConfig","startSession","endSession"],"sourceRoot":"../../../src","sources":["adapters/mobileReplayAdapter.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { createPlushAnalyticsClient as createCoreClient, PlushAnalyticsClient } from "@plushanalytics/javascript";
|
|
4
|
+
import { createMobileReplayRecorderAdapter } from "./adapters/mobileReplayAdapter.js";
|
|
5
|
+
export { PlushAnalyticsClient };
|
|
6
|
+
const DEFAULT_ENDPOINT = "https://apim-plushanalytics-prod-rwth6ltqgdxg2.azure-api.net/api";
|
|
7
|
+
function normalizeSource(value) {
|
|
8
|
+
if (typeof value !== "string") return undefined;
|
|
9
|
+
const trimmed = value.trim();
|
|
10
|
+
if (!trimmed) return undefined;
|
|
11
|
+
return trimmed.length > 64 ? trimmed.slice(0, 64) : trimmed;
|
|
12
|
+
}
|
|
13
|
+
export function createPlushAnalyticsClient(config) {
|
|
14
|
+
const endpoint = config.endpoint ?? DEFAULT_ENDPOINT;
|
|
15
|
+
const source = normalizeSource(config.source) ?? "mobile";
|
|
16
|
+
const wrapped = {
|
|
17
|
+
...config,
|
|
18
|
+
endpoint,
|
|
19
|
+
source,
|
|
20
|
+
replay: {
|
|
21
|
+
...(config.replay ?? {}),
|
|
22
|
+
defaultRecorder: config.replay?.defaultRecorder ?? createMobileReplayRecorderAdapter({
|
|
23
|
+
apiKey: config.apiKey,
|
|
24
|
+
endpoint
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
return createCoreClient(wrapped);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Re-export the type so consumers can pass platform-specific options while using the core surface.
|
|
32
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createPlushAnalyticsClient","createCoreClient","PlushAnalyticsClient","createMobileReplayRecorderAdapter","DEFAULT_ENDPOINT","normalizeSource","value","undefined","trimmed","trim","length","slice","config","endpoint","source","wrapped","replay","defaultRecorder","apiKey"],"sourceRoot":"../../src","sources":["client.ts"],"mappings":";;AAAA,SACEA,0BAA0B,IAAIC,gBAAgB,EAC9CC,oBAAoB,QACf,4BAA4B;AACnC,SAASC,iCAAiC,QAAQ,mCAAgC;AAGlF,SAASD,oBAAoB;AAE7B,MAAME,gBAAgB,GAAG,kEAAkE;AAE3F,SAASC,eAAeA,CAACC,KAAc,EAAsB;EAC3D,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOC,SAAS;EAC/C,MAAMC,OAAO,GAAGF,KAAK,CAACG,IAAI,CAAC,CAAC;EAC5B,IAAI,CAACD,OAAO,EAAE,OAAOD,SAAS;EAC9B,OAAOC,OAAO,CAACE,MAAM,GAAG,EAAE,GAAGF,OAAO,CAACG,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAGH,OAAO;AAC7D;AAEA,OAAO,SAASR,0BAA0BA,CAACY,MAA4B,EAAwB;EAC7F,MAAMC,QAAQ,GAAGD,MAAM,CAACC,QAAQ,IAAIT,gBAAgB;EACpD,MAAMU,MAAM,GAAGT,eAAe,CAACO,MAAM,CAACE,MAAM,CAAC,IAAI,QAAQ;EAEzD,MAAMC,OAA6B,GAAG;IACpC,GAAGH,MAAM;IACTC,QAAQ;IACRC,MAAM;IACNE,MAAM,EAAE;MACN,IAAIJ,MAAM,CAACI,MAAM,IAAI,CAAC,CAAC,CAAC;MACxBC,eAAe,EACbL,MAAM,CAACI,MAAM,EAAEC,eAAe,IAC9Bd,iCAAiC,CAAC;QAChCe,MAAM,EAAEN,MAAM,CAACM,MAAM;QACrBL;MACF,CAAC;IACL;EACF,CAAC;EAED,OAAOZ,gBAAgB,CAACc,OAAO,CAAC;AAClC;;AAEA","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -1,36 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
default: ''
|
|
7
|
-
}) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
|
|
8
|
-
const PosthogReactNativeSessionReplay = NativeModules.PosthogReactNativeSessionReplay ? NativeModules.PosthogReactNativeSessionReplay : new Proxy({}, {
|
|
9
|
-
get() {
|
|
10
|
-
throw new Error(LINKING_ERROR);
|
|
11
|
-
}
|
|
12
|
-
});
|
|
13
|
-
export function start(sessionId, sdkOptions, sdkReplayConfig, decideReplayConfig) {
|
|
14
|
-
return PosthogReactNativeSessionReplay.start(sessionId, sdkOptions, sdkReplayConfig, decideReplayConfig);
|
|
15
|
-
}
|
|
16
|
-
export function startSession(sessionId) {
|
|
17
|
-
return PosthogReactNativeSessionReplay.startSession(sessionId);
|
|
18
|
-
}
|
|
19
|
-
export function endSession() {
|
|
20
|
-
return PosthogReactNativeSessionReplay.endSession();
|
|
21
|
-
}
|
|
22
|
-
export function isEnabled() {
|
|
23
|
-
return PosthogReactNativeSessionReplay.isEnabled();
|
|
24
|
-
}
|
|
25
|
-
export function identify(distinctId, anonymousId) {
|
|
26
|
-
return PosthogReactNativeSessionReplay.identify(distinctId, anonymousId);
|
|
27
|
-
}
|
|
28
|
-
const PostHogReactNativeSessionReplay = {
|
|
29
|
-
start,
|
|
30
|
-
startSession,
|
|
31
|
-
endSession,
|
|
32
|
-
isEnabled,
|
|
33
|
-
identify
|
|
34
|
-
};
|
|
35
|
-
export default PostHogReactNativeSessionReplay;
|
|
3
|
+
export { createPlushAnalyticsClient, PlushAnalyticsClient } from "./client.js";
|
|
4
|
+
export { createMobileReplayRecorderAdapter } from "./adapters/mobileReplayAdapter.js";
|
|
5
|
+
export { PlushAnalyticsProvider, usePlushAnalytics } from "./provider.js";
|
|
36
6
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["createPlushAnalyticsClient","PlushAnalyticsClient","createMobileReplayRecorderAdapter","PlushAnalyticsProvider","usePlushAnalytics"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,0BAA0B,EAAEC,oBAAoB,QAAQ,aAAU;AAC3E,SAASC,iCAAiC,QAAQ,mCAAgC;AAClF,SAASC,sBAAsB,EAAEC,iBAAiB,QAAQ,eAAY","ignoreList":[]}
|