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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy