catalyst-core 0.2.0-beta.2 → 0.3.0-beta.1
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/babel.native.config.cjs +8 -0
- package/bin/catalyst.js +49 -105
- package/changelog.md +8 -0
- package/dist/caching.js +1 -1
- package/dist/index.jsx +8 -0
- package/dist/logger.js +74 -3
- package/dist/native/androidProject/app/build.gradle.kts +1 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/CustomWebview.kt +143 -4
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/MainActivity.kt +26 -6
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/MetricsMonitor.kt +143 -17
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/NativeBridge.kt +6 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/WebCacheManager.kt +26 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/BridgeUtils.kt +56 -1
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/KeyboardUtil.kt +48 -8
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/PerfDeliveryState.kt +36 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/PerfEventBuffer.kt +289 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/ProfilerNavigationState.kt +13 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/ProfilerLifecycleTest.kt +51 -0
- package/dist/native/androidSetup.js +300 -8
- package/dist/native/bridge/WebBridge.js +481 -59
- package/dist/native/bridge/constants/NativeInterfaces.js +290 -44
- package/dist/native/bridge/errors.js +250 -26
- package/dist/native/bridge/hooks/index.js +125 -1
- package/dist/native/bridge/hooks/useCamera.js +347 -9
- package/dist/native/bridge/hooks/useDataProtection.js +200 -2
- package/dist/native/bridge/hooks/useDeviceInfo.js +71 -2
- package/dist/native/bridge/hooks/useFilePicker.js +429 -2
- package/dist/native/bridge/hooks/useGoogleSignIn.js +81 -1
- package/dist/native/bridge/hooks/useHapticFeedback.js +196 -1
- package/dist/native/bridge/hooks/useIntent.js +95 -1
- package/dist/native/bridge/hooks/useNativeTransition.js +202 -27
- package/dist/native/bridge/hooks/useNetworkStatus.js +84 -3
- package/dist/native/bridge/hooks/useNotification.js +318 -2
- package/dist/native/bridge/hooks/useSafeArea.js +84 -2
- package/dist/native/bridge/hooks/useVideoStream.js +434 -6
- package/dist/native/bridge/hooks/utils.js +27 -1
- package/dist/native/bridge/hooks.js +16 -1
- package/dist/native/bridge/perf/collectors/ApiCollector.js +85 -0
- package/dist/native/bridge/perf/collectors/CacheCollector.js +215 -0
- package/dist/native/bridge/perf/collectors/HookCollector.js +165 -0
- package/dist/native/bridge/perf/collectors/InsightsCollector.js +505 -0
- package/dist/native/bridge/perf/collectors/InteractionCollector.js +273 -0
- package/dist/native/bridge/perf/collectors/KeyboardCollector.js +124 -0
- package/dist/native/bridge/perf/collectors/NavigationCollector.js +294 -0
- package/dist/native/bridge/perf/collectors/NetworkTimingCollector.js +183 -0
- package/dist/native/bridge/perf/collectors/RenderCollector.js +284 -0
- package/dist/native/bridge/perf/collectors/ScrollCollector.js +111 -0
- package/dist/native/bridge/perf/collectors/ThreadCollector.js +111 -0
- package/dist/native/bridge/perf/core/constants.js +126 -0
- package/dist/native/bridge/perf/core/measure.js +189 -0
- package/dist/native/bridge/perf/core/session.js +100 -0
- package/dist/native/bridge/perf/core/store.js +554 -0
- package/dist/native/bridge/perf/core/summary.js +174 -0
- package/dist/native/bridge/perf/core/traceExport.js +240 -0
- package/dist/native/bridge/perf/core/waterfalls.js +146 -0
- package/dist/native/bridge/perf/index.js +402 -0
- package/dist/native/bridge/safeArea.js +53 -5
- package/dist/native/bridge/standardizedHooks.js +595 -82
- package/dist/native/bridge/useBaseHook.js +274 -38
- package/dist/native/bridge/utils/CameraUtils.js +201 -56
- package/dist/native/bridge/utils/FileObjectConverter.js +129 -18
- package/dist/native/bridge/utils/NativeBridge.js +425 -141
- package/dist/native/buildAndroid/assets.js +510 -13
- package/dist/native/buildAndroid/build.js +296 -19
- package/dist/native/buildAndroid/config.js +87 -1
- package/dist/native/buildAndroid/index.js +374 -1
- package/dist/native/buildAppAndroid.js +34 -2
- package/dist/native/buildAppIos.js +62 -2
- package/dist/native/buildIos/assets.js +609 -8
- package/dist/native/buildIos/build.js +639 -20
- package/dist/native/buildIos/config.js +294 -12
- package/dist/native/buildIos/index.js +343 -6
- package/dist/native/buildIos/plugins.js +343 -16
- package/dist/native/internal-plugins/device-info-plugin/android/DeviceInfoPlugin.kt +43 -0
- package/dist/native/internal-plugins/device-info-plugin/ios/DeviceInfoPlugin.swift +28 -0
- package/dist/native/internal-plugins/device-info-plugin/manifest.json +19 -0
- package/dist/native/internalPluginUtils.js +232 -7
- package/dist/native/iosnativeWebView/Sources/Core/Constants/CatalystConstants.swift +19 -0
- package/dist/native/iosnativeWebView/Sources/Core/Constants/ConfigConstants.swift +4 -0
- package/dist/native/iosnativeWebView/Sources/Core/Utils/BootTimingUtility.swift +5 -1
- package/dist/native/iosnativeWebView/Sources/Core/Utils/CacheManager.swift +10 -0
- package/dist/native/iosnativeWebView/Sources/Core/Utils/DisplayLinkPerfMonitor.swift +89 -0
- package/dist/native/iosnativeWebView/Sources/Core/Utils/PerfEventBuffer.swift +373 -0
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeFileHandler.swift +35 -1
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeMessageValidator.swift +24 -11
- package/dist/native/iosnativeWebView/Sources/Core/WebView/NativeBridge.swift +9 -0
- package/dist/native/iosnativeWebView/Sources/Core/WebView/WebView.swift +126 -0
- package/dist/native/iosnativeWebView/Sources/Core/WebView/WebViewNavigationDelegate.swift +75 -1
- package/dist/native/iosnativeWebView/iosnativeWebViewTests/BridgeMessageValidatorTests.swift +13 -0
- package/dist/native/package.json +3 -0
- package/dist/native/plugin-bridge/PluginBridge.js +227 -1
- package/dist/native/pluginComposerAndroid.js +407 -23
- package/dist/native/pluginComposerIos.js +435 -11
- package/dist/native/renameAndroidProject.js +1094 -88
- package/dist/native/setupEmulatorIos.js +289 -22
- package/dist/native/setupServer.js +160 -19
- package/dist/native/terminalProgress.js +199 -11
- package/dist/native/utils.js +193 -15
- package/dist/offline/catalyst-sw.js +145 -1
- package/dist/offline/registerServiceWorker.js +33 -1
- package/dist/otel.js +375 -46
- package/dist/router/ClientRouter.js +14 -2
- package/dist/router/ServerRouter.js +9 -1
- package/dist/router.js +1 -1
- package/dist/scripts/build.js +112 -3
- package/dist/scripts/checkVersion.js +3 -1
- package/dist/scripts/cleanCache.js +30 -1
- package/dist/scripts/generateOfflineManifest.js +116 -1
- package/dist/scripts/loadEnvironmentVariables.js +32 -6
- package/dist/scripts/plugins.js +309 -1
- package/dist/scripts/preServerInit.js +13 -0
- package/dist/scripts/scriptUtils.js +54 -3
- package/dist/scripts/serve.js +51 -4
- package/dist/scripts/start.js +47 -10
- package/dist/scripts/validator.js +149 -1
- package/dist/sentry.cjs +127 -0
- package/dist/sentry.js +125 -5
- package/dist/server/expressServer.js +250 -5
- package/dist/server/manifestCache.js +36 -0
- package/dist/server/renderer/ChunkExtractor.js +144 -0
- package/dist/server/renderer/document/Body.jsx +59 -0
- package/dist/server/renderer/document/FastRefresh.jsx +20 -0
- package/dist/server/renderer/document/Head.jsx +60 -0
- package/dist/server/renderer/document/index.jsx +2 -0
- package/dist/server/renderer/extract.js +149 -31
- package/dist/server/renderer/handler.jsx +433 -0
- package/dist/server/renderer/index.js +8 -1
- package/dist/server/renderer/render.js +47 -0
- package/dist/server/utils/botDetectionMiddleware.js +29 -0
- package/dist/server/utils/cjsRequire.js +10 -0
- package/dist/server/utils/userAgentUtil.js +87 -9
- package/dist/server/utils/validator.js +164 -1
- package/dist/vite/FastRefresh.jsx +20 -0
- package/dist/vite/inject-cache-key-plugin.js +276 -0
- package/dist/vite/loadCustomViteConfig.js +22 -0
- package/dist/vite/manifest-categorization-plugin.js +455 -0
- package/dist/vite/node-loader.mjs +458 -0
- package/dist/vite/scssParams.js +21 -0
- package/dist/vite/vite.config.client.js +130 -0
- package/dist/vite/vite.config.js +422 -0
- package/dist/vite/vite.config.server.js +84 -0
- package/dist/web-router/components/MetaTag.jsx +34 -0
- package/dist/web-router/components/RouterDataProvider.jsx +332 -0
- package/dist/web-router/components/Split.jsx +200 -0
- package/dist/web-router/components/SplitInview.jsx +106 -0
- package/dist/web-router/components/SsrRequestContext.jsx +14 -0
- package/dist/web-router/context.jsx +12 -0
- package/dist/web-router/hooks.jsx +72 -0
- package/dist/web-router/types/components/MetaTag.d.ts +2 -0
- package/dist/web-router/types/components/RouterDataProvider.d.ts +95 -0
- package/dist/web-router/types/context.d.ts +14 -0
- package/dist/web-router/types/hooks.d.ts +1 -0
- package/dist/web-router/types/index.d.ts +3 -0
- package/dist/web-router/types/utils/metaDataUtils.d.ts +24 -0
- package/dist/web-router/utils/metaDataUtils.jsx +119 -0
- package/mcp_v2/conversion-tasks.json +35 -17
- package/mcp_v2/knowledge-base.json +124 -13
- package/mcp_v2/lib/helpers.js +10 -0
- package/mcp_v2/mcp.js +4 -4
- package/mcp_v2/package.json +1 -0
- package/mcp_v2/tools/build.js +116 -20
- package/mcp_v2/tools/conversion.js +106 -5
- package/mcp_v2/tools/tasks.js +18 -14
- package/package.json +35 -68
- package/babel.config.js +0 -32
- package/dist/index.js +0 -1
- package/dist/scripts/devBuild.js +0 -3
- package/dist/scripts/devServe.js +0 -3
- package/dist/scripts/loadScriptsBeforeServerStarts.js +0 -4
- package/dist/scripts/registerAliases.js +0 -6
- package/dist/server/renderer/document/Body.js +0 -11
- package/dist/server/renderer/document/Head.js +0 -9
- package/dist/server/renderer/document/index.js +0 -1
- package/dist/server/renderer/handler.js +0 -47
- package/dist/server/startServer.js +0 -57
- package/dist/webpack/babel-plugins/remove-client.plugin.js +0 -5
- package/dist/webpack/babel-plugins/remove-ssr.plugin.js +0 -5
- package/dist/webpack/babel.config.client.js +0 -1
- package/dist/webpack/babel.config.ssr.js +0 -1
- package/dist/webpack/base.babel.js +0 -7
- package/dist/webpack/development.client.babel.js +0 -10
- package/dist/webpack/production.client.babel.js +0 -4
- package/dist/webpack/production.ssr.babel.js +0 -8
- package/dist/webpack/scssParams.js +0 -9
|
@@ -1,59 +1,481 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _NativeInterfaces = require("./constants/NativeInterfaces.js");
|
|
8
|
+
var _NativeBridge = _interopRequireDefault(require("./utils/NativeBridge.js"));
|
|
9
|
+
var _CameraUtils = _interopRequireDefault(require("./utils/CameraUtils.js"));
|
|
10
|
+
var _PluginBridge = _interopRequireDefault(require("../plugin-bridge/PluginBridge.js"));
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
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); }
|
|
13
|
+
const DEVICE_INFO_PLUGIN = {
|
|
14
|
+
pluginId: "io.catalyst.device_info",
|
|
15
|
+
command: "getDeviceInfo",
|
|
16
|
+
successEvent: "onSuccess",
|
|
17
|
+
errorEvent: "onError"
|
|
18
|
+
};
|
|
19
|
+
const DEVICE_INFO_REQUEST_TIMEOUT_MS = 5000;
|
|
20
|
+
const DEVICE_INFO_PLUGIN_FALLBACK_CODES = new Set(["PLUGIN_NOT_FOUND", "COMMAND_NOT_SUPPORTED", "PLUGIN_NOT_REGISTERED"]);
|
|
21
|
+
const DEVICE_INFO_PLUGIN_FALLBACK_MESSAGES = ["pluginbridge is not available in this environment", "pluginbridge is not available", "device info plugin request timed out"];
|
|
22
|
+
const normalizeDeviceInfoPayload = payload => {
|
|
23
|
+
if (typeof payload !== "string") {
|
|
24
|
+
return payload;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
return JSON.parse(payload);
|
|
28
|
+
} catch {
|
|
29
|
+
return {
|
|
30
|
+
message: payload
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const createDeviceInfoError = (payload, fallbackMessage) => {
|
|
35
|
+
const parsed = normalizeDeviceInfoPayload(payload);
|
|
36
|
+
const message = parsed?.message || parsed?.error || fallbackMessage;
|
|
37
|
+
const error = new Error(message);
|
|
38
|
+
if (parsed?.code) {
|
|
39
|
+
error.code = parsed.code;
|
|
40
|
+
}
|
|
41
|
+
if (parsed?.pluginId) {
|
|
42
|
+
error.pluginId = parsed.pluginId;
|
|
43
|
+
}
|
|
44
|
+
if (parsed?.command) {
|
|
45
|
+
error.command = parsed.command;
|
|
46
|
+
}
|
|
47
|
+
return error;
|
|
48
|
+
};
|
|
49
|
+
class WebBridge {
|
|
50
|
+
constructor() {
|
|
51
|
+
this.handlers = new Map();
|
|
52
|
+
this.initialized = false;
|
|
53
|
+
this._logInitialization();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Log initialization info
|
|
58
|
+
*/
|
|
59
|
+
_logInitialization() {
|
|
60
|
+
console.log("🌉 WebBridge initialized");
|
|
61
|
+
console.log("🌉 Available callback interfaces:", _NativeInterfaces.ALL_CALLBACKS.length);
|
|
62
|
+
if (process.env.NODE_ENV === "development") {
|
|
63
|
+
(0, _NativeInterfaces.debugInterfaces)();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Static method to initialize WebBridge on window object
|
|
69
|
+
*/
|
|
70
|
+
static init = () => {
|
|
71
|
+
if (typeof window === "undefined") {
|
|
72
|
+
console.error("🌉 WebBridge cannot be initialized outside the browser!");
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
if (window.WebBridge) {
|
|
76
|
+
console.warn("🌉 WebBridge already initialized!");
|
|
77
|
+
return window.WebBridge;
|
|
78
|
+
}
|
|
79
|
+
const bridge = new WebBridge();
|
|
80
|
+
window.WebBridge = bridge;
|
|
81
|
+
bridge.initialized = true;
|
|
82
|
+
const {
|
|
83
|
+
platform
|
|
84
|
+
} = _NativeBridge.default.getEnvironmentInfo();
|
|
85
|
+
if (window.__CATALYST_PROFILER_ENABLED === true) {
|
|
86
|
+
Promise.resolve().then(() => _interopRequireWildcard(require("./perf/index.js"))).then(({
|
|
87
|
+
default: WebPerfCollector
|
|
88
|
+
}) => {
|
|
89
|
+
WebPerfCollector.init(bridge);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
console.log("🌉 WebBridge created and attached to window");
|
|
93
|
+
return {
|
|
94
|
+
bridge,
|
|
95
|
+
platform,
|
|
96
|
+
getDeviceInfo: bridge.getDeviceInfo
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Main callback handler called by native platforms
|
|
102
|
+
* @param {string} interfaceName - The callback interface name
|
|
103
|
+
* @param {any} data - Data from native platform
|
|
104
|
+
*/
|
|
105
|
+
callback = (interfaceName, data) => {
|
|
106
|
+
console.log(`🌉 WebBridge callback: ${interfaceName}`, data ? {
|
|
107
|
+
data
|
|
108
|
+
} : "");
|
|
109
|
+
|
|
110
|
+
// Validate interface
|
|
111
|
+
if (!(0, _NativeInterfaces.isValidCallback)(interfaceName)) {
|
|
112
|
+
console.error(`🌉 Invalid callback interface: ${interfaceName}`);
|
|
113
|
+
console.log("🌉 Available callbacks:", _NativeInterfaces.ALL_CALLBACKS);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (!this.handlers.has(interfaceName)) {
|
|
117
|
+
console.warn(`🌉 No handler registered for interface: ${interfaceName}`);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
const handler = this.handlers.get(interfaceName);
|
|
122
|
+
handler(data);
|
|
123
|
+
} catch (error) {
|
|
124
|
+
console.error(`🌉 Error executing callback for ${interfaceName}:`, error);
|
|
125
|
+
|
|
126
|
+
// In development, provide more helpful error info
|
|
127
|
+
if (process.env.NODE_ENV === "development") {
|
|
128
|
+
console.error("🌉 Handler details:", {
|
|
129
|
+
interfaceName,
|
|
130
|
+
data,
|
|
131
|
+
handlerType: typeof this.handlers.get(interfaceName)
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Register a callback handler for a native interface
|
|
139
|
+
* @param {string} interfaceName - The callback interface name (from NATIVE_CALLBACKS)
|
|
140
|
+
* @param {function} callback - The callback function to execute
|
|
141
|
+
* @returns {boolean} - Success status
|
|
142
|
+
*/
|
|
143
|
+
register = (interfaceName, callback) => {
|
|
144
|
+
// Validate callback function
|
|
145
|
+
if (typeof callback !== "function") {
|
|
146
|
+
console.error("🌉 Callback must be a function!");
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Validate interface name
|
|
151
|
+
if (!(0, _NativeInterfaces.isValidCallback)(interfaceName)) {
|
|
152
|
+
console.error(`🌉 Invalid callback interface: ${interfaceName}`);
|
|
153
|
+
console.log("🌉 Available callback interfaces:", _NativeInterfaces.ALL_CALLBACKS);
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Warn if overriding existing handler
|
|
158
|
+
if (this.handlers.has(interfaceName)) {
|
|
159
|
+
console.warn(`🌉 Interface ${interfaceName} already registered! Overriding existing handler.`);
|
|
160
|
+
}
|
|
161
|
+
console.log(`🌉 Registering callback interface: ${interfaceName}`);
|
|
162
|
+
this.handlers.set(interfaceName, callback);
|
|
163
|
+
return true;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Unregister a callback handler
|
|
168
|
+
* @param {string} interfaceName - The callback interface name to unregister
|
|
169
|
+
* @returns {boolean} - Success status
|
|
170
|
+
*/
|
|
171
|
+
unregister = interfaceName => {
|
|
172
|
+
if (!this.handlers.has(interfaceName)) {
|
|
173
|
+
console.warn(`🌉 Interface ${interfaceName} not registered, nothing to unregister.`);
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
console.log(`🌉 Unregistering callback interface: ${interfaceName}`);
|
|
177
|
+
this.handlers.delete(interfaceName);
|
|
178
|
+
return true;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Check if a callback interface is registered
|
|
183
|
+
* @param {string} interfaceName - The callback interface name
|
|
184
|
+
* @returns {boolean} - Registration status
|
|
185
|
+
*/
|
|
186
|
+
isRegistered = interfaceName => {
|
|
187
|
+
return this.handlers.has(interfaceName);
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Get all registered callback interfaces
|
|
192
|
+
* @returns {string[]} - Array of registered interface names
|
|
193
|
+
*/
|
|
194
|
+
getRegisteredInterfaces = () => {
|
|
195
|
+
return Array.from(this.handlers.keys());
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Get handler for a specific interface (for debugging)
|
|
200
|
+
* @param {string} interfaceName - The callback interface name
|
|
201
|
+
* @returns {function|null} - The registered handler or null
|
|
202
|
+
*/
|
|
203
|
+
getHandler = interfaceName => {
|
|
204
|
+
return this.handlers.get(interfaceName) || null;
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Clear all registered handlers
|
|
209
|
+
*/
|
|
210
|
+
clearAll = () => {
|
|
211
|
+
const count = this.handlers.size;
|
|
212
|
+
this.handlers.clear();
|
|
213
|
+
console.log(`🌉 Cleared ${count} registered callback handlers`);
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Debug method to log current state
|
|
218
|
+
*/
|
|
219
|
+
debug = () => {
|
|
220
|
+
console.group("🌉 WebBridge Debug Info");
|
|
221
|
+
console.log("Initialized:", this.initialized);
|
|
222
|
+
console.log("Available callback interfaces:", _NativeInterfaces.ALL_CALLBACKS);
|
|
223
|
+
console.log("Registered interfaces:", this.getRegisteredInterfaces());
|
|
224
|
+
console.log("Total handlers:", this.handlers.size);
|
|
225
|
+
if (this.handlers.size > 0) {
|
|
226
|
+
console.log("Handler details:");
|
|
227
|
+
this.handlers.forEach((handler, interfaceName) => {
|
|
228
|
+
console.log(` ${interfaceName}:`, typeof handler);
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
console.groupEnd();
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Test callback functionality (for debugging)
|
|
236
|
+
* @param {string} interfaceName - The callback interface to test
|
|
237
|
+
* @param {any} testData - Test data to pass
|
|
238
|
+
*/
|
|
239
|
+
testCallback = (interfaceName, testData = "test") => {
|
|
240
|
+
if (process.env.NODE_ENV !== "development") {
|
|
241
|
+
console.warn("🌉 testCallback is only available in development mode");
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
console.log(`🌉 Testing callback: ${interfaceName}`);
|
|
245
|
+
this.callback(interfaceName, testData);
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Request haptic feedback
|
|
250
|
+
* @param {string} feedbackType - Type of haptic feedback (VIRTUAL_KEY, LONG_PRESS, DEFAULT)
|
|
251
|
+
* @returns {Promise<Object>} - Promise that resolves with haptic feedback result or rejects with error
|
|
252
|
+
*/
|
|
253
|
+
requestHapticFeedback = (feedbackType = "VIRTUAL_KEY") => {
|
|
254
|
+
return new Promise((resolve, reject) => {
|
|
255
|
+
const cleanup = () => {
|
|
256
|
+
this.unregister(_NativeInterfaces.NATIVE_CALLBACKS.HAPTIC_FEEDBACK);
|
|
257
|
+
};
|
|
258
|
+
this.register(_NativeInterfaces.NATIVE_CALLBACKS.HAPTIC_FEEDBACK, data => {
|
|
259
|
+
cleanup();
|
|
260
|
+
try {
|
|
261
|
+
const result = typeof data === "string" ? JSON.parse(data) : data;
|
|
262
|
+
if (result.error) {
|
|
263
|
+
reject(new Error(result.error));
|
|
264
|
+
} else {
|
|
265
|
+
resolve(result);
|
|
266
|
+
}
|
|
267
|
+
} catch (error) {
|
|
268
|
+
reject(error);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
try {
|
|
272
|
+
_NativeBridge.default.haptic.feedback(feedbackType);
|
|
273
|
+
} catch (error) {
|
|
274
|
+
cleanup();
|
|
275
|
+
reject(error);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Open camera and capture image
|
|
282
|
+
* @param {Object} options - Camera options (quality, format, cameraDevice, flashMode, allowEditing)
|
|
283
|
+
* @returns {Promise<Object>} - Promise that resolves with camera result or rejects with error
|
|
284
|
+
*/
|
|
285
|
+
openCamera = (options = {}) => {
|
|
286
|
+
return _CameraUtils.default.openCamera(options, this.register, this.unregister);
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Request camera permission
|
|
291
|
+
* @param {Object} config - Permission configuration (includeDetails)
|
|
292
|
+
* @returns {Promise<Object>} - Promise that resolves with permission status or rejects with error
|
|
293
|
+
*/
|
|
294
|
+
requestCameraPermission = (config = {}) => {
|
|
295
|
+
return _CameraUtils.default.requestCameraPermission(config, this.register, this.unregister);
|
|
296
|
+
};
|
|
297
|
+
getDeviceInfoFromLegacyBridge = parseDeviceInfo => {
|
|
298
|
+
return new Promise((resolve, reject) => {
|
|
299
|
+
let timeoutId = null;
|
|
300
|
+
const cleanup = () => {
|
|
301
|
+
if (timeoutId != null) {
|
|
302
|
+
clearTimeout(timeoutId);
|
|
303
|
+
}
|
|
304
|
+
this.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_DEVICE_INFO_SUCCESS);
|
|
305
|
+
this.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_DEVICE_INFO_ERROR);
|
|
306
|
+
};
|
|
307
|
+
this.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_DEVICE_INFO_SUCCESS, data => {
|
|
308
|
+
cleanup();
|
|
309
|
+
resolve(parseDeviceInfo(data));
|
|
310
|
+
});
|
|
311
|
+
this.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_DEVICE_INFO_ERROR, error => {
|
|
312
|
+
cleanup();
|
|
313
|
+
reject(new Error(error));
|
|
314
|
+
});
|
|
315
|
+
try {
|
|
316
|
+
const dispatched = _NativeBridge.default.device.getDeviceInfo();
|
|
317
|
+
if (dispatched === false) {
|
|
318
|
+
cleanup();
|
|
319
|
+
reject(new Error("Legacy device info bridge failed to dispatch"));
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
timeoutId = setTimeout(() => {
|
|
323
|
+
cleanup();
|
|
324
|
+
reject(new Error("Legacy device info request timed out"));
|
|
325
|
+
}, DEVICE_INFO_REQUEST_TIMEOUT_MS);
|
|
326
|
+
} catch (error) {
|
|
327
|
+
cleanup();
|
|
328
|
+
reject(error);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
};
|
|
332
|
+
getDeviceInfoFromPluginBridge = parseDeviceInfo => {
|
|
333
|
+
return new Promise((resolve, reject) => {
|
|
334
|
+
_PluginBridge.default.init();
|
|
335
|
+
let isSettled = false;
|
|
336
|
+
let timeoutId = null;
|
|
337
|
+
const cleanups = [];
|
|
338
|
+
const cleanup = () => {
|
|
339
|
+
if (timeoutId != null) {
|
|
340
|
+
clearTimeout(timeoutId);
|
|
341
|
+
}
|
|
342
|
+
while (cleanups.length > 0) {
|
|
343
|
+
const unregister = cleanups.pop();
|
|
344
|
+
unregister();
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
const settle = callback => {
|
|
348
|
+
if (isSettled) {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
isSettled = true;
|
|
352
|
+
cleanup();
|
|
353
|
+
callback();
|
|
354
|
+
};
|
|
355
|
+
cleanups.push(_PluginBridge.default.register({
|
|
356
|
+
pluginId: DEVICE_INFO_PLUGIN.pluginId,
|
|
357
|
+
eventName: DEVICE_INFO_PLUGIN.successEvent,
|
|
358
|
+
command: DEVICE_INFO_PLUGIN.command,
|
|
359
|
+
handler: payload => {
|
|
360
|
+
settle(() => {
|
|
361
|
+
try {
|
|
362
|
+
resolve(parseDeviceInfo(payload));
|
|
363
|
+
} catch (error) {
|
|
364
|
+
reject(error);
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
}));
|
|
369
|
+
cleanups.push(_PluginBridge.default.register({
|
|
370
|
+
pluginId: DEVICE_INFO_PLUGIN.pluginId,
|
|
371
|
+
eventName: DEVICE_INFO_PLUGIN.errorEvent,
|
|
372
|
+
command: DEVICE_INFO_PLUGIN.command,
|
|
373
|
+
handler: payload => {
|
|
374
|
+
settle(() => {
|
|
375
|
+
reject(createDeviceInfoError(payload, "Device info plugin failed"));
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
}));
|
|
379
|
+
cleanups.push(_PluginBridge.default.register({
|
|
380
|
+
pluginId: "__bridge__",
|
|
381
|
+
eventName: "PLUGIN_BRIDGE_ERROR",
|
|
382
|
+
command: DEVICE_INFO_PLUGIN.command,
|
|
383
|
+
handler: payload => {
|
|
384
|
+
const pluginId = normalizeDeviceInfoPayload(payload)?.pluginId;
|
|
385
|
+
if (pluginId !== DEVICE_INFO_PLUGIN.pluginId) {
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
settle(() => {
|
|
389
|
+
reject(createDeviceInfoError(payload, "Device info plugin unavailable"));
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
}));
|
|
393
|
+
try {
|
|
394
|
+
_PluginBridge.default.emit({
|
|
395
|
+
pluginId: DEVICE_INFO_PLUGIN.pluginId,
|
|
396
|
+
command: DEVICE_INFO_PLUGIN.command
|
|
397
|
+
});
|
|
398
|
+
timeoutId = setTimeout(() => {
|
|
399
|
+
settle(() => {
|
|
400
|
+
reject(new Error("Device info plugin request timed out"));
|
|
401
|
+
});
|
|
402
|
+
}, DEVICE_INFO_REQUEST_TIMEOUT_MS);
|
|
403
|
+
} catch (error) {
|
|
404
|
+
cleanup();
|
|
405
|
+
reject(error);
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
};
|
|
409
|
+
shouldFallbackToLegacyDeviceInfo = error => {
|
|
410
|
+
if (!error) {
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
if (DEVICE_INFO_PLUGIN_FALLBACK_CODES.has(error.code)) {
|
|
414
|
+
return true;
|
|
415
|
+
}
|
|
416
|
+
if (typeof error.message !== "string") {
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
419
|
+
const normalizedMessage = error.message.toLowerCase();
|
|
420
|
+
return DEVICE_INFO_PLUGIN_FALLBACK_MESSAGES.some(message => normalizedMessage.includes(message));
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Get device information
|
|
425
|
+
* @returns {Promise<Object>} - Promise that resolves with device info or rejects with error
|
|
426
|
+
*/
|
|
427
|
+
getDeviceInfo = async () => {
|
|
428
|
+
const {
|
|
429
|
+
platform,
|
|
430
|
+
isNativeEnvironment
|
|
431
|
+
} = _NativeBridge.default.getEnvironmentInfo();
|
|
432
|
+
|
|
433
|
+
// Handle web environment
|
|
434
|
+
if (!isNativeEnvironment || platform === "web") {
|
|
435
|
+
return {
|
|
436
|
+
model: navigator.userAgent,
|
|
437
|
+
manufacturer: "browser",
|
|
438
|
+
platform: "web",
|
|
439
|
+
screenWidth: screen.width,
|
|
440
|
+
screenHeight: screen.height,
|
|
441
|
+
screenDensity: window.devicePixelRatio
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// Key mapping from native to web keys
|
|
446
|
+
const DEVICE_INFO_KEY_MAP = {
|
|
447
|
+
android: {
|
|
448
|
+
model: "model",
|
|
449
|
+
manufacturer: "manufacturer",
|
|
450
|
+
platform: "platform",
|
|
451
|
+
screenWidth: "screenWidth",
|
|
452
|
+
screenHeight: "screenHeight",
|
|
453
|
+
screenDensity: "screenDensity",
|
|
454
|
+
appInfo: "appInfo"
|
|
455
|
+
},
|
|
456
|
+
ios: {
|
|
457
|
+
model: "model",
|
|
458
|
+
manufacturer: "manufacturer",
|
|
459
|
+
platform: "platform",
|
|
460
|
+
screenWidth: "screenWidth",
|
|
461
|
+
screenHeight: "screenHeight",
|
|
462
|
+
screenDensity: "screenDensity",
|
|
463
|
+
appInfo: "appInfo"
|
|
464
|
+
}
|
|
465
|
+
};
|
|
466
|
+
const parseDeviceInfo = data => {
|
|
467
|
+
const rawDeviceInfo = typeof data === "string" ? JSON.parse(data) : data;
|
|
468
|
+
const platformMapping = DEVICE_INFO_KEY_MAP[platform] || {};
|
|
469
|
+
return Object.fromEntries(Object.entries(rawDeviceInfo).map(([key, value]) => [platformMapping[key] || key, value]));
|
|
470
|
+
};
|
|
471
|
+
try {
|
|
472
|
+
return await this.getDeviceInfoFromPluginBridge(parseDeviceInfo);
|
|
473
|
+
} catch (error) {
|
|
474
|
+
if (!this.shouldFallbackToLegacyDeviceInfo(error)) {
|
|
475
|
+
throw error;
|
|
476
|
+
}
|
|
477
|
+
return this.getDeviceInfoFromLegacyBridge(parseDeviceInfo);
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
var _default = exports.default = WebBridge;
|