Repository navigation
Expand file tree
/
Copy pathworker.ts
More file actions
76 lines (66 loc) · 2.41 KB
/
Copy pathworker.ts
File metadata and controls
76 lines (66 loc) · 2.41 KB
1
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
<
87C7
div data-line-number="42" class="react-line-number react-code-text" style="padding-right:16px">4243
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import { handleSearchRequest } from "./api";
import { createLocalSearchBackend, createVectorizeSearchBackend, type VectorizeIndex } from "./backends";
import { sampleGallery } from "./generated/sample-gallery";
import { createD1SearchMetadataStore, type D1Database } from "./metadataStore";
const R2_MODEL_PATHS = new Set([
"/models/dinov2-small-embed-int8.onnx",
"/models/mobileclip2-s0-vision.onnx",
]);
type R2ObjectBody = {
body: ReadableStream;
writeHttpMetadata(headers: Headers): void;
};
type R2Bucket = {
get(key: string): Promise<R2ObjectBody | null>;
};
type Env = {
VECTORIZE?: VectorizeIndex;
VECTORIZE_SAMPLE?: VectorizeIndex;
VECTORIZE_DINOV2?: VectorizeIndex;
VECTORIZE_MOBILECLIP2?: VectorizeIndex;
DB?: D1Database;
MODEL_BUCKET?: R2Bucket;
ASSETS: {
fetch(request: Request): Promise<Response>;
};
};
async function serveModelFromR2(pathname: string, env: Env): Promise<Response> {
const object = await env.MODEL_BUCKET?.get(pathname.slice(1));
if (!object) {
return new Response("모델을 R2에서 찾을 수 없습니다.", { status: 404 });
}
const headers = new Headers();
object.writeHttpMetadata(headers);
headers.set("cache-control", "public, max-age=31536000, immutable");
headers.set("content-type", headers.get("content-type") ?? "application/octet-stream");
return new Response(object.body, { headers });
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
if (R2_MODEL_PATHS.has(url.pathname)) {
return serveModelFromR2(url.pathname, env);
}
if (url.pathname === "/api/search") {
const sampleIndex = env.VECTORIZE_SAMPLE ?? env.VECTORIZE;
const metadataStore = env.DB ? createD1SearchMetadataStore(env.DB) : undefined;
return handleSearchRequest(request, {
"tiny-sample-v1": sampleIndex
? createVectorizeSearchBackend(sampleIndex, metadataStore)
: createLocalSearchBackend(sampleGallery),
...(env.VECTORIZE_DINOV2
? { "dinov2-small-v1": createVectorizeSearchBackend(env.VECTORIZE_DINOV2, metadataStore) }
: {}),
...(env.VECTORIZE_MOBILECLIP2
? {
"mobileclip2-s0-onnx-v1": createVectorizeSearchBackend(
env.VECTORIZE_MOBILECLIP2,
metadataStore,
),
}
: {}),
});
}
return env.ASSETS.fetch(request);
},
};