diff --git a/blocksuite/affine/all/src/__tests__/utils/create-job.ts b/blocksuite/affine/all/src/__tests__/utils/create-job.ts
index 366750ad56..ff1ba0966b 100644
--- a/blocksuite/affine/all/src/__tests__/utils/create-job.ts
+++ b/blocksuite/affine/all/src/__tests__/utils/create-job.ts
@@ -1,4 +1,4 @@
-import { defaultImageProxyMiddleware } from '@blocksuite/affine-block-image';
+import { defaultImageProxyMiddleware } from '@blocksuite/affine-shared/adapters';
import {
Schema,
Transformer,
diff --git a/blocksuite/affine/all/src/extensions/migrating-store.ts b/blocksuite/affine/all/src/extensions/migrating-store.ts
index 32236fe04d..ea5bd28c97 100644
--- a/blocksuite/affine/all/src/extensions/migrating-store.ts
+++ b/blocksuite/affine/all/src/extensions/migrating-store.ts
@@ -14,6 +14,7 @@ import {
} from '@blocksuite/affine-model';
import {
HtmlAdapterFactoryExtension,
+ ImageProxyService,
MarkdownAdapterFactoryExtension,
MixTextAdapterFactoryExtension,
NotionHtmlAdapterFactoryExtension,
@@ -83,9 +84,12 @@ const MigratingStoreExtensions: ExtensionType[] = [
getAdapterFactoryExtensions(),
FeatureFlagService,
+ BlockMetaService,
+
+ // TODO(@mirone): maybe merge these services into a file setting service
LinkPreviewerService,
FileSizeLimitService,
- BlockMetaService,
+ ImageProxyService,
].flat();
export class MigratingStoreExtension extends StoreExtensionProvider {
diff --git a/blocksuite/affine/blocks/bookmark/src/components/bookmark-card.ts b/blocksuite/affine/blocks/bookmark/src/components/bookmark-card.ts
index a6121dd272..4424aaee35 100644
--- a/blocksuite/affine/blocks/bookmark/src/components/bookmark-card.ts
+++ b/blocksuite/affine/blocks/bookmark/src/components/bookmark-card.ts
@@ -1,5 +1,6 @@
import { getEmbedCardIcons } from '@blocksuite/affine-block-embed';
import { WebIcon16 } from '@blocksuite/affine-components/icons';
+import { ImageProxyService } from '@blocksuite/affine-shared/adapters';
import { ThemeProvider } from '@blocksuite/affine-shared/services';
import { getHostName } from '@blocksuite/affine-shared/utils';
import { SignalWatcher, WithDisposable } from '@blocksuite/global/lit';
@@ -85,11 +86,12 @@ export class BookmarkCard extends SignalWatcher(
const theme = this.bookmark.std.get(ThemeProvider).theme;
const { LoadingIcon, EmbedCardBannerIcon } = getEmbedCardIcons(theme);
+ const imageProxyService = this.bookmark.doc.get(ImageProxyService);
const titleIcon = this.loading
? LoadingIcon
: icon
- ? html`
`
+ ? html`
`
: WebIcon16;
const descriptionText = this.loading
@@ -102,7 +104,7 @@ export class BookmarkCard extends SignalWatcher(
const bannerImage =
!this.loading && image
- ? html`
`
+ ? html`
`
: EmbedCardBannerIcon;
return html`
diff --git a/blocksuite/affine/blocks/embed/src/embed-github-block/embed-github-block.ts b/blocksuite/affine/blocks/embed/src/embed-github-block/embed-github-block.ts
index b703ac656f..735829c490 100644
--- a/blocksuite/affine/blocks/embed/src/embed-github-block/embed-github-block.ts
+++ b/blocksuite/affine/blocks/embed/src/embed-github-block/embed-github-block.ts
@@ -3,6 +3,7 @@ import type {
EmbedGithubModel,
EmbedGithubStyles,
} from '@blocksuite/affine-model';
+import { ImageProxyService } from '@blocksuite/affine-shared/adapters';
import { ThemeProvider } from '@blocksuite/affine-shared/services';
import { BlockSelection, isGfxBlockComponent } from '@blocksuite/std';
import { html, nothing } from 'lit';
@@ -131,6 +132,7 @@ export class EmbedGithubBlockComponent extends EmbedBlockComponent<
const loading = this.loading;
const theme = this.std.get(ThemeProvider).theme;
+ const imageProxyService = this.doc.get(ImageProxyService);
const { LoadingIcon, EmbedCardBannerIcon } = getEmbedCardIcons(theme);
const titleIcon = loading ? LoadingIcon : GithubIcon;
const statusIcon = status
@@ -141,9 +143,7 @@ export class EmbedGithubBlockComponent extends EmbedBlockComponent<
const descriptionText = loading ? '' : description;
const bannerImage =
!loading && image
- ? html``
+ ? html`
`
: EmbedCardBannerIcon;
let dateText = '';
diff --git a/blocksuite/affine/blocks/embed/src/embed-loom-block/embed-loom-block.ts b/blocksuite/affine/blocks/embed/src/embed-loom-block/embed-loom-block.ts
index 7ca561bf78..f8de5ba5a4 100644
--- a/blocksuite/affine/blocks/embed/src/embed-loom-block/embed-loom-block.ts
+++ b/blocksuite/affine/blocks/embed/src/embed-loom-block/embed-loom-block.ts
@@ -1,5 +1,6 @@
import { OpenIcon } from '@blocksuite/affine-components/icons';
import type { EmbedLoomModel, EmbedLoomStyles } from '@blocksuite/affine-model';
+import { ImageProxyService } from '@blocksuite/affine-shared/adapters';
import { ThemeProvider } from '@blocksuite/affine-shared/services';
import { BlockSelection } from '@blocksuite/std';
import { html } from 'lit';
@@ -92,15 +93,14 @@ export class EmbedLoomBlockComponent extends EmbedBlockComponent<
const loading = this.loading;
const theme = this.std.get(ThemeProvider).theme;
+ const imageProxyService = this.doc.get(ImageProxyService);
const { LoadingIcon, EmbedCardBannerIcon } = getEmbedCardIcons(theme);
const titleIcon = loading ? LoadingIcon : LoomIcon;
const titleText = loading ? 'Loading...' : title;
const descriptionText = loading ? '' : description;
const bannerImage =
!loading && image
- ? html``
+ ? html`
`
: EmbedCardBannerIcon;
return this.renderEmbed(
diff --git a/blocksuite/affine/blocks/embed/src/embed-youtube-block/embed-youtube-block.ts b/blocksuite/affine/blocks/embed/src/embed-youtube-block/embed-youtube-block.ts
index 15125508a4..a4f057e2a2 100644
--- a/blocksuite/affine/blocks/embed/src/embed-youtube-block/embed-youtube-block.ts
+++ b/blocksuite/affine/blocks/embed/src/embed-youtube-block/embed-youtube-block.ts
@@ -3,6 +3,7 @@ import type {
EmbedYoutubeModel,
EmbedYoutubeStyles,
} from '@blocksuite/affine-model';
+import { ImageProxyService } from '@blocksuite/affine-shared/adapters';
import { ThemeProvider } from '@blocksuite/affine-shared/services';
import { BlockSelection } from '@blocksuite/std';
import { html, nothing } from 'lit';
@@ -106,24 +107,22 @@ export class EmbedYoutubeBlockComponent extends EmbedBlockComponent<
const loading = this.loading;
const theme = this.std.get(ThemeProvider).theme;
+ const imageProxyService = this.doc.get(ImageProxyService);
const { LoadingIcon, EmbedCardBannerIcon } = getEmbedCardIcons(theme);
const titleIcon = loading ? LoadingIcon : YoutubeIcon;
const titleText = loading ? 'Loading...' : title;
const descriptionText = loading ? null : description;
const bannerImage =
!loading && image
- ? html``
+ ? html`
`
: EmbedCardBannerIcon;
const creatorImageEl =
!loading && creatorImage
- ? html``
+ ? html`
`
: nothing;
return this.renderEmbed(
diff --git a/blocksuite/affine/blocks/image/src/adapters/index.ts b/blocksuite/affine/blocks/image/src/adapters/index.ts
index eff5f4e0ee..94b5ef70c3 100644
--- a/blocksuite/affine/blocks/image/src/adapters/index.ts
+++ b/blocksuite/affine/blocks/image/src/adapters/index.ts
@@ -1,4 +1,3 @@
export * from './html.js';
export * from './markdown.js';
-export * from './middleware.js';
export * from './notion-html.js';
diff --git a/blocksuite/affine/blocks/image/src/image-proxy-service.ts b/blocksuite/affine/blocks/image/src/image-proxy-service.ts
deleted file mode 100644
index 4ba13a4567..0000000000
--- a/blocksuite/affine/blocks/image/src/image-proxy-service.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { DEFAULT_IMAGE_PROXY_ENDPOINT } from '@blocksuite/affine-shared/consts';
-import { StoreExtension } from '@blocksuite/store';
-
-import { setImageProxyMiddlewareURL } from './adapters/middleware';
-
-// TODO(@mirone): this should be configured when setup instead of runtime
-export class ImageProxyService extends StoreExtension {
- static override key = 'image-proxy';
-
- private _imageProxyURL = DEFAULT_IMAGE_PROXY_ENDPOINT;
-
- setImageProxyURL(url: string) {
- this._imageProxyURL = url;
- setImageProxyMiddlewareURL(url);
- }
-
- get imageProxyURL() {
- return this._imageProxyURL;
- }
-}
diff --git a/blocksuite/affine/blocks/image/src/image-spec.ts b/blocksuite/affine/blocks/image/src/image-spec.ts
index 1b83fca43e..b71300e32a 100644
--- a/blocksuite/affine/blocks/image/src/image-spec.ts
+++ b/blocksuite/affine/blocks/image/src/image-spec.ts
@@ -6,7 +6,6 @@ import { literal } from 'lit/static-html.js';
import { imageSlashMenuConfig } from './configs/slash-menu';
import { createBuiltinToolbarConfigExtension } from './configs/toolbar';
-import { ImageProxyService } from './image-proxy-service';
import { ImageDropOption } from './image-service';
const flavour = ImageBlockSchema.model.flavour;
@@ -26,5 +25,3 @@ export const ImageBlockSpec: ExtensionType[] = [
createBuiltinToolbarConfigExtension(flavour),
SlashMenuConfigExtension(flavour, imageSlashMenuConfig),
].flat();
-
-export const ImageStoreSpec: ExtensionType[] = [ImageProxyService];
diff --git a/blocksuite/affine/blocks/image/src/index.ts b/blocksuite/affine/blocks/image/src/index.ts
index ad38a3cea3..8a814ff4f7 100644
--- a/blocksuite/affine/blocks/image/src/index.ts
+++ b/blocksuite/affine/blocks/image/src/index.ts
@@ -3,7 +3,6 @@ export * from './commands';
export * from './edgeless-clipboard-config';
export * from './image-block';
export * from './image-edgeless-block';
-export { ImageProxyService } from './image-proxy-service';
export * from './image-service';
export * from './image-spec';
export * from './styles';
diff --git a/blocksuite/affine/blocks/image/src/store.ts b/blocksuite/affine/blocks/image/src/store.ts
index c99499ab3f..f0efddc65a 100644
--- a/blocksuite/affine/blocks/image/src/store.ts
+++ b/blocksuite/affine/blocks/image/src/store.ts
@@ -4,30 +4,15 @@ import {
} from '@blocksuite/affine-ext-loader';
import { ImageBlockSchemaExtension } from '@blocksuite/affine-model';
import { ImageSelectionExtension } from '@blocksuite/affine-shared/selection';
-import { z } from 'zod';
import { ImageBlockAdapterExtensions } from './adapters/extension';
-import { ImageProxyService } from './image-proxy-service';
-const ImageStoreExtensionOptionsSchema = z.object({
- imageProxyURL: z.string().optional(),
-});
-
-export class ImageStoreExtension extends StoreExtensionProvider<
- z.infer
-> {
+export class ImageStoreExtension extends StoreExtensionProvider {
override name = 'affine-image-block';
- override schema = ImageStoreExtensionOptionsSchema;
-
override setup(context: StoreExtensionContext) {
super.setup(context);
- context.register([
- ImageBlockSchemaExtension,
- ImageProxyService,
- ImageSelectionExtension,
- ]);
+ context.register([ImageBlockSchemaExtension, ImageSelectionExtension]);
context.register(ImageBlockAdapterExtensions);
- // TODO(@mirone): set image proxy url
}
}
diff --git a/blocksuite/affine/blocks/root/src/clipboard/readonly-clipboard.ts b/blocksuite/affine/blocks/root/src/clipboard/readonly-clipboard.ts
index 46cd327bd4..9b2b6ee14a 100644
--- a/blocksuite/affine/blocks/root/src/clipboard/readonly-clipboard.ts
+++ b/blocksuite/affine/blocks/root/src/clipboard/readonly-clipboard.ts
@@ -1,8 +1,8 @@
-import { defaultImageProxyMiddleware } from '@blocksuite/affine-block-image';
import {
AttachmentAdapter,
ClipboardAdapter,
copyMiddleware,
+ defaultImageProxyMiddleware,
HtmlAdapter,
ImageAdapter,
MixTextAdapter,
diff --git a/blocksuite/affine/shared/src/adapters/middlewares/index.ts b/blocksuite/affine/shared/src/adapters/middlewares/index.ts
index 131fa6b1f0..a06fbace8d 100644
--- a/blocksuite/affine/shared/src/adapters/middlewares/index.ts
+++ b/blocksuite/affine/shared/src/adapters/middlewares/index.ts
@@ -3,6 +3,7 @@ export * from './copy';
export * from './doc-link';
export * from './file-name';
export * from './paste';
+export * from './proxy';
export * from './replace-id';
export * from './surface-ref-to-embed';
export * from './title';
diff --git a/blocksuite/affine/blocks/image/src/adapters/middleware.ts b/blocksuite/affine/shared/src/adapters/middlewares/proxy.ts
similarity index 51%
rename from blocksuite/affine/blocks/image/src/adapters/middleware.ts
rename to blocksuite/affine/shared/src/adapters/middlewares/proxy.ts
index 2d62204302..ebc463c683 100644
--- a/blocksuite/affine/blocks/image/src/adapters/middleware.ts
+++ b/blocksuite/affine/shared/src/adapters/middlewares/proxy.ts
@@ -1,5 +1,7 @@
-import { DEFAULT_IMAGE_PROXY_ENDPOINT } from '@blocksuite/affine-shared/consts';
import type { TransformerMiddleware } from '@blocksuite/store';
+import { StoreExtension } from '@blocksuite/store';
+
+import { DEFAULT_IMAGE_PROXY_ENDPOINT } from '../../consts';
export const customImageProxyMiddleware = (
imageProxyURL: string
@@ -25,3 +27,27 @@ export const setImageProxyMiddlewareURL = defaultImageProxyMiddlewarBuilder.set;
export const defaultImageProxyMiddleware =
defaultImageProxyMiddlewarBuilder.get();
+
+// TODO(@mirone): this should be configured when setup instead of runtime
+export class ImageProxyService extends StoreExtension {
+ static override key = 'image-proxy';
+
+ private _imageProxyURL = DEFAULT_IMAGE_PROXY_ENDPOINT;
+
+ setImageProxyURL(url: string) {
+ this._imageProxyURL = url;
+ setImageProxyMiddlewareURL(url);
+ }
+
+ buildUrl(imageUrl: string) {
+ if (imageUrl.startsWith(this.imageProxyURL)) {
+ return imageUrl;
+ }
+
+ return `${this.imageProxyURL}?url=${encodeURIComponent(imageUrl)}`;
+ }
+
+ get imageProxyURL() {
+ return this._imageProxyURL;
+ }
+}
diff --git a/blocksuite/affine/widgets/linked-doc/src/transformers/html.ts b/blocksuite/affine/widgets/linked-doc/src/transformers/html.ts
index 71f9e5b132..4cc64ce193 100644
--- a/blocksuite/affine/widgets/linked-doc/src/transformers/html.ts
+++ b/blocksuite/affine/widgets/linked-doc/src/transformers/html.ts
@@ -1,5 +1,5 @@
-import { defaultImageProxyMiddleware } from '@blocksuite/affine-block-image';
import {
+ defaultImageProxyMiddleware,
docLinkBaseURLMiddleware,
fileNameMiddleware,
HtmlAdapter,
diff --git a/blocksuite/affine/widgets/linked-doc/src/transformers/markdown.ts b/blocksuite/affine/widgets/linked-doc/src/transformers/markdown.ts
index 7be063b436..8ea52ef125 100644
--- a/blocksuite/affine/widgets/linked-doc/src/transformers/markdown.ts
+++ b/blocksuite/affine/widgets/linked-doc/src/transformers/markdown.ts
@@ -1,5 +1,5 @@
-import { defaultImageProxyMiddleware } from '@blocksuite/affine-block-image';
import {
+ defaultImageProxyMiddleware,
docLinkBaseURLMiddleware,
fileNameMiddleware,
MarkdownAdapter,
diff --git a/blocksuite/affine/widgets/linked-doc/src/transformers/notion-html.ts b/blocksuite/affine/widgets/linked-doc/src/transformers/notion-html.ts
index 0fc1f5435a..b5b36b20f9 100644
--- a/blocksuite/affine/widgets/linked-doc/src/transformers/notion-html.ts
+++ b/blocksuite/affine/widgets/linked-doc/src/transformers/notion-html.ts
@@ -1,5 +1,7 @@
-import { defaultImageProxyMiddleware } from '@blocksuite/affine-block-image';
-import { NotionHtmlAdapter } from '@blocksuite/affine-shared/adapters';
+import {
+ defaultImageProxyMiddleware,
+ NotionHtmlAdapter,
+} from '@blocksuite/affine-shared/adapters';
import { Container } from '@blocksuite/global/di';
import { sha } from '@blocksuite/global/utils';
import {
diff --git a/blocksuite/playground/apps/_common/components/adapters-panel.ts b/blocksuite/playground/apps/_common/components/adapters-panel.ts
index 99d881317b..5990b51bd0 100644
--- a/blocksuite/playground/apps/_common/components/adapters-panel.ts
+++ b/blocksuite/playground/apps/_common/components/adapters-panel.ts
@@ -1,9 +1,9 @@
/* eslint-disable @typescript-eslint/no-restricted-imports */
import '@shoelace-style/shoelace/dist/components/tab-panel/tab-panel.js';
-import { defaultImageProxyMiddleware } from '@blocksuite/affine/blocks/image';
import { WithDisposable } from '@blocksuite/affine/global/lit';
import {
+ defaultImageProxyMiddleware,
docLinkBaseURLMiddlewareBuilder,
embedSyncedDocMiddleware,
type HtmlAdapter,
diff --git a/blocksuite/playground/apps/_common/components/starter-debug-menu.ts b/blocksuite/playground/apps/_common/components/starter-debug-menu.ts
index 9cb6a37688..e4fe670a5d 100644
--- a/blocksuite/playground/apps/_common/components/starter-debug-menu.ts
+++ b/blocksuite/playground/apps/_common/components/starter-debug-menu.ts
@@ -16,7 +16,6 @@ import '@shoelace-style/shoelace/dist/themes/light.css';
import '@shoelace-style/shoelace/dist/themes/dark.css';
import './left-side-panel.js';
-import { defaultImageProxyMiddleware } from '@blocksuite/affine/blocks/image';
import { ExportManager } from '@blocksuite/affine/blocks/surface';
import { toast } from '@blocksuite/affine/components/toast';
import { StoreExtensionManagerIdentifier } from '@blocksuite/affine/ext-loader';
@@ -27,6 +26,7 @@ import {
import type { SerializedXYWH } from '@blocksuite/affine/global/gfx';
import { ColorScheme, type DocMode } from '@blocksuite/affine/model';
import {
+ defaultImageProxyMiddleware,
docLinkBaseURLMiddleware,
HtmlAdapterFactoryIdentifier,
MarkdownAdapterFactoryIdentifier,
diff --git a/packages/backend/server/src/__tests__/__snapshots__/worker.e2e.ts.md b/packages/backend/server/src/__tests__/__snapshots__/worker.e2e.ts.md
index 3e91ea9277..a0953292ce 100644
--- a/packages/backend/server/src/__tests__/__snapshots__/worker.e2e.ts.md
+++ b/packages/backend/server/src/__tests__/__snapshots__/worker.e2e.ts.md
@@ -67,10 +67,10 @@ Generated by [AVA](https://avajs.dev).
{
description: 'Test Description',
favicons: [
- 'http://localhost:3010/api/worker/image-proxy?url=https%3A%2F%2Fexample.com%2Ffavicon.ico',
+ 'http://example.com/favicon.ico',
],
images: [
- 'http://localhost:3010/api/worker/image-proxy?url=https%3A%2F%2Fexample.com%2Fimage.png',
+ 'http://example.com/image.png',
],
title: 'Test Title',
url: 'http://example.com/page',
@@ -82,7 +82,7 @@ Generated by [AVA](https://avajs.dev).
{
charset: 'gbk',
favicons: [
- 'http://localhost:3010/api/worker/image-proxy?url=https%3A%2F%2Fexample.com%2Ffavicon.ico',
+ 'http://example.com/favicon.ico',
],
images: [],
title: '你好,世界。',
@@ -95,7 +95,7 @@ Generated by [AVA](https://avajs.dev).
{
charset: 'shift_jis',
favicons: [
- 'http://localhost:3010/api/worker/image-proxy?url=https%3A%2F%2Fexample.com%2Ffavicon.ico',
+ 'http://example.com/favicon.ico',
],
images: [],
title: 'こんにちは、世界。',
@@ -108,7 +108,7 @@ Generated by [AVA](https://avajs.dev).
{
charset: 'big5',
favicons: [
- 'http://localhost:3010/api/worker/image-proxy?url=https%3A%2F%2Fexample.com%2Ffavicon.ico',
+ 'http://example.com/favicon.ico',
],
images: [],
title: '你好,世界。',
@@ -121,7 +121,7 @@ Generated by [AVA](https://avajs.dev).
{
charset: 'euc-kr',
favicons: [
- 'http://localhost:3010/api/worker/image-proxy?url=https%3A%2F%2Fexample.com%2Ffavicon.ico',
+ 'http://example.com/favicon.ico',
],
images: [],
title: '안녕하세요, 세계.',
diff --git a/packages/backend/server/src/__tests__/__snapshots__/worker.e2e.ts.snap b/packages/backend/server/src/__tests__/__snapshots__/worker.e2e.ts.snap
index 3136f79eda..446b9c8eaa 100644
Binary files a/packages/backend/server/src/__tests__/__snapshots__/worker.e2e.ts.snap and b/packages/backend/server/src/__tests__/__snapshots__/worker.e2e.ts.snap differ
diff --git a/packages/backend/server/src/plugins/worker/controller.ts b/packages/backend/server/src/plugins/worker/controller.ts
index b299eb941d..455798f637 100644
--- a/packages/backend/server/src/plugins/worker/controller.ts
+++ b/packages/backend/server/src/plugins/worker/controller.ts
@@ -209,7 +209,6 @@ export class WorkerController {
videos: [],
favicons: [],
};
- const baseUrl = new URL(request.url, this.url.baseUrl).toString();
if (response.body) {
const resp = await decodeWithCharset(response, res);
@@ -276,7 +275,7 @@ export class WorkerController {
await rewriter.transform(resp).text();
- res.images = await reduceUrls(baseUrl, res.images);
+ res.images = await reduceUrls(res.images);
this.logger.debug('Processed response with HTMLRewriter', {
origin,
@@ -293,7 +292,7 @@ export class WorkerController {
appendUrl(faviconUrl.toString(), res.favicons);
}
- res.favicons = await reduceUrls(baseUrl, res.favicons);
+ res.favicons = await reduceUrls(res.favicons);
}
const json = JSON.stringify(res);
diff --git a/packages/backend/server/src/plugins/worker/utils/index.ts b/packages/backend/server/src/plugins/worker/utils/index.ts
index bcef68ae46..c8458d9067 100644
--- a/packages/backend/server/src/plugins/worker/utils/index.ts
+++ b/packages/backend/server/src/plugins/worker/utils/index.ts
@@ -1,5 +1,4 @@
export * from './headers';
-export * from './proxy';
export * from './url';
export function parseJson(data: string): T | null {
diff --git a/packages/backend/server/src/plugins/worker/utils/proxy.ts b/packages/backend/server/src/plugins/worker/utils/proxy.ts
deleted file mode 100644
index f52902dc0b..0000000000
--- a/packages/backend/server/src/plugins/worker/utils/proxy.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-const IMAGE_PROXY = '/api/worker/image-proxy';
-
-const httpsDomain = new Set();
-
-async function checkHttpsSupport(url: URL): Promise {
- const httpsUrl = new URL(url.toString());
- httpsUrl.protocol = 'https:';
- try {
- const response = await fetch(httpsUrl, {
- method: 'HEAD',
- redirect: 'manual',
- });
-
- if (response.ok || (response.status >= 400 && response.status < 600)) {
- return true;
- }
- } catch {}
- return false;
-}
-
-async function fixProtocol(url: string): Promise {
- const targetUrl = new URL(url);
- if (targetUrl.protocol !== 'http:') {
- return targetUrl;
- } else if (httpsDomain.has(targetUrl.hostname)) {
- targetUrl.protocol = 'https:';
- return targetUrl;
- } else if (await checkHttpsSupport(targetUrl)) {
- httpsDomain.add(targetUrl.hostname);
- targetUrl.protocol = 'https:';
- return targetUrl;
- }
- return targetUrl;
-}
-
-export function imageProxyBuilder(
- url: string
-): (url: string) => Promise {
- try {
- const proxy = new URL(url);
- proxy.pathname = IMAGE_PROXY;
-
- return async url => {
- try {
- const targetUrl = await fixProtocol(url);
- proxy.searchParams.set('url', targetUrl.toString());
- return proxy.toString();
- } catch {}
- return;
- };
- } catch {
- return async url => url.toString();
- }
-}
diff --git a/packages/backend/server/src/plugins/worker/utils/url.ts b/packages/backend/server/src/plugins/worker/utils/url.ts
index 40591bd0ea..fb28bbc82c 100644
--- a/packages/backend/server/src/plugins/worker/utils/url.ts
+++ b/packages/backend/server/src/plugins/worker/utils/url.ts
@@ -1,7 +1,5 @@
import { getDomain, getSubdomain } from 'tldts';
-import { imageProxyBuilder } from './proxy';
-
const localhost = new Set(['localhost', '127.0.0.1']);
const URL_FIXERS: Record URL> = {
@@ -58,11 +56,6 @@ export function appendUrl(url: string | null, array?: string[]) {
}
}
-export async function reduceUrls(baseUrl: string, urls?: string[]) {
- if (urls && urls.length > 0) {
- const imageProxy = imageProxyBuilder(baseUrl);
- const newUrls = await Promise.all(urls.map(imageProxy));
- return newUrls.filter((x): x is string => !!x);
- }
- return [];
+export async function reduceUrls(urls: string[] = []) {
+ return Array.from(new Set(urls.filter(Boolean) as string[]));
}
diff --git a/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts b/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts
index 103c4d4c1a..b07c97097c 100644
--- a/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts
+++ b/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts
@@ -1,11 +1,11 @@
import { createReactComponentFromLit } from '@affine/component';
-import {
- defaultImageProxyMiddleware,
- ImageProxyService,
-} from '@blocksuite/affine/blocks/image';
import { Container, type ServiceProvider } from '@blocksuite/affine/global/di';
import { WithDisposable } from '@blocksuite/affine/global/lit';
-import { codeBlockWrapMiddleware } from '@blocksuite/affine/shared/adapters';
+import {
+ codeBlockWrapMiddleware,
+ defaultImageProxyMiddleware,
+ ImageProxyService,
+} from '@blocksuite/affine/shared/adapters';
import {
LinkPreviewerService,
ThemeProvider,
diff --git a/packages/frontend/core/src/blocksuite/ai/utils/editor-actions.ts b/packages/frontend/core/src/blocksuite/ai/utils/editor-actions.ts
index 8dbfbdff80..90a80560be 100644
--- a/packages/frontend/core/src/blocksuite/ai/utils/editor-actions.ts
+++ b/packages/frontend/core/src/blocksuite/ai/utils/editor-actions.ts
@@ -1,5 +1,5 @@
-import { defaultImageProxyMiddleware } from '@blocksuite/affine/blocks/image';
import { deleteTextCommand } from '@blocksuite/affine/inlines/preset';
+import { defaultImageProxyMiddleware } from '@blocksuite/affine/shared/adapters';
import { isInsideEdgelessEditor } from '@blocksuite/affine/shared/utils';
import {
type BlockComponent,
diff --git a/packages/frontend/core/src/blocksuite/block-suite-editor/blocksuite-editor.tsx b/packages/frontend/core/src/blocksuite/block-suite-editor/blocksuite-editor.tsx
index 35c6064f47..4261c882c7 100644
--- a/packages/frontend/core/src/blocksuite/block-suite-editor/blocksuite-editor.tsx
+++ b/packages/frontend/core/src/blocksuite/block-suite-editor/blocksuite-editor.tsx
@@ -10,14 +10,14 @@ import {
} from '@affine/core/modules/editor-setting';
import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import track from '@affine/track';
-import {
- customImageProxyMiddleware,
- ImageProxyService,
-} from '@blocksuite/affine/blocks/image';
import { appendParagraphCommand } from '@blocksuite/affine/blocks/paragraph';
import type { DocTitle } from '@blocksuite/affine/fragments/doc-title';
import { DisposableGroup } from '@blocksuite/affine/global/disposable';
import type { DocMode, RootBlockModel } from '@blocksuite/affine/model';
+import {
+ customImageProxyMiddleware,
+ ImageProxyService,
+} from '@blocksuite/affine/shared/adapters';
import { focusBlockEnd } from '@blocksuite/affine/shared/commands';
import { LinkPreviewerService } from '@blocksuite/affine/shared/services';
import { getLastNoteBlock } from '@blocksuite/affine/shared/utils';
diff --git a/packages/frontend/core/src/blocksuite/utils/markdown-utils.ts b/packages/frontend/core/src/blocksuite/utils/markdown-utils.ts
index ed3a1867fc..90d9eb9f79 100644
--- a/packages/frontend/core/src/blocksuite/utils/markdown-utils.ts
+++ b/packages/frontend/core/src/blocksuite/utils/markdown-utils.ts
@@ -1,7 +1,7 @@
import { WorkspaceImpl } from '@affine/core/modules/workspace/impls/workspace';
-import { defaultImageProxyMiddleware } from '@blocksuite/affine/blocks/image';
import type { ServiceProvider } from '@blocksuite/affine/global/di';
import {
+ defaultImageProxyMiddleware,
embedSyncedDocMiddleware,
MarkdownAdapter,
MixTextAdapter,
diff --git a/packages/frontend/core/src/mobile/pages/workspace/detail/mobile-detail-page.tsx b/packages/frontend/core/src/mobile/pages/workspace/detail/mobile-detail-page.tsx
index 39ebc64b8d..26a5b11cbd 100644
--- a/packages/frontend/core/src/mobile/pages/workspace/detail/mobile-detail-page.tsx
+++ b/packages/frontend/core/src/mobile/pages/workspace/detail/mobile-detail-page.tsx
@@ -21,12 +21,12 @@ import { WorkbenchService } from '@affine/core/modules/workbench';
import { ViewService } from '@affine/core/modules/workbench/services/view';
import { WorkspaceService } from '@affine/core/modules/workspace';
import { i18nTime } from '@affine/i18n';
+import { DisposableGroup } from '@blocksuite/affine/global/disposable';
+import { RefNodeSlotsProvider } from '@blocksuite/affine/inlines/reference';
import {
customImageProxyMiddleware,
ImageProxyService,
-} from '@blocksuite/affine/blocks/image';
-import { DisposableGroup } from '@blocksuite/affine/global/disposable';
-import { RefNodeSlotsProvider } from '@blocksuite/affine/inlines/reference';
+} from '@blocksuite/affine/shared/adapters';
import { LinkPreviewerService } from '@blocksuite/affine/shared/services';
import {
FrameworkScope,