@lark-apaas/client-toolkit 1.1.14 → 1.1.15-alpha.dev.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/lib/components/AppContainer/IframeBridge.js +3 -3
- package/lib/components/AppContainer/PageHoc.js +2 -2
- package/lib/components/AppContainer/utils/listenHot.js +7 -9
- package/lib/logger/intercept-global-error.js +61 -1
- package/lib/types/iframe-events.d.ts +8 -1
- package/lib/utils/postMessage.d.ts +2 -1
- package/lib/utils/postMessage.js +7 -2
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@ import { useCallback, useEffect, useMemo, useRef } from "react";
|
|
|
3
3
|
import { useLocation, useNavigate } from "react-router-dom";
|
|
4
4
|
import { connectToParent } from "penpal";
|
|
5
5
|
import { useUpdatingRef } from "../../hooks/useUpdatingRef.js";
|
|
6
|
-
import {
|
|
6
|
+
import { submitPostMessage } from "../../utils/postMessage.js";
|
|
7
7
|
import { getPreviewParentOrigin } from "../../utils/getParentOrigin.js";
|
|
8
8
|
import { childApi } from "./utils/childApi.js";
|
|
9
9
|
import "./utils/listenHot.js";
|
|
@@ -17,7 +17,7 @@ function isRouteMessageType(type) {
|
|
|
17
17
|
return Object.values(IframeBridge_RouteMessageType).includes(type);
|
|
18
18
|
}
|
|
19
19
|
async function connectParent() {
|
|
20
|
-
|
|
20
|
+
submitPostMessage({
|
|
21
21
|
type: 'PreviewReady',
|
|
22
22
|
data: {}
|
|
23
23
|
});
|
|
@@ -61,7 +61,7 @@ function IframeBridge() {
|
|
|
61
61
|
isActive.current = false;
|
|
62
62
|
return;
|
|
63
63
|
}
|
|
64
|
-
|
|
64
|
+
submitPostMessage({
|
|
65
65
|
type: 'ChildLocationChange',
|
|
66
66
|
data: location
|
|
67
67
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Fragment, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect } from "react";
|
|
3
3
|
import { snapdom } from "@zumer/snapdom";
|
|
4
|
-
import {
|
|
4
|
+
import { submitPostMessage } from "../../utils/postMessage.js";
|
|
5
5
|
function PageHoc(props) {
|
|
6
6
|
const { children } = props;
|
|
7
7
|
useEffect(()=>{
|
|
@@ -17,7 +17,7 @@ function PageHoc(props) {
|
|
|
17
17
|
backgroundColor: '#ffffff'
|
|
18
18
|
}).then(async (res)=>{
|
|
19
19
|
const imgEle = await res.toPng();
|
|
20
|
-
|
|
20
|
+
submitPostMessage({
|
|
21
21
|
type: 'PageScreenshot',
|
|
22
22
|
data: imgEle.src
|
|
23
23
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import sockjs_client from "sockjs-client";
|
|
2
|
-
import {
|
|
2
|
+
import { submitPostMessage, submitSlardarEvent } from "../../../utils/postMessage.js";
|
|
3
3
|
import { getWsPath } from "../../../utils/utils.js";
|
|
4
4
|
let hotInited = false;
|
|
5
5
|
function handleDevServerMessage(msg) {
|
|
@@ -8,14 +8,14 @@ function handleDevServerMessage(msg) {
|
|
|
8
8
|
hotInited = true;
|
|
9
9
|
return;
|
|
10
10
|
}
|
|
11
|
-
|
|
11
|
+
submitPostMessage({
|
|
12
12
|
type: 'HmrMessage',
|
|
13
13
|
msg: {
|
|
14
14
|
type: 'hot'
|
|
15
15
|
},
|
|
16
16
|
data: null
|
|
17
17
|
});
|
|
18
|
-
} else if ('errors' === msg.type)
|
|
18
|
+
} else if ('errors' === msg.type) submitPostMessage({
|
|
19
19
|
type: 'HmrMessage',
|
|
20
20
|
msg: {
|
|
21
21
|
type: 'errors',
|
|
@@ -25,8 +25,7 @@ function handleDevServerMessage(msg) {
|
|
|
25
25
|
});
|
|
26
26
|
else if ('hmr-timing' === msg.type) {
|
|
27
27
|
const { duration, fileCount, fileTotalSize } = msg.data;
|
|
28
|
-
|
|
29
|
-
if (slardar && 'function' == typeof slardar) slardar('sendEvent', {
|
|
28
|
+
submitSlardarEvent({
|
|
30
29
|
name: 'runTiming',
|
|
31
30
|
metrics: {
|
|
32
31
|
duration
|
|
@@ -37,20 +36,19 @@ function handleDevServerMessage(msg) {
|
|
|
37
36
|
fileTotalSize
|
|
38
37
|
}
|
|
39
38
|
});
|
|
40
|
-
else console.warn('hmr listen function not found');
|
|
41
39
|
}
|
|
42
40
|
}
|
|
43
41
|
function connectDevServer() {
|
|
44
42
|
const sockUrl = getWsPath();
|
|
45
43
|
const sock = new sockjs_client(sockUrl);
|
|
46
|
-
sock.onopen = ()=>console.log(
|
|
44
|
+
sock.onopen = ()=>console.log('✅ connect DevServer SockJS');
|
|
47
45
|
sock.onmessage = (event)=>{
|
|
48
46
|
try {
|
|
49
47
|
const msg = JSON.parse(event.data);
|
|
50
|
-
console.log(
|
|
48
|
+
console.log('hmr 消息:', msg);
|
|
51
49
|
handleDevServerMessage(msg);
|
|
52
50
|
} catch (err) {
|
|
53
|
-
console.error(
|
|
51
|
+
console.error('解析 hmr 消息失败:', event.data);
|
|
54
52
|
}
|
|
55
53
|
};
|
|
56
54
|
return sock;
|
|
@@ -1,5 +1,64 @@
|
|
|
1
|
+
import { submitPostMessage, submitSlardarEvent } from "../utils/postMessage.js";
|
|
1
2
|
import { levelSchema } from "./log-types.js";
|
|
2
3
|
import { logger } from "./logger.js";
|
|
4
|
+
let devServerDisconnectInfo = null;
|
|
5
|
+
let retryCount = 0;
|
|
6
|
+
function processDevServerLog(log) {
|
|
7
|
+
if (!log) return;
|
|
8
|
+
if (log.includes('webpack-dev-server') && log.includes('Disconnected')) {
|
|
9
|
+
const time = Date.now();
|
|
10
|
+
devServerDisconnectInfo = {
|
|
11
|
+
time
|
|
12
|
+
};
|
|
13
|
+
submitPostMessage({
|
|
14
|
+
type: 'DevServerMessage',
|
|
15
|
+
data: {
|
|
16
|
+
type: 'devServer-status',
|
|
17
|
+
status: 'disconnected'
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
submitSlardarEvent({
|
|
21
|
+
name: 'sandbox-devServer',
|
|
22
|
+
categories: {
|
|
23
|
+
type: 'disconnected',
|
|
24
|
+
time
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (!devServerDisconnectInfo) return;
|
|
30
|
+
if (log.includes('webpack-dev-server') && log.includes('Trying to reconnect')) {
|
|
31
|
+
if (retryCount) submitSlardarEvent({
|
|
32
|
+
name: 'sandbox-devServer',
|
|
33
|
+
categories: {
|
|
34
|
+
type: 'reconnect-failed',
|
|
35
|
+
retryCount: retryCount + 1
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
retryCount++;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (log.includes('HMR') || log.includes('App updated') || log.includes('App hot update')) {
|
|
42
|
+
submitPostMessage({
|
|
43
|
+
type: 'DevServerMessage',
|
|
44
|
+
data: {
|
|
45
|
+
type: 'devServer-status',
|
|
46
|
+
status: 'connected'
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
const startTime = devServerDisconnectInfo.time;
|
|
50
|
+
const duration = Date.now() - startTime;
|
|
51
|
+
devServerDisconnectInfo = null;
|
|
52
|
+
submitSlardarEvent({
|
|
53
|
+
name: 'sandbox-devServer',
|
|
54
|
+
categories: {
|
|
55
|
+
type: 'devServer-reconnected',
|
|
56
|
+
startTime,
|
|
57
|
+
duration
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
3
62
|
function interceptErrors() {
|
|
4
63
|
window.addEventListener('error', (event)=>{
|
|
5
64
|
logger.error(event.error);
|
|
@@ -19,12 +78,13 @@ function interceptErrors() {
|
|
|
19
78
|
originalMethod(...args);
|
|
20
79
|
const level = 'log' === method ? 'info' : method;
|
|
21
80
|
const log = args[0];
|
|
81
|
+
if ('string' == typeof log) processDevServerLog(log);
|
|
22
82
|
if ('string' == typeof log && log.startsWith('[Dataloom]') && levelSchema.safeParse(level).success) {
|
|
23
83
|
logger.log({
|
|
24
84
|
level: level,
|
|
25
85
|
args
|
|
26
86
|
});
|
|
27
|
-
|
|
87
|
+
submitPostMessage({
|
|
28
88
|
type: 'Console',
|
|
29
89
|
method,
|
|
30
90
|
data: args
|
|
@@ -38,7 +38,14 @@ export interface HmrMessage extends IframeMessage<Record<string, never>> {
|
|
|
38
38
|
data?: any;
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
|
-
|
|
41
|
+
/** devServer相关消息 */
|
|
42
|
+
export interface DevServerMessage extends IframeMessage<{
|
|
43
|
+
type: 'devServer-status';
|
|
44
|
+
status: 'connected' | 'disconnected';
|
|
45
|
+
}> {
|
|
46
|
+
type: 'DevServerMessage';
|
|
47
|
+
}
|
|
48
|
+
export type OutgoingMessage = PreviewReadyMessage | HmrMessage | ConsoleMessage | ChildLocationChangeMessage | CreatePageMessage | RenderErrorMessage | RenderErrorRepairMessage | PageScreenshotMessage | DevServerMessage | UpdateRoutesMessage;
|
|
42
49
|
export interface GetRoutesMessage extends IframeMessage<Record<string, never>> {
|
|
43
50
|
type: 'GetRoutes';
|
|
44
51
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { IncomingMessage, OutgoingMessage } from '../types/iframe-events';
|
|
2
|
-
export declare function
|
|
2
|
+
export declare function submitPostMessage<T extends OutgoingMessage>(message: T, targetOrigin?: string): void;
|
|
3
|
+
export declare function submitSlardarEvent(event: any): void;
|
|
3
4
|
export declare function isOutgoingMessage<T extends OutgoingMessage['type']>(msg: OutgoingMessage, type: T): msg is Extract<OutgoingMessage, {
|
|
4
5
|
type: T;
|
|
5
6
|
}>;
|
package/lib/utils/postMessage.js
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { getPreviewParentOrigin } from "./getParentOrigin.js";
|
|
2
|
-
function
|
|
2
|
+
function submitPostMessage(message, targetOrigin) {
|
|
3
3
|
try {
|
|
4
4
|
window.parent.postMessage(message, targetOrigin ?? getPreviewParentOrigin());
|
|
5
5
|
} catch (e) {
|
|
6
6
|
console.error('postMessage error', e);
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
+
function submitSlardarEvent(event) {
|
|
10
|
+
const slardar = window['KSlardarWeb'];
|
|
11
|
+
if (slardar && 'function' == typeof slardar) slardar('sendEvent', event);
|
|
12
|
+
else console.warn('hmr listen function not found');
|
|
13
|
+
}
|
|
9
14
|
function isOutgoingMessage(msg, type) {
|
|
10
15
|
return msg.type === type;
|
|
11
16
|
}
|
|
12
17
|
function isIncomingMessage(msg, type) {
|
|
13
18
|
return msg.type === type;
|
|
14
19
|
}
|
|
15
|
-
export { isIncomingMessage, isOutgoingMessage,
|
|
20
|
+
export { isIncomingMessage, isOutgoingMessage, submitPostMessage, submitSlardarEvent };
|