Skip to content

Commit a41eb9e

Browse files
authored
Merge pull request #1541 from lowcoder-org/fix/add_headers_to_all_ee_event
Added request headers to all EE event details payload
2 parents b44cf8a + 0d240d6 commit a41eb9e

File tree

9 files changed

+106
-93
lines changed

9 files changed

+106
-93
lines changed

client/packages/lowcoder-sdk/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lowcoder-sdk",
3-
"version": "2.6.3",
3+
"version": "2.6.4",
44
"type": "module",
55
"files": [
66
"src",
@@ -25,6 +25,9 @@
2525
},
2626
"./dist/style.css": {
2727
"import": "./dist/style.css"
28+
},
29+
"./dist/chunks/": {
30+
"import": "./dist/chunks/"
2831
}
2932
},
3033
"scripts": {

client/packages/lowcoder-sdk/vite.config.mts

Lines changed: 25 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,7 @@ export const viteConfig: UserConfig = {
3636
},
3737
base: ensureLastSlash(process.env.PUBLIC_URL),
3838
build: {
39-
minify: "terser",
40-
terserOptions: {
41-
compress: {
42-
drop_console: true,
43-
drop_debugger: true,
44-
pure_funcs: ["console.info", "console.debug", "console.log"],
45-
},
46-
format: {
47-
comments: false,
48-
},
49-
},
39+
minify: "terser",
5040
chunkSizeWarningLimit: 500,
5141
lib: {
5242
formats: ["es"],
@@ -56,46 +46,31 @@ export const viteConfig: UserConfig = {
5646
},
5747
rollupOptions: {
5848
treeshake: {
59-
moduleSideEffects: false,
49+
moduleSideEffects: true,
6050
propertyReadSideEffects: false,
6151
tryCatchDeoptimization: false,
6252
unknownGlobalSideEffects: false,
6353
},
6454
external: ["react", "react-dom"],
6555
output: {
6656
chunkFileNames: "chunks/[name]-[hash].js",
67-
entryFileNames: "entry/[name]-[hash].js",
68-
assetFileNames: "assets/[name]-[hash].[ext]",
57+
entryFileNames: "lowcoder-sdk.js",
58+
assetFileNames: "style.css",
6959
manualChunks: (id) => {
7060
if (id.includes("node_modules")) {
71-
// CORE FRAMEWORK CHUNKS
72-
if (id.includes("react")) return "react";
73-
if (id.includes("react-dom")) return "react-dom";
74-
if (id.includes("react-router")) return "react-router";
75-
if (id.includes("react-redux")) return "react-redux";
76-
if (id.includes("redux")) return "redux";
77-
if (id.includes("redux-saga")) return "redux-saga";
78-
7961
// UI LIBRARIES
8062
if (id.includes("@ant-design/icons")) return "ant-design-icons";
81-
if (id.includes("antd")) return "antd";
63+
if (id.includes("node_modules/antd")) return "antd";
8264
if (id.includes("styled-components")) return "styled-components";
8365

8466
// 🔹 BARCODE & QR CODE PROCESSING
85-
if (id.includes("zxing") || id.includes("Barcode") || id.includes("QRCode") || id.includes("PDF417")) return "barcode";
86-
87-
// CHARTING & DATA VISUALIZATION
88-
if (id.includes("echarts")) return "echarts";
89-
if (id.includes("echarts-wordcloud")) return "echarts-wordcloud";
90-
if (id.includes("d3")) return "d3";
67+
if (id.includes("react-qr-barcode-scanner")) return "barcode";
9168

9269
// TEXT EDITORS & PARSERS
9370
if (id.includes("codemirror")) return "codemirror";
9471
if (id.includes("quill")) return "quill";
9572
if (id.includes("react-json-view")) return "react-json-view";
96-
if (id.includes("react-markdown")) return "react-markdown";
9773
if (id.includes("react-quill")) return "react-quill";
98-
if (id.includes("remark") || id.includes("rehype") || id.includes("markdown")) return "markdown-parsers";
9974
if (id.includes("remark-gfm")) return "remark-gfm";
10075
if (id.includes("rehype-raw")) return "rehype-raw";
10176
if (id.includes("rehype-sanitize")) return "rehype-sanitize";
@@ -133,7 +108,6 @@ export const viteConfig: UserConfig = {
133108
if (id.includes("xlsx")) return "xlsx";
134109
if (id.includes("alasql")) return "alasql";
135110
if (id.includes("sql-formatter")) return "sql-formatter";
136-
if (id.includes("tern")) return "tern";
137111

138112
// NETWORK & HTTP
139113
if (id.includes("axios")) return "axios";
@@ -158,41 +132,38 @@ export const viteConfig: UserConfig = {
158132
if (id.includes("cnchar")) return "cnchar";
159133
if (id.includes("hotkeys-js")) return "hotkeys-js";
160134
if (id.includes("loglevel")) return "loglevel";
161-
if (id.includes("qrcode-react")) return "qrcode-react";
135+
if (id.includes("qrcode.react")) return "qrcode-react";
162136
if (id.includes("react-joyride")) return "react-joyride";
163137
if (id.includes("rc-trigger")) return "rc-trigger";
164138
if (id.includes("really-relaxed-json")) return "really-relaxed-json";
165139
if (id.includes("simplebar-react")) return "simplebar-react";
166-
return "vendor";
140+
if (id.includes("react-documents")) return "react-documents";
141+
if (id.includes("react-colorful")) return "react-colorful";
142+
if (id.includes("react-best-gradient-color-picker")) return "react-best-gradient-color-picker";
143+
if (id.includes("@supabase/supabase-js")) return "supabase";
144+
return null;
167145
}
168-
if (id.includes("src/api")) return "api";
169-
if (id.includes("src/appView")) return "appView";
170-
if (id.includes("src/base")) return "base";
171-
if (id.includes("src/constants")) return "constants";
172-
if (id.includes("src/i18n")) return "i18n";
173-
if (id.includes("src/ide")) return "ide";
174-
if (id.includes("src/layout")) return "layout";
175-
if (id.includes("src/pages")) return "pages";
176-
if (id.includes("src/redux")) return "app_redux";
177-
if (id.includes("src/comps")) return "comps";
178-
if (id.includes("comps/comps")) return "comps2";
179-
if (id.includes("comps/controls")) return "controls";
180-
if (id.includes("comps/queries")) return "queries";
181-
if (id.includes("comps/utils")) return "utils";
182-
if (id.includes("src/hooks")) return "hooks";
183-
if (id.includes("src/util")) return "util";
184-
return "common"; // 📦 Internal app shared code
185-
},
146+
return null;
147+
}
186148
},
187149
experimental: {
188150
minChunkSize: 300000, // 📏 Force smaller chunks (~300KB)
189151
},
190152
plugins: [
191-
terser(),
153+
terser({
154+
compress: {
155+
drop_console: true,
156+
drop_debugger: true,
157+
pure_funcs: ["console.info", "console.debug", "console.log"],
158+
},
159+
format: {
160+
comments: /(@vite-ignore|webpackIgnore)/
161+
},
162+
}) as PluginOption,
192163
strip({
193164
functions: ["console.log", "debugger"], // ✅ Remove logs
194165
sourceMap: true,
195-
}),
166+
}) as PluginOption,
196167
],
197168
onwarn: (warning, warn) => {
198169
if (warning.code === 'MODULE_LEVEL_DIRECTIVE') {

server/api-service/lowcoder-dependencies/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
<dependency>
2727
<groupId>org.lowcoder.plugin</groupId>
2828
<artifactId>lowcoder-plugin-api</artifactId>
29-
<version>2.3.0</version>
29+
<version>2.3.1</version>
3030
</dependency>
3131

3232
<dependency>

server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/AbstractEvent.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import lombok.Setter;
55
import lombok.experimental.SuperBuilder;
66
import org.lowcoder.plugin.api.event.LowcoderEvent;
7+
import org.lowcoder.sdk.constants.GlobalContext;
8+
import reactor.util.context.ContextView;
79

810
import java.lang.reflect.Field;
911
import java.util.HashMap;
@@ -19,6 +21,7 @@ public abstract class AbstractEvent implements LowcoderEvent
1921
protected final Boolean isAnonymous;
2022
private final String ipAddress;
2123
protected Map<String, Object> details;
24+
protected Map<String, String> eventHeaders;
2225
@Setter
2326
private static String environmentID;
2427

@@ -42,7 +45,10 @@ public B detail(String name, String value)
4245
}
4346
}
4447

45-
public void populateDetails() {
48+
public void populateDetails(ContextView contextView) {
49+
//populate eventHeaders field
50+
eventHeaders = contextView.get(GlobalContext.HEADERS);
51+
4652
if (details == null) {
4753
details = new HashMap<>();
4854
}
@@ -57,5 +63,8 @@ public void populateDetails() {
5763

5864
}
5965
details.put("environmentId", environmentID);
66+
if(!details.containsKey("headers")) {
67+
details.put("headers", eventHeaders);
68+
}
6069
}
6170
}

server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/constants/GlobalContext.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ public class GlobalContext {
1616

1717
public static final String CURRENT_ORG_MEMBER = "currentOrgMember";
1818
public static final String DOMAIN = "domain";
19+
public static final String HEADERS = "headers";
1920
}

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/ApiEventFilter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.springframework.web.server.WebFilterChain;
1818
import reactor.core.publisher.Mono;
1919
import reactor.core.scheduler.Schedulers;
20+
import reactor.util.context.ContextView;
2021

2122
import java.nio.charset.StandardCharsets;
2223
import java.util.Optional;
@@ -40,7 +41,7 @@ public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
4041
String token = contextView.get(VISITOR_TOKEN);
4142
((Mono<OrgMember>) contextView.get(CURRENT_ORG_MEMBER))
4243
.flatMap(orgMember -> {
43-
emitEvent(exchange.getRequest(), token, orgMember);
44+
emitEvent(exchange.getRequest(), token, orgMember, contextView);
4445
return Mono.empty();
4546
})
4647
.subscribeOn(Schedulers.boundedElastic())
@@ -51,7 +52,7 @@ public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
5152
);
5253
}
5354

54-
private void emitEvent(ServerHttpRequest request, String token, OrgMember orgMember) {
55+
private void emitEvent(ServerHttpRequest request, String token, OrgMember orgMember, ContextView contextView) {
5556
MultiValueMap<String, String> headers = writableHttpHeaders(request.getHeaders());
5657
headers.remove("Cookie");
5758
Optional<String> ipAddressOptional = headers.remove("X-Real-IP").stream().findFirst();
@@ -69,7 +70,7 @@ private void emitEvent(ServerHttpRequest request, String token, OrgMember orgMem
6970
.queryParams(request.getQueryParams())
7071
.ipAddress(ipAddress)
7172
.build();
72-
event.populateDetails();
73+
event.populateDetails(contextView);
7374

7475
log.debug("API call event emitted for '{}' from org '{}' on URI: {}", orgMember.getUserId(), orgMember.getUserId(), request.getURI().getPath());
7576
applicationEventPublisher.publishEvent(event);

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/GlobalContextFilter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.springframework.http.HttpMethod;
1717
import org.springframework.http.server.reactive.ServerHttpRequest;
1818
import org.springframework.stereotype.Component;
19+
import org.springframework.util.MultiValueMap;
1920
import org.springframework.web.server.ServerWebExchange;
2021
import org.springframework.web.server.WebFilter;
2122
import org.springframework.web.server.WebFilterChain;
@@ -32,6 +33,7 @@
3233
import static org.lowcoder.sdk.constants.Authentication.isAnonymousUser;
3334
import static org.lowcoder.sdk.constants.GlobalContext.*;
3435
import static org.lowcoder.sdk.util.IDUtils.generate;
36+
import static org.springframework.http.HttpHeaders.writableHttpHeaders;
3537

3638
@Component
3739
@RequiredArgsConstructor
@@ -107,6 +109,11 @@ private Map<String, Object> buildContextMap(ServerWebExchange serverWebExchange,
107109
contextMap.put(CURRENT_ORG_MEMBER, orgMemberService.getCurrentOrgMember(visitorId).cache());
108110
contextMap.put(VISITOR_TOKEN, cookieHelper.getCookieToken(serverWebExchange));
109111
contextMap.put(DOMAIN, UriUtils.getRefererDomainFromRequest(serverWebExchange));
112+
113+
//Analytics related fields
114+
MultiValueMap<String, String> headers = writableHttpHeaders(request.getHeaders());
115+
headers.remove("Cookie");
116+
contextMap.put(HEADERS, headers);
110117
return contextMap;
111118
}
112119

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/ApiCallEventPublisher.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ public Object handleAPICallEvent(ProceedingJoinPoint joinPoint) throws Throwable
5454
return sessionUserService.getVisitorToken()
5555
.zipWith(sessionUserService.getVisitorOrgMemberCacheSilent().defaultIfEmpty(OrgMember.NOT_EXIST))
5656
.zipWith(ReactiveRequestContextHolder.getRequest())
57-
.doOnNext(
57+
.delayUntil(
5858
tuple -> {
5959
String token = tuple.getT1().getT1();
6060
OrgMember orgMember = tuple.getT1().getT2();
6161
ServerHttpRequest request = tuple.getT2();
6262
if (orgMember == OrgMember.NOT_EXIST) {
63-
return;
63+
return Mono.empty();
6464
}
6565
MultiValueMap<String, String> headers = writableHttpHeaders(request.getHeaders());
6666
headers.remove("Cookie");
@@ -77,8 +77,11 @@ public Object handleAPICallEvent(ProceedingJoinPoint joinPoint) throws Throwable
7777
.queryParams(request.getQueryParams())
7878
.ipAddress(ipAddress)
7979
.build();
80-
event.populateDetails();
81-
applicationEventPublisher.publishEvent(event);
80+
return Mono.deferContextual(contextView -> {
81+
event.populateDetails(contextView);
82+
applicationEventPublisher.publishEvent(event);
83+
return Mono.empty();
84+
});
8285
})
8386
.onErrorResume(throwable -> {
8487
log.error("handleAPICallEvent error {} for: {} ", joinPoint.getSignature().getName(), EventType.API_CALL_EVENT, throwable);

0 commit comments

Comments
 (0)