From 4ffa37d1c3992a7fb94f973e159cc952a9d3233a Mon Sep 17 00:00:00 2001 From: forehalo Date: Thu, 24 Apr 2025 10:23:25 +0000 Subject: [PATCH] chore: proxy image preview in frontend (#11957) ## Summary by CodeRabbit - **New Features** - Images and icons in bookmark cards are now loaded through an image proxy for improved reliability and consistency. - Embed blocks for GitHub, Loom, and YouTube now display banner and creator images via an image proxy service for enhanced image loading. - **Refactor** - Simplified backend URL handling and proxy logic for images, resulting in more efficient processing and reduced complexity. - Consolidated image proxy middleware and services into a shared adapter module for streamlined imports and improved maintainability. --- .../all/src/__tests__/utils/create-job.ts | 2 +- .../all/src/extensions/migrating-store.ts | 6 +- .../bookmark/src/components/bookmark-card.ts | 6 +- .../embed-github-block/embed-github-block.ts | 6 +- .../src/embed-loom-block/embed-loom-block.ts | 6 +- .../embed-youtube-block.ts | 15 +++-- .../affine/blocks/image/src/adapters/index.ts | 1 - .../blocks/image/src/image-proxy-service.ts | 20 ------- .../affine/blocks/image/src/image-spec.ts | 3 - blocksuite/affine/blocks/image/src/index.ts | 1 - blocksuite/affine/blocks/image/src/store.ts | 19 +----- .../root/src/clipboard/readonly-clipboard.ts | 2 +- .../shared/src/adapters/middlewares/index.ts | 1 + .../src/adapters/middlewares/proxy.ts} | 28 ++++++++- .../linked-doc/src/transformers/html.ts | 2 +- .../linked-doc/src/transformers/markdown.ts | 2 +- .../src/transformers/notion-html.ts | 6 +- .../apps/_common/components/adapters-panel.ts | 2 +- .../_common/components/starter-debug-menu.ts | 2 +- .../__tests__/__snapshots__/worker.e2e.ts.md | 12 ++-- .../__snapshots__/worker.e2e.ts.snap | Bin 996 -> 936 bytes .../server/src/plugins/worker/controller.ts | 5 +- .../server/src/plugins/worker/utils/index.ts | 1 - .../server/src/plugins/worker/utils/proxy.ts | 54 ------------------ .../server/src/plugins/worker/utils/url.ts | 11 +--- .../blocksuite/ai/components/text-renderer.ts | 10 ++-- .../src/blocksuite/ai/utils/editor-actions.ts | 2 +- .../block-suite-editor/blocksuite-editor.tsx | 8 +-- .../src/blocksuite/utils/markdown-utils.ts | 2 +- .../workspace/detail/mobile-detail-page.tsx | 6 +- 30 files changed, 86 insertions(+), 155 deletions(-) delete mode 100644 blocksuite/affine/blocks/image/src/image-proxy-service.ts rename blocksuite/affine/{blocks/image/src/adapters/middleware.ts => shared/src/adapters/middlewares/proxy.ts} (51%) delete mode 100644 packages/backend/server/src/plugins/worker/utils/proxy.ts 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`icon` + ? html`icon` : WebIcon16; const descriptionText = this.loading @@ -102,7 +104,7 @@ export class BookmarkCard extends SignalWatcher( const bannerImage = !this.loading && image - ? html`banner` + ? html`banner` : 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` - ${EmbedCardBannerIcon} - ` + ? html`banner` : 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` - ${EmbedCardBannerIcon} - ` + ? html`banner` : 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` - ${EmbedCardBannerIcon} - ` + ? html`banner` : EmbedCardBannerIcon; const creatorImageEl = !loading && creatorImage - ? html`` + ? html`creator` : 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 3136f79eda357589e64ae795f7b9d9d2ea819ebd..446b9c8eaa1690494db9be678fe6727377e02710 100644 GIT binary patch literal 936 zcmV;Z16TY(RzV_ zP8?@c3LlFI00000000B+md|SxXBfx7&u+3Y8_lj!sJ2C?N^hD_MJYX446#~JifIB? z5AyEJySuMDJ2TGv?rOk7HbhOS(t?eOU@*)87)-Gv?XY0_dbyN|FjC?lQR4UEwHU zTmHT55SL0Dm^XmBiQXf?_gIx@RiWFK^emq=SyJ9O$xxPdZ)$?M^5PFQZiW1k71s<_ zZ&4}dqrN_Vnw1@s_v&`J&+$gJo2b;BvMLO2%Z4(E^8{SV_e?C_EwivfO$fG-yZzI>d0Xm_Kaododp++WN?G~Q;(&^l#NA z*Ar-KEVTnIQrj>yIq~f5h!usJDg~ucJPGySB?pV(RrKho2(qn(Hqx7T@L=a< zXR;Y)qHDCJ#XZf;_wD<>`Tzdkd$U|D7?xHM^Pe)wrNJCgwrYl+u^sEwY=&29iE&|4 zTa+y+7M69LN;;j5qX+JfY{L$c*iI6!6izTr65?N`)9JP3*U7+oHc9LUFb2Q?@EL&b z0NeyNSq9``kZzC^c97U3Bo5NOopfoI&b*txQL1Mq*vT3bGLY9(WkS%BpZe$#E(AAA znO!x<*p;!VL#s?OC%C*xt8L4Vj2)jicy#LEtCNAegpgF$gu3mDy-$M6$XPpd8Bdzt zC}}PN_!hv=cTbxBm(4mgxSlC9s^23;rY&EPr%3#H051VJ;)^g^D;AmKijbV*rhH+< zap-I+odS6p10-3b6}IMCrA)ARvM?*zVP=+Od96Q^Y`I?eu4i@5W-4< zQc1rN;EzC3d}GpvSl5PFQf(9uxo!I`Ot*S9ER7mvOUQl0d-m?hQJd#xET_VpoRVcw zostJ?j`5=V2az2f$>zti`SG@Q%;v{i;tp}m3NQECzgkY^4%ueO8@*q`yjB5l2EfO6 zHrVe0#5(s{k5;CRVA7{uDpVBB$0MzEphIg7T)T4V`sY_}e|_%S%7q(C=bCf#n^#sMxE^Kz_ozJ! z;1d8pxUsDppsT=3&naPdMzY`kpALN3nc_EfEP{6Z&T(=2!J&OSjJ6425x}L^mqg#z zX(w1s8>~1=+GitqAL@|zW2;Mxx6Um6y7bZN!piE!4|Zo(7glb5wJ_A-Hs98q9>IN% S0B7%i?tcQ&3BSv-4*&q@D)R3D 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,