react-native-tapline 0.0.0-stage → 1.1.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/LICENSE +21 -0
- package/README.md +86 -2
- package/TaplineNative.podspec +14 -0
- package/dist/actions.d.ts +203 -0
- package/dist/actions.js +1991 -0
- package/dist/actions.js.map +1 -0
- package/dist/agent.d.ts +117 -0
- package/dist/agent.js +352 -0
- package/dist/agent.js.map +1 -0
- package/dist/alerts.d.ts +35 -0
- package/dist/alerts.js +437 -0
- package/dist/alerts.js.map +1 -0
- package/dist/awake.d.ts +2 -0
- package/dist/awake.js +53 -0
- package/dist/awake.js.map +1 -0
- package/dist/checks.d.ts +35 -0
- package/dist/checks.js +501 -0
- package/dist/checks.js.map +1 -0
- package/dist/client.d.ts +111 -0
- package/dist/client.js +446 -0
- package/dist/client.js.map +1 -0
- package/dist/commands.d.ts +24 -0
- package/dist/commands.js +111 -0
- package/dist/commands.js.map +1 -0
- package/dist/events.d.ts +5 -0
- package/dist/events.js +22 -0
- package/dist/events.js.map +1 -0
- package/dist/feed.d.ts +117 -0
- package/dist/feed.js +440 -0
- package/dist/feed.js.map +1 -0
- package/dist/fiber.d.ts +43 -0
- package/dist/fiber.js +100 -0
- package/dist/fiber.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.js +181 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect.d.ts +249 -0
- package/dist/inspect.js +1354 -0
- package/dist/inspect.js.map +1 -0
- package/dist/keyboard.d.ts +10 -0
- package/dist/keyboard.js +63 -0
- package/dist/keyboard.js.map +1 -0
- package/dist/link.d.ts +21 -0
- package/dist/link.js +63 -0
- package/dist/link.js.map +1 -0
- package/dist/live.d.ts +30 -0
- package/dist/live.js +279 -0
- package/dist/live.js.map +1 -0
- package/dist/logs.d.ts +16 -0
- package/dist/logs.js +171 -0
- package/dist/logs.js.map +1 -0
- package/dist/methods.d.ts +3 -0
- package/dist/methods.js +49 -0
- package/dist/methods.js.map +1 -0
- package/dist/native.d.ts +34 -0
- package/dist/native.js +63 -0
- package/dist/native.js.map +1 -0
- package/dist/network.d.ts +27 -0
- package/dist/network.js +238 -0
- package/dist/network.js.map +1 -0
- package/dist/register.d.ts +24 -0
- package/dist/register.js +180 -0
- package/dist/register.js.map +1 -0
- package/dist/settle.d.ts +27 -0
- package/dist/settle.js +70 -0
- package/dist/settle.js.map +1 -0
- package/dist/source.d.ts +60 -0
- package/dist/source.js +214 -0
- package/dist/source.js.map +1 -0
- package/dist/storage.d.ts +10 -0
- package/dist/storage.js +45 -0
- package/dist/storage.js.map +1 -0
- package/dist/touches.d.ts +15 -0
- package/dist/touches.js +89 -0
- package/dist/touches.js.map +1 -0
- package/dist/types.d.ts +168 -0
- package/dist/types.js +32 -0
- package/dist/types.js.map +1 -0
- package/dist/wait.d.ts +8 -0
- package/dist/wait.js +99 -0
- package/dist/wait.js.map +1 -0
- package/expo-module.config.json +7 -0
- package/ios/TaplineNativeModule.swift +79 -0
- package/metro.d.ts +26 -0
- package/metro.js +146 -0
- package/package.json +100 -4
- package/register.d.ts +1 -0
- package/register.js +3 -0
package/dist/logs.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_LOG_ENTRIES = void 0;
|
|
4
|
+
exports.formatArgs = formatArgs;
|
|
5
|
+
exports.addLog = addLog;
|
|
6
|
+
exports.recordError = recordError;
|
|
7
|
+
exports.getLogEntries = getLogEntries;
|
|
8
|
+
exports.clearLogs = clearLogs;
|
|
9
|
+
exports.setLogSink = setLogSink;
|
|
10
|
+
exports.originalLog = originalLog;
|
|
11
|
+
exports.installLogs = installLogs;
|
|
12
|
+
exports.uninstallLogs = uninstallLogs;
|
|
13
|
+
const types_1 = require("./types");
|
|
14
|
+
exports.MAX_LOG_ENTRIES = 500;
|
|
15
|
+
const MAX_MESSAGE_CHARS = 4000;
|
|
16
|
+
const LEVELS = ['log', 'info', 'warn', 'error'];
|
|
17
|
+
const buffer = [];
|
|
18
|
+
let sink = null;
|
|
19
|
+
let installed = false;
|
|
20
|
+
let reentrant = false;
|
|
21
|
+
const originals = new Map();
|
|
22
|
+
let previousHandler;
|
|
23
|
+
let ourHandler = null;
|
|
24
|
+
function consoleOf() {
|
|
25
|
+
return console;
|
|
26
|
+
}
|
|
27
|
+
function errorUtils() {
|
|
28
|
+
const utils = globalThis.ErrorUtils;
|
|
29
|
+
return (0, types_1.isRecord)(utils) ? utils : null;
|
|
30
|
+
}
|
|
31
|
+
function stringify(value) {
|
|
32
|
+
if (typeof value === 'string')
|
|
33
|
+
return value;
|
|
34
|
+
if (value instanceof Error)
|
|
35
|
+
return value.stack ?? `${value.name}: ${value.message}`;
|
|
36
|
+
if (value === undefined)
|
|
37
|
+
return 'undefined';
|
|
38
|
+
if (typeof value === 'function')
|
|
39
|
+
return `[Function ${value.name || 'anonymous'}]`;
|
|
40
|
+
try {
|
|
41
|
+
const seen = new WeakSet();
|
|
42
|
+
const json = JSON.stringify(value, (_key, item) => {
|
|
43
|
+
if (typeof item === 'object' && item !== null) {
|
|
44
|
+
if (seen.has(item))
|
|
45
|
+
return '[Circular]';
|
|
46
|
+
seen.add(item);
|
|
47
|
+
}
|
|
48
|
+
if (typeof item === 'bigint')
|
|
49
|
+
return item.toString();
|
|
50
|
+
return item;
|
|
51
|
+
});
|
|
52
|
+
return json ?? String(value);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return String(value);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function formatArgs(args) {
|
|
59
|
+
const text = args.map(stringify).join(' ');
|
|
60
|
+
return text.length > MAX_MESSAGE_CHARS ? `${text.slice(0, MAX_MESSAGE_CHARS)}…` : text;
|
|
61
|
+
}
|
|
62
|
+
function push(entry) {
|
|
63
|
+
buffer.push(entry);
|
|
64
|
+
if (buffer.length > exports.MAX_LOG_ENTRIES)
|
|
65
|
+
buffer.splice(0, buffer.length - exports.MAX_LOG_ENTRIES);
|
|
66
|
+
}
|
|
67
|
+
function emit(event, data) {
|
|
68
|
+
const target = sink;
|
|
69
|
+
if (!target)
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
target(event, data);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// a broken socket must never reach the app
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Record a log line (also what the console patch calls). */
|
|
79
|
+
function addLog(level, message, ts = Date.now()) {
|
|
80
|
+
const entry = { level, message, ts };
|
|
81
|
+
push(entry);
|
|
82
|
+
emit('log', entry);
|
|
83
|
+
return entry;
|
|
84
|
+
}
|
|
85
|
+
function recordError(error, fatal) {
|
|
86
|
+
const ts = Date.now();
|
|
87
|
+
const message = error instanceof Error ? error.message : stringify(error);
|
|
88
|
+
const stack = error instanceof Error && typeof error.stack === 'string' ? error.stack : '';
|
|
89
|
+
push({ level: 'error', message: stack || message, ts });
|
|
90
|
+
emit('error', { message, stack, fatal, ts });
|
|
91
|
+
}
|
|
92
|
+
/** Buffered entries, optionally only those newer than `since` (ms epoch). */
|
|
93
|
+
function getLogEntries(since) {
|
|
94
|
+
const list = typeof since === 'number' ? buffer.filter((entry) => entry.ts > since) : buffer;
|
|
95
|
+
return list.map((entry) => ({ ...entry }));
|
|
96
|
+
}
|
|
97
|
+
function clearLogs() {
|
|
98
|
+
buffer.length = 0;
|
|
99
|
+
}
|
|
100
|
+
/** Route new entries to the connected client (null while disconnected). */
|
|
101
|
+
function setLogSink(next) {
|
|
102
|
+
sink = next;
|
|
103
|
+
}
|
|
104
|
+
/** The unpatched console.log, for Tapline's own one-line status messages. */
|
|
105
|
+
function originalLog(...args) {
|
|
106
|
+
const log = originals.get('log') ?? consoleOf().log;
|
|
107
|
+
if (typeof log === 'function')
|
|
108
|
+
log.apply(console, args);
|
|
109
|
+
}
|
|
110
|
+
function installLogs() {
|
|
111
|
+
if (installed)
|
|
112
|
+
return;
|
|
113
|
+
installed = true;
|
|
114
|
+
const target = consoleOf();
|
|
115
|
+
for (const level of LEVELS) {
|
|
116
|
+
const original = target[level];
|
|
117
|
+
if (typeof original !== 'function')
|
|
118
|
+
continue;
|
|
119
|
+
const originalFn = original;
|
|
120
|
+
originals.set(level, originalFn);
|
|
121
|
+
const patched = (...args) => {
|
|
122
|
+
if (!reentrant) {
|
|
123
|
+
reentrant = true;
|
|
124
|
+
try {
|
|
125
|
+
addLog(level, formatArgs(args));
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// ignore
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
reentrant = false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
originalFn.apply(console, args);
|
|
135
|
+
};
|
|
136
|
+
target[level] = patched;
|
|
137
|
+
}
|
|
138
|
+
const utils = errorUtils();
|
|
139
|
+
if (utils && typeof utils.setGlobalHandler === 'function') {
|
|
140
|
+
previousHandler = typeof utils.getGlobalHandler === 'function' ? utils.getGlobalHandler() : undefined;
|
|
141
|
+
ourHandler = (error, isFatal) => {
|
|
142
|
+
try {
|
|
143
|
+
recordError(error, isFatal === true);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// ignore
|
|
147
|
+
}
|
|
148
|
+
if (previousHandler)
|
|
149
|
+
previousHandler(error, isFatal);
|
|
150
|
+
};
|
|
151
|
+
utils.setGlobalHandler(ourHandler);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function uninstallLogs() {
|
|
155
|
+
if (!installed)
|
|
156
|
+
return;
|
|
157
|
+
installed = false;
|
|
158
|
+
const target = consoleOf();
|
|
159
|
+
for (const [level, original] of originals)
|
|
160
|
+
target[level] = original;
|
|
161
|
+
originals.clear();
|
|
162
|
+
const utils = errorUtils();
|
|
163
|
+
if (utils && typeof utils.setGlobalHandler === 'function' && ourHandler) {
|
|
164
|
+
if (previousHandler)
|
|
165
|
+
utils.setGlobalHandler(previousHandler);
|
|
166
|
+
}
|
|
167
|
+
previousHandler = undefined;
|
|
168
|
+
ourHandler = null;
|
|
169
|
+
sink = null;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=logs.js.map
|
package/dist/logs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"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"}
|
package/dist/methods.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.methods = void 0;
|
|
4
|
+
const actions_1 = require("./actions");
|
|
5
|
+
const checks_1 = require("./checks");
|
|
6
|
+
const commands_1 = require("./commands");
|
|
7
|
+
const inspect_1 = require("./inspect");
|
|
8
|
+
const live_1 = require("./live");
|
|
9
|
+
const wait_1 = require("./wait");
|
|
10
|
+
// The handler has run: viewers get their first frame now, not after the settle wait.
|
|
11
|
+
(0, actions_1.onActed)(live_1.frameAfterAction);
|
|
12
|
+
/** An action changes the screen: let anyone watching see the result soon. */
|
|
13
|
+
function action(fn) {
|
|
14
|
+
return async (params) => {
|
|
15
|
+
try {
|
|
16
|
+
return await fn(params);
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
(0, live_1.frameAfterAction)();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** Protocol method name -> implementation. */
|
|
24
|
+
exports.methods = {
|
|
25
|
+
tree: (params) => (0, inspect_1.tree)(params),
|
|
26
|
+
press: action((params) => (0, actions_1.press)(params)),
|
|
27
|
+
longPress: action((params) => (0, actions_1.longPress)(params)),
|
|
28
|
+
type: action((params) => (0, actions_1.typeText)(params)),
|
|
29
|
+
scroll: action((params) => (0, actions_1.scroll)(params)),
|
|
30
|
+
toggle: action((params) => (0, actions_1.toggle)(params)),
|
|
31
|
+
openURL: action((params) => (0, actions_1.openURL)(params)),
|
|
32
|
+
back: action((params) => (0, actions_1.back)(params)),
|
|
33
|
+
swipe: action((params) => (0, actions_1.swipe)(params)),
|
|
34
|
+
check: (params) => (0, checks_1.checkLayout)(params),
|
|
35
|
+
commands: async () => ({ commands: (0, commands_1.listCommands)() }),
|
|
36
|
+
command: action(async (params) => {
|
|
37
|
+
const ran = await (0, commands_1.runCommand)(params);
|
|
38
|
+
return { ...ran, ...(await (0, actions_1.settleOutcome)()) };
|
|
39
|
+
}),
|
|
40
|
+
waitFor: (params) => (0, wait_1.waitFor)(params),
|
|
41
|
+
logs: (params) => (0, actions_1.getLogs)(params),
|
|
42
|
+
inspect: (params) => (0, actions_1.inspect)(params),
|
|
43
|
+
audit: (params) => (0, actions_1.audit)(params),
|
|
44
|
+
reload: () => (0, actions_1.reload)(),
|
|
45
|
+
screenshot: (params) => (0, actions_1.screenshot)(params),
|
|
46
|
+
feed: (params) => (0, live_1.feedMethod)(params),
|
|
47
|
+
overlay: () => (0, inspect_1.overlay)(),
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":";;;AAAA,uCAAkK;AAClK,qCAAuC;AACvC,yCAAsD;AACtD,uCAA0C;AAC1C,iCAAsD;AACtD,iCAAiC;AAIjC,qFAAqF;AACrF,IAAA,iBAAO,EAAC,uBAAgB,CAAC,CAAC;AAE1B,6EAA6E;AAC7E,SAAS,MAAM,CAAC,EAAY;IAC1B,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,IAAA,uBAAgB,GAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,8CAA8C;AACjC,QAAA,OAAO,GAA6B;IAC/C,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,cAAI,EAAC,MAAM,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,eAAK,EAAC,MAAM,CAAC,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,mBAAS,EAAC,MAAM,CAAC,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,kBAAQ,EAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,gBAAM,EAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,gBAAM,EAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,iBAAO,EAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,cAAI,EAAC,MAAM,CAAC,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,eAAK,EAAC,MAAM,CAAC,CAAC;IACxC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,oBAAW,EAAC,MAAM,CAAC;IACtC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAA,uBAAY,GAAE,EAAE,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAA,qBAAU,EAAC,MAAM,CAAC,CAAC;QACrC,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,MAAM,IAAA,uBAAa,GAAE,CAAC,EAAE,CAAC;IAChD,CAAC,CAAC;IACF,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,cAAO,EAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,iBAAO,EAAC,MAAM,CAAC;IACjC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,iBAAO,EAAC,MAAM,CAAC;IACpC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,eAAK,EAAC,MAAM,CAAC;IAChC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAA,gBAAM,GAAE;IACtB,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,oBAAU,EAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,iBAAU,EAAC,MAAM,CAAC;IACpC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAA,iBAAO,GAAE;CACzB,CAAC"}
|
package/dist/native.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tapline's optional native module (`ios/TaplineNativeModule.swift`, an Expo module). An app built
|
|
3
|
+
* with it gets frames that don't make iOS render a new one (a smoother live viewer at less cost)
|
|
4
|
+
* and sees what UIKit draws over the app (alerts, the share sheet). Without it, the SDK works as
|
|
5
|
+
* before: screenshots through react-native-view-shot, and only the alerts it tracks in JavaScript.
|
|
6
|
+
*/
|
|
7
|
+
export interface TaplineNativeModule {
|
|
8
|
+
/** Base64 JPEG of the key window, `pixelWidth` pixels wide; "" when there is no window. */
|
|
9
|
+
capture(pixelWidth: number, quality: number, fresh: boolean): Promise<string>;
|
|
10
|
+
/** What UIKit presents over the app. */
|
|
11
|
+
cover(): Promise<unknown>;
|
|
12
|
+
}
|
|
13
|
+
/** What UIKit shows in front of the app, as the native module reports it. */
|
|
14
|
+
export interface NativeCover {
|
|
15
|
+
kind: 'alert' | 'actionSheet' | 'share';
|
|
16
|
+
title: string;
|
|
17
|
+
message: string;
|
|
18
|
+
buttons: Array<{
|
|
19
|
+
text: string;
|
|
20
|
+
destructive: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
/** The native module when the app was built with it, else null. */
|
|
24
|
+
export declare function nativeModule(): TaplineNativeModule | null;
|
|
25
|
+
/** Replace the native module (tests); null means "not built in", undefined restores the lookup. */
|
|
26
|
+
export declare function setNativeModule(next: TaplineNativeModule | null | undefined): void;
|
|
27
|
+
/**
|
|
28
|
+
* Asks the native module what covers the app now and remembers it for `currentCover`. Called
|
|
29
|
+
* before each request the host sends, so every answer and every check of that request sees it.
|
|
30
|
+
* Without the module, or when it fails, nothing covers the app as far as Tapline knows.
|
|
31
|
+
*/
|
|
32
|
+
export declare function refreshCover(): Promise<NativeCover | null>;
|
|
33
|
+
/** What covered the app at the last `refreshCover`. */
|
|
34
|
+
export declare function currentCover(): NativeCover | null;
|
package/dist/native.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.nativeModule = nativeModule;
|
|
4
|
+
exports.setNativeModule = setNativeModule;
|
|
5
|
+
exports.refreshCover = refreshCover;
|
|
6
|
+
exports.currentCover = currentCover;
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
let override;
|
|
9
|
+
let lastCover = null;
|
|
10
|
+
/** The native module when the app was built with it, else null. */
|
|
11
|
+
function nativeModule() {
|
|
12
|
+
if (override !== undefined)
|
|
13
|
+
return override;
|
|
14
|
+
const modules = globalThis.expo?.modules;
|
|
15
|
+
const candidate = modules?.TaplineNative;
|
|
16
|
+
return (0, types_1.isRecord)(candidate) && typeof candidate.capture === 'function' && typeof candidate.cover === 'function'
|
|
17
|
+
? candidate
|
|
18
|
+
: null;
|
|
19
|
+
}
|
|
20
|
+
/** Replace the native module (tests); null means "not built in", undefined restores the lookup. */
|
|
21
|
+
function setNativeModule(next) {
|
|
22
|
+
override = next;
|
|
23
|
+
lastCover = null;
|
|
24
|
+
}
|
|
25
|
+
function parseCover(raw) {
|
|
26
|
+
if (!(0, types_1.isRecord)(raw))
|
|
27
|
+
return null;
|
|
28
|
+
const kind = raw.kind;
|
|
29
|
+
if (kind !== 'alert' && kind !== 'actionSheet' && kind !== 'share')
|
|
30
|
+
return null;
|
|
31
|
+
const texts = Array.isArray(raw.buttons) ? raw.buttons : [];
|
|
32
|
+
const destructive = Array.isArray(raw.destructive) ? raw.destructive : [];
|
|
33
|
+
return {
|
|
34
|
+
kind,
|
|
35
|
+
title: typeof raw.title === 'string' ? raw.title : '',
|
|
36
|
+
message: typeof raw.message === 'string' ? raw.message : '',
|
|
37
|
+
buttons: texts.map((text, i) => ({ text: typeof text === 'string' ? text : '', destructive: destructive[i] === true })),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Asks the native module what covers the app now and remembers it for `currentCover`. Called
|
|
42
|
+
* before each request the host sends, so every answer and every check of that request sees it.
|
|
43
|
+
* Without the module, or when it fails, nothing covers the app as far as Tapline knows.
|
|
44
|
+
*/
|
|
45
|
+
async function refreshCover() {
|
|
46
|
+
const module = nativeModule();
|
|
47
|
+
if (module === null) {
|
|
48
|
+
lastCover = null;
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
lastCover = parseCover(await module.cover());
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
lastCover = null;
|
|
56
|
+
}
|
|
57
|
+
return lastCover;
|
|
58
|
+
}
|
|
59
|
+
/** What covered the app at the last `refreshCover`. */
|
|
60
|
+
function currentCover() {
|
|
61
|
+
return lastCover;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":";;AA2BA,oCAOC;AAGD,0CAGC;AAqBD,oCAYC;AAGD,oCAEC;AA9ED,mCAAmC;AAuBnC,IAAI,QAAgD,CAAC;AACrD,IAAI,SAAS,GAAuB,IAAI,CAAC;AAEzC,mEAAmE;AACnE,SAAgB,YAAY;IAC1B,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,OAAO,GAAI,UAA+D,CAAC,IAAI,EAAE,OAAO,CAAC;IAC/F,MAAM,SAAS,GAAG,OAAO,EAAE,aAAa,CAAC;IACzC,OAAO,IAAA,gBAAQ,EAAC,SAAS,CAAC,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,UAAU,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,UAAU;QAC5G,CAAC,CAAE,SAA4C;QAC/C,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,mGAAmG;AACnG,SAAgB,eAAe,CAAC,IAA4C;IAC1E,QAAQ,GAAG,IAAI,CAAC;IAChB,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,GAAY;IAC9B,IAAI,CAAC,IAAA,gBAAQ,EAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAChF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACrD,OAAO,EAAE,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAC3D,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;KACxH,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,SAAS,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,SAAS,GAAG,UAAU,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,uDAAuD;AACvD,SAAgB,YAAY;IAC1B,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network tracking: counts requests in flight (so an agent can wait for loading to finish)
|
|
3
|
+
* and reports failed ones. React Native's fetch is built on XMLHttpRequest, so patching
|
|
4
|
+
* XMLHttpRequest.prototype covers both. Nothing here may ever throw into the app.
|
|
5
|
+
*/
|
|
6
|
+
export interface NetworkFailure {
|
|
7
|
+
method: string;
|
|
8
|
+
url: string;
|
|
9
|
+
status: number | null;
|
|
10
|
+
error: string | null;
|
|
11
|
+
ms: number;
|
|
12
|
+
at: number;
|
|
13
|
+
}
|
|
14
|
+
export interface NetworkOptions {
|
|
15
|
+
target?: {
|
|
16
|
+
XMLHttpRequest?: unknown;
|
|
17
|
+
};
|
|
18
|
+
ignore?: (url: string) => boolean;
|
|
19
|
+
}
|
|
20
|
+
/** scheme://host[:port]/path, query replaced by "?…", no fragment or credentials. */
|
|
21
|
+
export declare function redactUrl(raw: string): string;
|
|
22
|
+
export declare function installNetworkTracking(options?: NetworkOptions): void;
|
|
23
|
+
export declare function uninstallNetworkTracking(): void;
|
|
24
|
+
/** Requests that have been sent and not yet finished (dev-server traffic excluded). */
|
|
25
|
+
export declare function inFlight(): number;
|
|
26
|
+
/** Be told about every failed request. Returns the unsubscribe function. */
|
|
27
|
+
export declare function onNetworkFailure(listener: (failure: NetworkFailure) => void): () => void;
|
package/dist/network.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Network tracking: counts requests in flight (so an agent can wait for loading to finish)
|
|
4
|
+
* and reports failed ones. React Native's fetch is built on XMLHttpRequest, so patching
|
|
5
|
+
* XMLHttpRequest.prototype covers both. Nothing here may ever throw into the app.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.redactUrl = redactUrl;
|
|
9
|
+
exports.installNetworkTracking = installNetworkTracking;
|
|
10
|
+
exports.uninstallNetworkTracking = uninstallNetworkTracking;
|
|
11
|
+
exports.inFlight = inFlight;
|
|
12
|
+
exports.onNetworkFailure = onNetworkFailure;
|
|
13
|
+
const MAX_URL_CHARS = 200;
|
|
14
|
+
const ABSOLUTE_URL = /^([a-z][a-z0-9+.-]*:\/\/)([^/?#]*)([^?#]*)(\?[^#]*)?(#.*)?$/i;
|
|
15
|
+
const DEV_SERVER_SEGMENT = /\/(?:symbolicate|logs|message|status|inspector|hot|open-stack-frame)(?:\/|$)/;
|
|
16
|
+
const listeners = new Set();
|
|
17
|
+
const requests = new WeakMap();
|
|
18
|
+
let installed = null;
|
|
19
|
+
let customIgnore = null;
|
|
20
|
+
let pending = 0;
|
|
21
|
+
let generation = 0;
|
|
22
|
+
/** scheme://host[:port]/path, query replaced by "?…", no fragment or credentials. */
|
|
23
|
+
function redactUrl(raw) {
|
|
24
|
+
const text = typeof raw === 'string' ? raw : String(raw);
|
|
25
|
+
const match = ABSOLUTE_URL.exec(text);
|
|
26
|
+
if (!match)
|
|
27
|
+
return text.slice(0, MAX_URL_CHARS);
|
|
28
|
+
const scheme = match[1] ?? '';
|
|
29
|
+
const authority = match[2] ?? '';
|
|
30
|
+
const path = match[3] ?? '';
|
|
31
|
+
const query = match[4];
|
|
32
|
+
const host = authority.slice(authority.lastIndexOf('@') + 1);
|
|
33
|
+
const redactedQuery = query !== undefined && query.length > 1 ? '?…' : (query ?? '');
|
|
34
|
+
return `${scheme}${host}${path}${redactedQuery}`.slice(0, MAX_URL_CHARS);
|
|
35
|
+
}
|
|
36
|
+
function defaultIgnore(url) {
|
|
37
|
+
const withoutAuthority = url.replace(/^[a-z][a-z0-9+.-]*:\/\/[^/?#]*/i, '');
|
|
38
|
+
const path = withoutAuthority.split(/[?#]/, 1)[0] ?? '';
|
|
39
|
+
if (DEV_SERVER_SEGMENT.test(path))
|
|
40
|
+
return true;
|
|
41
|
+
const noFragment = url.split('#', 1)[0] ?? url;
|
|
42
|
+
return noFragment.endsWith('.bundle') || noFragment.includes('.bundle?');
|
|
43
|
+
}
|
|
44
|
+
function isIgnored(url) {
|
|
45
|
+
try {
|
|
46
|
+
return (customIgnore ?? defaultIgnore)(url);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function notify(failure) {
|
|
53
|
+
for (const listener of [...listeners]) {
|
|
54
|
+
try {
|
|
55
|
+
listener(failure);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// a broken listener must not affect others or the app
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function isFn(value) {
|
|
63
|
+
return typeof value === 'function';
|
|
64
|
+
}
|
|
65
|
+
function track(xhr) {
|
|
66
|
+
const info = requests.get(xhr);
|
|
67
|
+
if (!info || info.ignored)
|
|
68
|
+
return null;
|
|
69
|
+
const startedAt = Date.now();
|
|
70
|
+
const forGeneration = generation;
|
|
71
|
+
let done = false;
|
|
72
|
+
let aborted = false;
|
|
73
|
+
let timedOut = false;
|
|
74
|
+
pending += 1;
|
|
75
|
+
/** Stop counting this request; returns false if it was already finished. */
|
|
76
|
+
const settle = () => {
|
|
77
|
+
if (done)
|
|
78
|
+
return false;
|
|
79
|
+
done = true;
|
|
80
|
+
if (forGeneration === generation && pending > 0)
|
|
81
|
+
pending -= 1;
|
|
82
|
+
return true;
|
|
83
|
+
};
|
|
84
|
+
const end = () => {
|
|
85
|
+
if (!settle())
|
|
86
|
+
return;
|
|
87
|
+
try {
|
|
88
|
+
if (aborted)
|
|
89
|
+
return;
|
|
90
|
+
const status = typeof xhr.status === 'number' ? xhr.status : 0;
|
|
91
|
+
let error = null;
|
|
92
|
+
let reported = null;
|
|
93
|
+
if (timedOut)
|
|
94
|
+
error = 'timeout';
|
|
95
|
+
else if (status === 0)
|
|
96
|
+
error = 'network error';
|
|
97
|
+
else if (status >= 400)
|
|
98
|
+
reported = status;
|
|
99
|
+
else
|
|
100
|
+
return;
|
|
101
|
+
const at = Date.now();
|
|
102
|
+
notify({ method: info.method, url: info.url, status: reported, error, ms: Math.max(0, at - startedAt), at });
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// never throw into the app
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
if (isFn(xhr.addEventListener)) {
|
|
109
|
+
const add = xhr.addEventListener;
|
|
110
|
+
add.call(xhr, 'abort', () => {
|
|
111
|
+
aborted = true;
|
|
112
|
+
});
|
|
113
|
+
add.call(xhr, 'timeout', () => {
|
|
114
|
+
timedOut = true;
|
|
115
|
+
});
|
|
116
|
+
add.call(xhr, 'loadend', end);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
const previous = xhr.onreadystatechange;
|
|
120
|
+
xhr.onreadystatechange = function wrapped(...args) {
|
|
121
|
+
try {
|
|
122
|
+
if (xhr.readyState === 4)
|
|
123
|
+
end();
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// ignore
|
|
127
|
+
}
|
|
128
|
+
return isFn(previous) ? previous.apply(this, args) : undefined;
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return settle;
|
|
132
|
+
}
|
|
133
|
+
function patchedOpen(original) {
|
|
134
|
+
return function open(...args) {
|
|
135
|
+
try {
|
|
136
|
+
if (typeof this === 'object' && this !== null) {
|
|
137
|
+
const rawUrl = String(args[1]);
|
|
138
|
+
requests.set(this, {
|
|
139
|
+
method: String(args[0]).toUpperCase(),
|
|
140
|
+
url: redactUrl(rawUrl),
|
|
141
|
+
ignored: isIgnored(rawUrl),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// never throw into the app
|
|
147
|
+
}
|
|
148
|
+
return original.apply(this, args);
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function patchedSend(original) {
|
|
152
|
+
return function send(...args) {
|
|
153
|
+
let settle = null;
|
|
154
|
+
try {
|
|
155
|
+
if (typeof this === 'object' && this !== null)
|
|
156
|
+
settle = track(this);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
settle = null;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
return original.apply(this, args);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
// the request never started: it can't end, so stop counting it
|
|
166
|
+
try {
|
|
167
|
+
settle?.();
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// ignore
|
|
171
|
+
}
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function installNetworkTracking(options = {}) {
|
|
177
|
+
if (installed)
|
|
178
|
+
return;
|
|
179
|
+
try {
|
|
180
|
+
const target = options.target ?? globalThis;
|
|
181
|
+
const ctor = target.XMLHttpRequest;
|
|
182
|
+
if (!isFn(ctor))
|
|
183
|
+
return;
|
|
184
|
+
const proto = ctor.prototype;
|
|
185
|
+
if (typeof proto !== 'object' || proto === null)
|
|
186
|
+
return;
|
|
187
|
+
const record = proto;
|
|
188
|
+
const open = record.open;
|
|
189
|
+
const send = record.send;
|
|
190
|
+
if (!isFn(open) || !isFn(send))
|
|
191
|
+
return;
|
|
192
|
+
installed = {
|
|
193
|
+
proto: record,
|
|
194
|
+
open: { own: Object.prototype.hasOwnProperty.call(record, 'open'), fn: open },
|
|
195
|
+
send: { own: Object.prototype.hasOwnProperty.call(record, 'send'), fn: send },
|
|
196
|
+
};
|
|
197
|
+
customIgnore = options.ignore ?? null;
|
|
198
|
+
record.open = patchedOpen(open);
|
|
199
|
+
record.send = patchedSend(send);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// never throw into the app
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function uninstallNetworkTracking() {
|
|
206
|
+
const current = installed;
|
|
207
|
+
installed = null;
|
|
208
|
+
customIgnore = null;
|
|
209
|
+
pending = 0;
|
|
210
|
+
generation += 1;
|
|
211
|
+
if (!current)
|
|
212
|
+
return;
|
|
213
|
+
try {
|
|
214
|
+
if (current.open.own)
|
|
215
|
+
current.proto.open = current.open.fn;
|
|
216
|
+
else
|
|
217
|
+
delete current.proto.open;
|
|
218
|
+
if (current.send.own)
|
|
219
|
+
current.proto.send = current.send.fn;
|
|
220
|
+
else
|
|
221
|
+
delete current.proto.send;
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// ignore
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** Requests that have been sent and not yet finished (dev-server traffic excluded). */
|
|
228
|
+
function inFlight() {
|
|
229
|
+
return pending;
|
|
230
|
+
}
|
|
231
|
+
/** Be told about every failed request. Returns the unsubscribe function. */
|
|
232
|
+
function onNetworkFailure(listener) {
|
|
233
|
+
listeners.add(listener);
|
|
234
|
+
return () => {
|
|
235
|
+
listeners.delete(listener);
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import this FIRST in the app's entry file, before React / React Native:
|
|
3
|
+
*
|
|
4
|
+
* import 'react-native-tapline/register';
|
|
5
|
+
*
|
|
6
|
+
* It installs a minimal React DevTools global hook (or wraps the existing one,
|
|
7
|
+
* chaining every call) so Tapline can see the app's fiber roots. This file must
|
|
8
|
+
* not import react or react-native.
|
|
9
|
+
*/
|
|
10
|
+
import { type Fiber, type FiberRootLike } from './fiber';
|
|
11
|
+
/** The number of React commits so far; it changes whenever the UI may have changed. */
|
|
12
|
+
export declare function commitRevision(): number;
|
|
13
|
+
/** Called after every React commit with the new revision; returns a function that stops it. */
|
|
14
|
+
export declare function onCommit(listener: (revision: number) => void): () => void;
|
|
15
|
+
/**
|
|
16
|
+
* Install (or wrap) the hook on `target` (default: globalThis). Idempotent per
|
|
17
|
+
* hook object. Returns the hook in effect.
|
|
18
|
+
*/
|
|
19
|
+
export declare function installHook(target?: object): unknown;
|
|
20
|
+
/** All live fiber roots known to Tapline. */
|
|
21
|
+
export declare function getRoots(): FiberRootLike[];
|
|
22
|
+
/** Test helper: forget recorded roots and the installed-hook memory. */
|
|
23
|
+
export declare function resetRegistry(): void;
|
|
24
|
+
export type { Fiber };
|