Skip to content

Commit e6a0d4b

Browse files
committed
fix: s3 init
1 parent 0ab9b17 commit e6a0d4b

File tree

2 files changed

+40
-17
lines changed

2 files changed

+40
-17
lines changed

lib/s3/index.ts

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -99,31 +99,58 @@ const createS3Service = async (bucket: string, isPublic: boolean) => {
9999
return new S3Service(client, externalClient);
100100
};
101101

102-
declare global {
103-
var _publicS3Server: S3Service;
104-
var _privateS3Server: S3Service;
105-
}
102+
const s3ServiceInstances: {
103+
publicS3Server: S3Service | null;
104+
privateS3Server: S3Service | null;
105+
} = {
106+
publicS3Server: null,
107+
privateS3Server: null
108+
};
106109

107110
export const initS3Service = async () => {
108111
const logger = getLogger(infra.storage);
109112
logger.info('Initializing S3 service...');
110113
const { publicBucket, privateBucket } = getConfig();
111114

112115
try {
113-
if (!globalThis._publicS3Server) {
116+
if (!s3ServiceInstances.publicS3Server) {
114117
logger.debug('Initializing public S3 service...');
115-
globalThis._publicS3Server = await createS3Service(publicBucket, true);
118+
s3ServiceInstances.publicS3Server = await createS3Service(publicBucket, true);
116119
}
117120

118-
if (!globalThis._privateS3Server) {
121+
if (!s3ServiceInstances.privateS3Server) {
119122
logger.debug('Initializing private S3 service...');
120-
globalThis._privateS3Server = await createS3Service(privateBucket, false);
123+
s3ServiceInstances.privateS3Server = await createS3Service(privateBucket, false);
121124
}
122125
} catch (e) {
123126
logger.error('Failed to initialize S3 service:', { error: e });
124127
throw new Error('Failed to initialize S3 service');
125128
}
126129
};
127130

128-
export const publicS3Server = globalThis._publicS3Server;
129-
export const privateS3Server = globalThis._privateS3Server;
131+
export const getPublicS3Server = (): S3Service => {
132+
if (!s3ServiceInstances.publicS3Server) {
133+
throw new Error('Public S3 service not initialized. Call initS3Service() first.');
134+
}
135+
return s3ServiceInstances.publicS3Server;
136+
};
137+
138+
export const getPrivateS3Server = (): S3Service => {
139+
if (!s3ServiceInstances.privateS3Server) {
140+
throw new Error('Private S3 service not initialized. Call initS3Service() first.');
141+
}
142+
return s3ServiceInstances.privateS3Server;
143+
};
144+
145+
// 为了向后兼容,保留旧的导出方式(但使用 getter)
146+
export const publicS3Server = new Proxy({} as S3Service, {
147+
get(_, prop) {
148+
return getPublicS3Server()[prop as keyof S3Service];
149+
}
150+
});
151+
152+
export const privateS3Server = new Proxy({} as S3Service, {
153+
get(_, prop) {
154+
return getPrivateS3Server()[prop as keyof S3Service];
155+
}
156+
});

modules/tool/utils/uploadFile.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { FileInput } from '@/s3/type';
33
import { parentPort } from 'worker_threads';
44
import { getNanoid } from './string';
55
import { getCurrentToolPrefix } from './context';
6+
import { getPublicS3Server } from '@/s3';
67

78
// Extend global type to access currentToolPrefix set by worker
89
declare global {
@@ -66,16 +67,11 @@ export const uploadFile = async (data: FileInput) => {
6667
});
6768
});
6869
} else {
69-
if (!global._publicS3Server) {
70-
throw new Error(
71-
'S3 Server not initialized in global context. If you are in dev mode, please ensure the system is initialized.'
72-
);
73-
}
74-
70+
const publicS3Server = getPublicS3Server();
7571
// 从 AsyncLocalStorage 的上下文中获取前缀(用于非 worker 环境)
7672
const prefix = getCurrentToolPrefix();
7773

78-
return await global._publicS3Server.uploadFileAdvanced({
74+
return await publicS3Server.uploadFileAdvanced({
7975
...data,
8076
...(data.buffer ? { buffer: data.buffer } : {}),
8177
prefix

0 commit comments

Comments
 (0)