@zlooks.cn/blog-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blog/blog-application.d.ts +153 -0
- package/dist/blog/blog-application.d.ts.map +1 -0
- package/dist/blog/blog-application.js +115 -0
- package/dist/blog/blog-application.js.map +1 -0
- package/dist/blog/comment-client-metadata.d.ts +19 -0
- package/dist/blog/comment-client-metadata.d.ts.map +1 -0
- package/dist/blog/comment-client-metadata.js +78 -0
- package/dist/blog/comment-client-metadata.js.map +1 -0
- package/dist/blog/errors.d.ts +12 -0
- package/dist/blog/errors.d.ts.map +1 -0
- package/dist/blog/errors.js +21 -0
- package/dist/blog/errors.js.map +1 -0
- package/dist/blog/micro-user-directory.d.ts +11 -0
- package/dist/blog/micro-user-directory.d.ts.map +1 -0
- package/dist/blog/micro-user-directory.js +18 -0
- package/dist/blog/micro-user-directory.js.map +1 -0
- package/dist/blog/post-content-audit.d.ts +34 -0
- package/dist/blog/post-content-audit.d.ts.map +1 -0
- package/dist/blog/post-content-audit.js +190 -0
- package/dist/blog/post-content-audit.js.map +1 -0
- package/dist/blog/post-view-cache.d.ts +15 -0
- package/dist/blog/post-view-cache.d.ts.map +1 -0
- package/dist/blog/post-view-cache.js +23 -0
- package/dist/blog/post-view-cache.js.map +1 -0
- package/dist/blog/public-blog-micro.d.ts +291 -0
- package/dist/blog/public-blog-micro.d.ts.map +1 -0
- package/dist/blog/public-blog-micro.js +71 -0
- package/dist/blog/public-blog-micro.js.map +1 -0
- package/dist/blog/public-blog-service.d.ts +104 -0
- package/dist/blog/public-blog-service.d.ts.map +1 -0
- package/dist/blog/public-blog-service.js +341 -0
- package/dist/blog/public-blog-service.js.map +1 -0
- package/dist/browser-api/dispatch-stream.d.ts +5 -0
- package/dist/browser-api/dispatch-stream.d.ts.map +1 -0
- package/dist/browser-api/dispatch-stream.js +4 -0
- package/dist/browser-api/dispatch-stream.js.map +1 -0
- package/dist/browser-api/dispatcher.d.ts +15 -0
- package/dist/browser-api/dispatcher.d.ts.map +1 -0
- package/dist/browser-api/dispatcher.js +145 -0
- package/dist/browser-api/dispatcher.js.map +1 -0
- package/dist/browser-api/provider-publisher.d.ts +24 -0
- package/dist/browser-api/provider-publisher.d.ts.map +1 -0
- package/dist/browser-api/provider-publisher.js +107 -0
- package/dist/browser-api/provider-publisher.js.map +1 -0
- package/dist/command/index.d.ts +3 -0
- package/dist/command/index.d.ts.map +1 -0
- package/dist/command/index.js +24 -0
- package/dist/command/index.js.map +1 -0
- package/dist/config/schema.d.ts +25 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +19 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/contracts/identity.d.ts +2 -0
- package/dist/contracts/identity.d.ts.map +1 -0
- package/dist/contracts/identity.js +2 -0
- package/dist/contracts/identity.js.map +1 -0
- package/dist/contracts/mcp.d.ts +69 -0
- package/dist/contracts/mcp.d.ts.map +1 -0
- package/dist/contracts/mcp.js +41 -0
- package/dist/contracts/mcp.js.map +1 -0
- package/dist/contracts/public-api.d.ts +3 -0
- package/dist/contracts/public-api.d.ts.map +1 -0
- package/dist/contracts/public-api.js +2 -0
- package/dist/contracts/public-api.js.map +1 -0
- package/dist/mcp/blog-prompts.d.ts +135 -0
- package/dist/mcp/blog-prompts.d.ts.map +1 -0
- package/dist/mcp/blog-prompts.js +107 -0
- package/dist/mcp/blog-prompts.js.map +1 -0
- package/dist/mcp/blog-provider.d.ts +4 -0
- package/dist/mcp/blog-provider.d.ts.map +1 -0
- package/dist/mcp/blog-provider.js +27 -0
- package/dist/mcp/blog-provider.js.map +1 -0
- package/dist/mcp/blog-theme-authoring-prompt.d.ts +19 -0
- package/dist/mcp/blog-theme-authoring-prompt.d.ts.map +1 -0
- package/dist/mcp/blog-theme-authoring-prompt.js +171 -0
- package/dist/mcp/blog-theme-authoring-prompt.js.map +1 -0
- package/dist/mcp/category-tools.d.ts +45 -0
- package/dist/mcp/category-tools.d.ts.map +1 -0
- package/dist/mcp/category-tools.js +14 -0
- package/dist/mcp/category-tools.js.map +1 -0
- package/dist/mcp/comment-tools.d.ts +44 -0
- package/dist/mcp/comment-tools.d.ts.map +1 -0
- package/dist/mcp/comment-tools.js +15 -0
- package/dist/mcp/comment-tools.js.map +1 -0
- package/dist/mcp/friend-link-tools.d.ts +63 -0
- package/dist/mcp/friend-link-tools.d.ts.map +1 -0
- package/dist/mcp/friend-link-tools.js +16 -0
- package/dist/mcp/friend-link-tools.js.map +1 -0
- package/dist/mcp/page-tools.d.ts +67 -0
- package/dist/mcp/page-tools.d.ts.map +1 -0
- package/dist/mcp/page-tools.js +36 -0
- package/dist/mcp/page-tools.js.map +1 -0
- package/dist/mcp/post-tools.d.ts +114 -0
- package/dist/mcp/post-tools.d.ts.map +1 -0
- package/dist/mcp/post-tools.js +122 -0
- package/dist/mcp/post-tools.js.map +1 -0
- package/dist/mcp/tag-tools.d.ts +37 -0
- package/dist/mcp/tag-tools.d.ts.map +1 -0
- package/dist/mcp/tag-tools.js +14 -0
- package/dist/mcp/tag-tools.js.map +1 -0
- package/dist/mcp/theme-tools.d.ts +16 -0
- package/dist/mcp/theme-tools.d.ts.map +1 -0
- package/dist/mcp/theme-tools.js +71 -0
- package/dist/mcp/theme-tools.js.map +1 -0
- package/dist/mcp/tool-descriptions.d.ts +5 -0
- package/dist/mcp/tool-descriptions.d.ts.map +1 -0
- package/dist/mcp/tool-descriptions.js +51 -0
- package/dist/mcp/tool-descriptions.js.map +1 -0
- package/dist/mcp/tool-support.d.ts +242 -0
- package/dist/mcp/tool-support.d.ts.map +1 -0
- package/dist/mcp/tool-support.js +127 -0
- package/dist/mcp/tool-support.js.map +1 -0
- package/dist/messages/browser/dispatch.msg.d.ts +3 -0
- package/dist/messages/browser/dispatch.msg.d.ts.map +1 -0
- package/dist/messages/browser/dispatch.msg.js +9 -0
- package/dist/messages/browser/dispatch.msg.js.map +1 -0
- package/dist/messages/public/categories/list.msg.d.ts +3 -0
- package/dist/messages/public/categories/list.msg.d.ts.map +1 -0
- package/dist/messages/public/categories/list.msg.js +8 -0
- package/dist/messages/public/categories/list.msg.js.map +1 -0
- package/dist/messages/public/comments/list.msg.d.ts +3 -0
- package/dist/messages/public/comments/list.msg.d.ts.map +1 -0
- package/dist/messages/public/comments/list.msg.js +8 -0
- package/dist/messages/public/comments/list.msg.js.map +1 -0
- package/dist/messages/public/comments/recent.msg.d.ts +3 -0
- package/dist/messages/public/comments/recent.msg.d.ts.map +1 -0
- package/dist/messages/public/comments/recent.msg.js +8 -0
- package/dist/messages/public/comments/recent.msg.js.map +1 -0
- package/dist/messages/public/friend-links/list.msg.d.ts +3 -0
- package/dist/messages/public/friend-links/list.msg.d.ts.map +1 -0
- package/dist/messages/public/friend-links/list.msg.js +8 -0
- package/dist/messages/public/friend-links/list.msg.js.map +1 -0
- package/dist/messages/public/pages/list.msg.d.ts +3 -0
- package/dist/messages/public/pages/list.msg.d.ts.map +1 -0
- package/dist/messages/public/pages/list.msg.js +8 -0
- package/dist/messages/public/pages/list.msg.js.map +1 -0
- package/dist/messages/public/pages/read.msg.d.ts +3 -0
- package/dist/messages/public/pages/read.msg.d.ts.map +1 -0
- package/dist/messages/public/pages/read.msg.js +8 -0
- package/dist/messages/public/pages/read.msg.js.map +1 -0
- package/dist/messages/public/posts/archive.msg.d.ts +3 -0
- package/dist/messages/public/posts/archive.msg.d.ts.map +1 -0
- package/dist/messages/public/posts/archive.msg.js +8 -0
- package/dist/messages/public/posts/archive.msg.js.map +1 -0
- package/dist/messages/public/posts/connections.msg.d.ts +3 -0
- package/dist/messages/public/posts/connections.msg.d.ts.map +1 -0
- package/dist/messages/public/posts/connections.msg.js +8 -0
- package/dist/messages/public/posts/connections.msg.js.map +1 -0
- package/dist/messages/public/posts/list.msg.d.ts +3 -0
- package/dist/messages/public/posts/list.msg.d.ts.map +1 -0
- package/dist/messages/public/posts/list.msg.js +8 -0
- package/dist/messages/public/posts/list.msg.js.map +1 -0
- package/dist/messages/public/posts/open.msg.d.ts +3 -0
- package/dist/messages/public/posts/open.msg.d.ts.map +1 -0
- package/dist/messages/public/posts/open.msg.js +8 -0
- package/dist/messages/public/posts/open.msg.js.map +1 -0
- package/dist/messages/public/posts/read.msg.d.ts +3 -0
- package/dist/messages/public/posts/read.msg.d.ts.map +1 -0
- package/dist/messages/public/posts/read.msg.js +8 -0
- package/dist/messages/public/posts/read.msg.js.map +1 -0
- package/dist/messages/public/tags/list.msg.d.ts +3 -0
- package/dist/messages/public/tags/list.msg.d.ts.map +1 -0
- package/dist/messages/public/tags/list.msg.js +8 -0
- package/dist/messages/public/tags/list.msg.js.map +1 -0
- package/dist/migrations/index.d.ts +3 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +2 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/persistence/category-store.d.ts +23 -0
- package/dist/persistence/category-store.d.ts.map +1 -0
- package/dist/persistence/category-store.js +86 -0
- package/dist/persistence/category-store.js.map +1 -0
- package/dist/persistence/comment-store.d.ts +41 -0
- package/dist/persistence/comment-store.d.ts.map +1 -0
- package/dist/persistence/comment-store.js +146 -0
- package/dist/persistence/comment-store.js.map +1 -0
- package/dist/persistence/entities.d.ts +103 -0
- package/dist/persistence/entities.d.ts.map +1 -0
- package/dist/persistence/entities.js +188 -0
- package/dist/persistence/entities.js.map +1 -0
- package/dist/persistence/friend-link-store.d.ts +26 -0
- package/dist/persistence/friend-link-store.d.ts.map +1 -0
- package/dist/persistence/friend-link-store.js +80 -0
- package/dist/persistence/friend-link-store.js.map +1 -0
- package/dist/persistence/page-store.d.ts +35 -0
- package/dist/persistence/page-store.d.ts.map +1 -0
- package/dist/persistence/page-store.js +125 -0
- package/dist/persistence/page-store.js.map +1 -0
- package/dist/persistence/post-engagement-store.d.ts +23 -0
- package/dist/persistence/post-engagement-store.d.ts.map +1 -0
- package/dist/persistence/post-engagement-store.js +85 -0
- package/dist/persistence/post-engagement-store.js.map +1 -0
- package/dist/persistence/post-store.d.ts +87 -0
- package/dist/persistence/post-store.d.ts.map +1 -0
- package/dist/persistence/post-store.js +465 -0
- package/dist/persistence/post-store.js.map +1 -0
- package/dist/persistence/tag-store.d.ts +21 -0
- package/dist/persistence/tag-store.d.ts.map +1 -0
- package/dist/persistence/tag-store.js +82 -0
- package/dist/persistence/tag-store.js.map +1 -0
- package/dist/services/application.service.d.ts +4 -0
- package/dist/services/application.service.d.ts.map +1 -0
- package/dist/services/application.service.js +22 -0
- package/dist/services/application.service.js.map +1 -0
- package/dist/services/blog-runtime.service.d.ts +10 -0
- package/dist/services/blog-runtime.service.d.ts.map +1 -0
- package/dist/services/blog-runtime.service.js +32 -0
- package/dist/services/blog-runtime.service.js.map +1 -0
- package/dist/services/blog.boot.d.ts +6 -0
- package/dist/services/blog.boot.d.ts.map +1 -0
- package/dist/services/blog.boot.js +13 -0
- package/dist/services/blog.boot.js.map +1 -0
- package/dist/services/browser-api-provider.service.d.ts +4 -0
- package/dist/services/browser-api-provider.service.d.ts.map +1 -0
- package/dist/services/browser-api-provider.service.js +25 -0
- package/dist/services/browser-api-provider.service.js.map +1 -0
- package/dist/services/config.service.d.ts +3 -0
- package/dist/services/config.service.d.ts.map +1 -0
- package/dist/services/config.service.js +22 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/database.service.d.ts +3 -0
- package/dist/services/database.service.d.ts.map +1 -0
- package/dist/services/database.service.js +16 -0
- package/dist/services/database.service.js.map +1 -0
- package/dist/services/logger.service.d.ts +4 -0
- package/dist/services/logger.service.d.ts.map +1 -0
- package/dist/services/logger.service.js +8 -0
- package/dist/services/logger.service.js.map +1 -0
- package/dist/services/mcp-provider.service.d.ts +3 -0
- package/dist/services/mcp-provider.service.d.ts.map +1 -0
- package/dist/services/mcp-provider.service.js +17 -0
- package/dist/services/mcp-provider.service.js.map +1 -0
- package/dist/services/redis.service.d.ts +4 -0
- package/dist/services/redis.service.d.ts.map +1 -0
- package/dist/services/redis.service.js +18 -0
- package/dist/services/redis.service.js.map +1 -0
- package/dist/services/theme-control.service.d.ts +4 -0
- package/dist/services/theme-control.service.d.ts.map +1 -0
- package/dist/services/theme-control.service.js +53 -0
- package/dist/services/theme-control.service.js.map +1 -0
- package/dist/themes/theme-catalog.d.ts +40 -0
- package/dist/themes/theme-catalog.d.ts.map +1 -0
- package/dist/themes/theme-catalog.js +164 -0
- package/dist/themes/theme-catalog.js.map +1 -0
- package/dist/themes/theme-control.d.ts +16 -0
- package/dist/themes/theme-control.d.ts.map +1 -0
- package/dist/themes/theme-control.js +57 -0
- package/dist/themes/theme-control.js.map +1 -0
- package/dist/themes/theme-discovery-runtime.d.ts +41 -0
- package/dist/themes/theme-discovery-runtime.d.ts.map +1 -0
- package/dist/themes/theme-discovery-runtime.js +109 -0
- package/dist/themes/theme-discovery-runtime.js.map +1 -0
- package/dist/themes/theme-generation-store.d.ts +14 -0
- package/dist/themes/theme-generation-store.d.ts.map +1 -0
- package/dist/themes/theme-generation-store.js +49 -0
- package/dist/themes/theme-generation-store.js.map +1 -0
- package/dist/themes/theme-selection-publisher.d.ts +28 -0
- package/dist/themes/theme-selection-publisher.d.ts.map +1 -0
- package/dist/themes/theme-selection-publisher.js +92 -0
- package/dist/themes/theme-selection-publisher.js.map +1 -0
- package/dist/themes/theme-selection-store.d.ts +22 -0
- package/dist/themes/theme-selection-store.d.ts.map +1 -0
- package/dist/themes/theme-selection-store.js +84 -0
- package/dist/themes/theme-selection-store.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { type BlogComment, type BlogCommentList, type BlogPostConnections, type BlogPostDetail, type BlogPostList, type BlogPostArchive, type BlogPostArchiveInput, type BlogPostEngagement, type BlogPostLikeResult, type BlogPostSearchResult, type BlogPageDetail, type BlogPagePosition } from '../contracts/public-api.js';
|
|
2
|
+
import type { UserCurrentUserResponse, UserPublicProfilesResponse } from '@zlooks.cn/user-shared';
|
|
3
|
+
import type { ExecutionContext } from '@hile/context';
|
|
4
|
+
import type { BlogApplication } from './blog-application.js';
|
|
5
|
+
import type { CommentClientMetadataResolver } from './comment-client-metadata.js';
|
|
6
|
+
import type { PostViewDedupeCache } from './post-view-cache.js';
|
|
7
|
+
export interface BlogUserDirectory {
|
|
8
|
+
authenticate(context: ExecutionContext, signal?: AbortSignal): Promise<UserCurrentUserResponse>;
|
|
9
|
+
readPublicProfiles(userIds: readonly string[], context: ExecutionContext, signal?: AbortSignal): Promise<UserPublicProfilesResponse>;
|
|
10
|
+
}
|
|
11
|
+
export declare class PublicBlogService {
|
|
12
|
+
private readonly blog;
|
|
13
|
+
private readonly users;
|
|
14
|
+
private readonly clientMetadata;
|
|
15
|
+
private readonly viewCache;
|
|
16
|
+
private readonly clock;
|
|
17
|
+
constructor(blog: BlogApplication, users: BlogUserDirectory, clientMetadata?: CommentClientMetadataResolver, viewCache?: PostViewDedupeCache, clock?: () => Date);
|
|
18
|
+
listPosts(input: {
|
|
19
|
+
limit: number;
|
|
20
|
+
cursor?: string | undefined;
|
|
21
|
+
page?: number | undefined;
|
|
22
|
+
category?: string | undefined;
|
|
23
|
+
tag?: string | undefined;
|
|
24
|
+
}, signal?: AbortSignal): Promise<BlogPostList>;
|
|
25
|
+
listPostArchive(input: BlogPostArchiveInput, signal?: AbortSignal): Promise<BlogPostArchive>;
|
|
26
|
+
readPost(slug: string, signal?: AbortSignal): Promise<BlogPostDetail | undefined>;
|
|
27
|
+
openPost(slug: string, context: ExecutionContext, signal?: AbortSignal): Promise<{
|
|
28
|
+
post: BlogPostDetail;
|
|
29
|
+
engagement: BlogPostEngagement;
|
|
30
|
+
} | undefined>;
|
|
31
|
+
setPostLiked(slug: string, liked: boolean, context: ExecutionContext, signal?: AbortSignal): Promise<BlogPostLikeResult | undefined>;
|
|
32
|
+
searchPosts(input: {
|
|
33
|
+
query: string;
|
|
34
|
+
limit: number;
|
|
35
|
+
}, signal?: AbortSignal): Promise<BlogPostSearchResult>;
|
|
36
|
+
readPostConnections(slug: string, relatedLimit: number, signal?: AbortSignal): Promise<BlogPostConnections | undefined>;
|
|
37
|
+
listCategories(signal?: AbortSignal): Promise<readonly Readonly<{
|
|
38
|
+
id: string;
|
|
39
|
+
name: string;
|
|
40
|
+
slug: string;
|
|
41
|
+
description: string | null;
|
|
42
|
+
sortOrder: number;
|
|
43
|
+
postCount: number;
|
|
44
|
+
}>[]>;
|
|
45
|
+
listTags(signal?: AbortSignal): Promise<readonly Readonly<{
|
|
46
|
+
id: string;
|
|
47
|
+
name: string;
|
|
48
|
+
slug: string;
|
|
49
|
+
}>[]>;
|
|
50
|
+
listFriendLinks(signal?: AbortSignal): Promise<readonly Readonly<{
|
|
51
|
+
id: string;
|
|
52
|
+
name: string;
|
|
53
|
+
url: string;
|
|
54
|
+
description: string | null;
|
|
55
|
+
logoUrl: string | null;
|
|
56
|
+
sortOrder: number;
|
|
57
|
+
}>[]>;
|
|
58
|
+
listPages(position?: BlogPagePosition | null, signal?: AbortSignal): Promise<readonly Readonly<{
|
|
59
|
+
id: string;
|
|
60
|
+
title: string;
|
|
61
|
+
slug: string;
|
|
62
|
+
summary: string;
|
|
63
|
+
position: "navigation" | "sidebar" | null;
|
|
64
|
+
sortOrder: number;
|
|
65
|
+
publishedAt: string;
|
|
66
|
+
updatedAt: string;
|
|
67
|
+
}>[]>;
|
|
68
|
+
readPage(slug: string, signal?: AbortSignal): Promise<BlogPageDetail | undefined>;
|
|
69
|
+
listComments(postSlug: string, input: {
|
|
70
|
+
limit: number;
|
|
71
|
+
cursor?: string | undefined;
|
|
72
|
+
order?: 'desc' | 'asc';
|
|
73
|
+
}, context: ExecutionContext, signal?: AbortSignal): Promise<BlogCommentList | undefined>;
|
|
74
|
+
listRecentComments(limit: number, context: ExecutionContext, signal?: AbortSignal): Promise<readonly Readonly<{
|
|
75
|
+
comment: Readonly<{
|
|
76
|
+
id: string;
|
|
77
|
+
postId: string;
|
|
78
|
+
user: Readonly<{
|
|
79
|
+
id: string;
|
|
80
|
+
displayName: string | null;
|
|
81
|
+
avatar: string | null;
|
|
82
|
+
homepage: string | null;
|
|
83
|
+
bio: string | null;
|
|
84
|
+
}>;
|
|
85
|
+
content: string;
|
|
86
|
+
replyContent: string | null;
|
|
87
|
+
repliedAt: string | null;
|
|
88
|
+
createdAt: string;
|
|
89
|
+
location: string | null;
|
|
90
|
+
client: string | null;
|
|
91
|
+
pendingReview?: true | undefined;
|
|
92
|
+
}>;
|
|
93
|
+
post: Readonly<{
|
|
94
|
+
id: string;
|
|
95
|
+
title: string;
|
|
96
|
+
slug: string;
|
|
97
|
+
}>;
|
|
98
|
+
}>[]>;
|
|
99
|
+
createComment(postSlug: string, content: string, context: ExecutionContext, signal?: AbortSignal): Promise<BlogComment | undefined>;
|
|
100
|
+
private categoryMap;
|
|
101
|
+
private readViewerUserId;
|
|
102
|
+
private readViewer;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=public-blog-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-blog-service.d.ts","sourceRoot":"","sources":["../../src/blog/public-blog-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { parseBlogCategoryList, parseBlogComment, parseBlogCommentList, parseBlogFriendLinkList, parseBlogPostConnections, parseBlogPostDetail, parseBlogPostList, parseBlogPostArchive, parseBlogPostEngagement, parseBlogPostLikeResult, parseBlogPageDetail, parseBlogPageList, parseBlogPostSearchResult, parseBlogTagList, parseBlogRecentCommentList, } from '../contracts/public-api.js';
|
|
3
|
+
import { readBrowserApiClientFromContext } from '@zlooks.cn/browser-api';
|
|
4
|
+
import { BlogNotFoundError } from './errors.js';
|
|
5
|
+
const VIEW_WINDOW_MS = 86_400_000;
|
|
6
|
+
const disabledViewCache = {
|
|
7
|
+
hasRecent: async () => false,
|
|
8
|
+
remember: async () => undefined,
|
|
9
|
+
};
|
|
10
|
+
export class PublicBlogService {
|
|
11
|
+
blog;
|
|
12
|
+
users;
|
|
13
|
+
clientMetadata;
|
|
14
|
+
viewCache;
|
|
15
|
+
clock;
|
|
16
|
+
constructor(blog, users, clientMetadata = {
|
|
17
|
+
resolve: async () => ({ ipAddress: null, userAgent: null, ipLocation: null, clientLabel: null }),
|
|
18
|
+
}, viewCache = disabledViewCache, clock = () => new Date()) {
|
|
19
|
+
this.blog = blog;
|
|
20
|
+
this.users = users;
|
|
21
|
+
this.clientMetadata = clientMetadata;
|
|
22
|
+
this.viewCache = viewCache;
|
|
23
|
+
this.clock = clock;
|
|
24
|
+
}
|
|
25
|
+
async listPosts(input, signal) {
|
|
26
|
+
signal?.throwIfAborted();
|
|
27
|
+
const page = await this.blog.listPublicPosts({ limit: input.limit,
|
|
28
|
+
...(input.cursor ? { cursor: input.cursor } : {}),
|
|
29
|
+
...(input.page ? { page: input.page } : {}),
|
|
30
|
+
...(input.category ? { categorySlug: input.category } : {}),
|
|
31
|
+
...(input.tag ? { tagSlug: input.tag } : {}),
|
|
32
|
+
}, signal);
|
|
33
|
+
signal?.throwIfAborted();
|
|
34
|
+
const categories = await this.categoryMap(page.items, signal);
|
|
35
|
+
signal?.throwIfAborted();
|
|
36
|
+
return parseBlogPostList({ items: page.items.map((post) => postSummary(post, categories)), nextCursor: page.nextCursor, total: page.total });
|
|
37
|
+
}
|
|
38
|
+
async listPostArchive(input, signal) {
|
|
39
|
+
signal?.throwIfAborted();
|
|
40
|
+
const archive = await this.blog.listPublicPostArchive({
|
|
41
|
+
limit: input.limit,
|
|
42
|
+
monthLimit: input.monthLimit,
|
|
43
|
+
...(input.cursor ? { cursor: input.cursor } : {}),
|
|
44
|
+
...(input.page ? { page: input.page } : {}),
|
|
45
|
+
...(input.year !== undefined ? { year: input.year } : {}),
|
|
46
|
+
...(input.month !== undefined ? { month: input.month } : {}),
|
|
47
|
+
...(input.startYear !== undefined ? { startYear: input.startYear } : {}),
|
|
48
|
+
...(input.startMonth !== undefined ? { startMonth: input.startMonth } : {}),
|
|
49
|
+
...(input.endYear !== undefined ? { endYear: input.endYear } : {}),
|
|
50
|
+
...(input.endMonth !== undefined ? { endMonth: input.endMonth } : {}),
|
|
51
|
+
}, signal);
|
|
52
|
+
signal?.throwIfAborted();
|
|
53
|
+
const categories = await this.categoryMap(archive.items, signal);
|
|
54
|
+
signal?.throwIfAborted();
|
|
55
|
+
return parseBlogPostArchive({
|
|
56
|
+
items: archive.items.map((post) => postSummary(post, categories)),
|
|
57
|
+
months: archive.months,
|
|
58
|
+
nextCursor: archive.nextCursor,
|
|
59
|
+
total: archive.total,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async readPost(slug, signal) {
|
|
63
|
+
signal?.throwIfAborted();
|
|
64
|
+
const post = await this.blog.readPublicPost(slug, signal);
|
|
65
|
+
signal?.throwIfAborted();
|
|
66
|
+
if (!post)
|
|
67
|
+
return undefined;
|
|
68
|
+
const categories = await this.categoryMap([post], signal);
|
|
69
|
+
signal?.throwIfAborted();
|
|
70
|
+
return parseBlogPostDetail({ ...postSummary(post, categories), content: post.content });
|
|
71
|
+
}
|
|
72
|
+
async openPost(slug, context, signal) {
|
|
73
|
+
signal?.throwIfAborted();
|
|
74
|
+
const post = await this.blog.readPublicPost(slug, signal);
|
|
75
|
+
signal?.throwIfAborted();
|
|
76
|
+
if (!post)
|
|
77
|
+
return undefined;
|
|
78
|
+
const viewer = await this.readViewer(context, signal);
|
|
79
|
+
const subjectHash = viewSubjectHash(viewer.userId, context);
|
|
80
|
+
const now = this.clock();
|
|
81
|
+
if (subjectHash) {
|
|
82
|
+
let recent = false;
|
|
83
|
+
try {
|
|
84
|
+
recent = await this.viewCache.hasRecent(post.id, subjectHash, now, VIEW_WINDOW_MS);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
signal?.throwIfAborted();
|
|
88
|
+
}
|
|
89
|
+
if (!recent) {
|
|
90
|
+
const recorded = await this.blog.recordPostView(post.id, [subjectHash], now, VIEW_WINDOW_MS, signal);
|
|
91
|
+
try {
|
|
92
|
+
await this.viewCache.remember(post.id, subjectHash, recorded.countedAt, now, VIEW_WINDOW_MS);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
signal?.throwIfAborted();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const [categories, engagement] = await Promise.all([
|
|
100
|
+
this.categoryMap([post], signal),
|
|
101
|
+
this.blog.readPostEngagement(post.id, viewer.userId, signal),
|
|
102
|
+
]);
|
|
103
|
+
signal?.throwIfAborted();
|
|
104
|
+
return {
|
|
105
|
+
post: parseBlogPostDetail({ ...postSummary(post, categories), content: post.content }),
|
|
106
|
+
engagement: parseBlogPostEngagement({
|
|
107
|
+
viewCount: engagement.viewCount,
|
|
108
|
+
likeCount: engagement.likeCount,
|
|
109
|
+
viewerState: viewer.unavailable
|
|
110
|
+
? 'unavailable'
|
|
111
|
+
: viewer.userId
|
|
112
|
+
? engagement.liked ? 'liked' : 'not-liked'
|
|
113
|
+
: 'anonymous',
|
|
114
|
+
}),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
async setPostLiked(slug, liked, context, signal) {
|
|
118
|
+
signal?.throwIfAborted();
|
|
119
|
+
const authenticated = await this.users.authenticate(context, signal);
|
|
120
|
+
signal?.throwIfAborted();
|
|
121
|
+
if (!authenticated.authenticated)
|
|
122
|
+
return undefined;
|
|
123
|
+
const post = await this.blog.readPublicPost(slug, signal);
|
|
124
|
+
signal?.throwIfAborted();
|
|
125
|
+
if (!post)
|
|
126
|
+
throw new BlogNotFoundError('Post not found');
|
|
127
|
+
const result = await this.blog.setPostLiked(post.id, authenticated.user.id, liked, signal);
|
|
128
|
+
return parseBlogPostLikeResult(result);
|
|
129
|
+
}
|
|
130
|
+
async searchPosts(input, signal) {
|
|
131
|
+
signal?.throwIfAborted();
|
|
132
|
+
const posts = await this.blog.searchPosts({ ...input, status: 'published' }, signal);
|
|
133
|
+
signal?.throwIfAborted();
|
|
134
|
+
const categories = await this.categoryMap(posts, signal);
|
|
135
|
+
signal?.throwIfAborted();
|
|
136
|
+
return parseBlogPostSearchResult({ items: posts.map((post) => postSummary(post, categories)) });
|
|
137
|
+
}
|
|
138
|
+
async readPostConnections(slug, relatedLimit, signal) {
|
|
139
|
+
signal?.throwIfAborted();
|
|
140
|
+
const connections = await this.blog.readPublicPostConnections(slug, relatedLimit, signal);
|
|
141
|
+
signal?.throwIfAborted();
|
|
142
|
+
if (!connections)
|
|
143
|
+
return undefined;
|
|
144
|
+
const posts = [
|
|
145
|
+
...(connections.previousPost ? [connections.previousPost] : []),
|
|
146
|
+
...(connections.nextPost ? [connections.nextPost] : []),
|
|
147
|
+
...connections.relatedPosts,
|
|
148
|
+
];
|
|
149
|
+
const categories = await this.categoryMap(posts, signal);
|
|
150
|
+
signal?.throwIfAborted();
|
|
151
|
+
return parseBlogPostConnections({
|
|
152
|
+
previousPost: connections.previousPost
|
|
153
|
+
? postSummary(connections.previousPost, categories)
|
|
154
|
+
: null,
|
|
155
|
+
nextPost: connections.nextPost ? postSummary(connections.nextPost, categories) : null,
|
|
156
|
+
relatedPosts: connections.relatedPosts.map((post) => postSummary(post, categories)),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
async listCategories(signal) {
|
|
160
|
+
signal?.throwIfAborted();
|
|
161
|
+
const [categories, postCounts] = await Promise.all([
|
|
162
|
+
this.blog.listCategories(signal),
|
|
163
|
+
this.blog.countPublishedPostsByCategory(signal),
|
|
164
|
+
]);
|
|
165
|
+
signal?.throwIfAborted();
|
|
166
|
+
return parseBlogCategoryList(categories.map((category) => ({
|
|
167
|
+
...categorySummary(category),
|
|
168
|
+
postCount: postCounts.get(category.id) ?? 0,
|
|
169
|
+
})));
|
|
170
|
+
}
|
|
171
|
+
async listTags(signal) {
|
|
172
|
+
signal?.throwIfAborted();
|
|
173
|
+
const tags = await this.blog.listTags(signal);
|
|
174
|
+
signal?.throwIfAborted();
|
|
175
|
+
return parseBlogTagList(tags.map(tagSummary));
|
|
176
|
+
}
|
|
177
|
+
async listFriendLinks(signal) {
|
|
178
|
+
signal?.throwIfAborted();
|
|
179
|
+
const links = await this.blog.listPublicFriendLinks(signal);
|
|
180
|
+
signal?.throwIfAborted();
|
|
181
|
+
return parseBlogFriendLinkList(links.map((link) => ({
|
|
182
|
+
id: link.id, name: link.name, url: link.url, description: link.description,
|
|
183
|
+
logoUrl: link.logoUrl, sortOrder: link.sortOrder,
|
|
184
|
+
})));
|
|
185
|
+
}
|
|
186
|
+
async listPages(position, signal) {
|
|
187
|
+
signal?.throwIfAborted();
|
|
188
|
+
const pages = await this.blog.listPublicPages(position, signal);
|
|
189
|
+
signal?.throwIfAborted();
|
|
190
|
+
return parseBlogPageList(pages.map(pageSummary));
|
|
191
|
+
}
|
|
192
|
+
async readPage(slug, signal) {
|
|
193
|
+
signal?.throwIfAborted();
|
|
194
|
+
const page = await this.blog.readPublicPage(slug, signal);
|
|
195
|
+
signal?.throwIfAborted();
|
|
196
|
+
return page ? parseBlogPageDetail({ ...pageSummary(page), content: page.content }) : undefined;
|
|
197
|
+
}
|
|
198
|
+
async listComments(postSlug, input, context, signal) {
|
|
199
|
+
signal?.throwIfAborted();
|
|
200
|
+
const post = await this.blog.readPublicPost(postSlug, signal);
|
|
201
|
+
signal?.throwIfAborted();
|
|
202
|
+
if (!post)
|
|
203
|
+
return undefined;
|
|
204
|
+
const viewerUserId = await this.readViewerUserId(context, signal);
|
|
205
|
+
signal?.throwIfAborted();
|
|
206
|
+
const page = await this.blog.listVisibleCommentPage(post.id, input.limit, input.cursor, viewerUserId, input.order ?? 'desc', signal);
|
|
207
|
+
signal?.throwIfAborted();
|
|
208
|
+
const userIds = [...new Set(page.items.map(({ userId }) => userId))];
|
|
209
|
+
const response = userIds.length
|
|
210
|
+
? await this.users.readPublicProfiles(userIds, context, signal)
|
|
211
|
+
: { users: [] };
|
|
212
|
+
signal?.throwIfAborted();
|
|
213
|
+
const profiles = new Map(response.users.map((user) => [user.id, user]));
|
|
214
|
+
return parseBlogCommentList({
|
|
215
|
+
items: page.items.map((comment) => commentView(comment, profiles.get(comment.userId))), nextCursor: page.nextCursor,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
async listRecentComments(limit, context, signal) {
|
|
219
|
+
signal?.throwIfAborted();
|
|
220
|
+
const comments = await this.blog.listRecentApprovedComments(limit, signal);
|
|
221
|
+
signal?.throwIfAborted();
|
|
222
|
+
const posts = await this.blog.readPublishedPosts([...new Set(comments.map(({ postId }) => postId))], signal);
|
|
223
|
+
signal?.throwIfAborted();
|
|
224
|
+
const publishedPosts = new Map(posts.map((post) => [post.id, post]));
|
|
225
|
+
const visible = comments.filter(({ postId }) => publishedPosts.has(postId));
|
|
226
|
+
const userIds = [...new Set(visible.map(({ userId }) => userId))];
|
|
227
|
+
const response = userIds.length
|
|
228
|
+
? await this.users.readPublicProfiles(userIds, context, signal)
|
|
229
|
+
: { users: [] };
|
|
230
|
+
signal?.throwIfAborted();
|
|
231
|
+
const profiles = new Map(response.users.map((user) => [user.id, user]));
|
|
232
|
+
return parseBlogRecentCommentList(visible.map((comment) => {
|
|
233
|
+
const post = publishedPosts.get(comment.postId);
|
|
234
|
+
if (!post)
|
|
235
|
+
throw new Error('Recent comment post projection is incomplete');
|
|
236
|
+
return {
|
|
237
|
+
comment: commentView(comment, profiles.get(comment.userId)),
|
|
238
|
+
post: { id: post.id, title: post.title, slug: post.slug },
|
|
239
|
+
};
|
|
240
|
+
}));
|
|
241
|
+
}
|
|
242
|
+
async createComment(postSlug, content, context, signal) {
|
|
243
|
+
signal?.throwIfAborted();
|
|
244
|
+
const authenticated = await this.users.authenticate(context, signal);
|
|
245
|
+
signal?.throwIfAborted();
|
|
246
|
+
if (!authenticated.authenticated)
|
|
247
|
+
return undefined;
|
|
248
|
+
const post = await this.blog.readPublicPost(postSlug, signal);
|
|
249
|
+
signal?.throwIfAborted();
|
|
250
|
+
if (!post)
|
|
251
|
+
throw new BlogNotFoundError('Post not found');
|
|
252
|
+
const metadata = await this.clientMetadata.resolve(readBrowserApiClientFromContext(context.values));
|
|
253
|
+
signal?.throwIfAborted();
|
|
254
|
+
const row = await this.blog.createComment({
|
|
255
|
+
postId: post.id,
|
|
256
|
+
userId: authenticated.user.id,
|
|
257
|
+
content,
|
|
258
|
+
...metadata,
|
|
259
|
+
}, signal);
|
|
260
|
+
return parseBlogComment(commentView(row, authenticated.user));
|
|
261
|
+
}
|
|
262
|
+
async categoryMap(posts, signal) {
|
|
263
|
+
signal?.throwIfAborted();
|
|
264
|
+
const rows = posts
|
|
265
|
+
? await this.blog.readCategories([...new Set(posts.map(({ categoryId }) => categoryId))], signal)
|
|
266
|
+
: await this.blog.listCategories(signal);
|
|
267
|
+
signal?.throwIfAborted();
|
|
268
|
+
return new Map(rows.map((row) => [row.id, categorySummary(row)]));
|
|
269
|
+
}
|
|
270
|
+
async readViewerUserId(context, signal) {
|
|
271
|
+
try {
|
|
272
|
+
const response = await this.users.authenticate(context, signal);
|
|
273
|
+
return response.authenticated ? response.user.id : undefined;
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
signal?.throwIfAborted();
|
|
277
|
+
return undefined;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
async readViewer(context, signal) {
|
|
281
|
+
try {
|
|
282
|
+
const response = await this.users.authenticate(context, signal);
|
|
283
|
+
return response.authenticated
|
|
284
|
+
? { userId: response.user.id, unavailable: false }
|
|
285
|
+
: { userId: undefined, unavailable: false };
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
signal?.throwIfAborted();
|
|
289
|
+
return { userId: undefined, unavailable: true };
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
function viewSubjectHash(userId, context) {
|
|
294
|
+
if (userId)
|
|
295
|
+
return sha256(`user:${userId}`);
|
|
296
|
+
const client = readBrowserApiClientFromContext(context.values);
|
|
297
|
+
if (!client?.ipAddress)
|
|
298
|
+
return undefined;
|
|
299
|
+
return sha256(`anonymous:${client.ipAddress}\n${client.userAgent ?? ''}`);
|
|
300
|
+
}
|
|
301
|
+
function sha256(value) {
|
|
302
|
+
return createHash('sha256').update(value).digest('hex');
|
|
303
|
+
}
|
|
304
|
+
function categorySummary(row) {
|
|
305
|
+
return { id: row.id, name: row.name, slug: row.slug, description: row.description, sortOrder: row.sortOrder };
|
|
306
|
+
}
|
|
307
|
+
function tagSummary(row) {
|
|
308
|
+
return { id: row.id, name: row.name, slug: row.slug };
|
|
309
|
+
}
|
|
310
|
+
function postSummary(post, categories) {
|
|
311
|
+
const category = categories.get(post.categoryId);
|
|
312
|
+
if (!category || !post.publishedAt)
|
|
313
|
+
throw new Error('Published post projection is incomplete');
|
|
314
|
+
return {
|
|
315
|
+
id: post.id, category, title: post.title, slug: post.slug, summary: post.summary,
|
|
316
|
+
coverUrl: post.coverUrl, publishedAt: post.publishedAt.toISOString(), updatedAt: post.updatedAt.toISOString(),
|
|
317
|
+
tags: post.tags.map(tagSummary),
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
function pageSummary(page) {
|
|
321
|
+
if (!page.publishedAt)
|
|
322
|
+
throw new Error('Published page projection is incomplete');
|
|
323
|
+
return {
|
|
324
|
+
id: page.id, title: page.title, slug: page.slug, summary: page.summary,
|
|
325
|
+
position: page.position, sortOrder: page.sortOrder,
|
|
326
|
+
publishedAt: page.publishedAt.toISOString(), updatedAt: page.updatedAt.toISOString(),
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
function commentView(row, user) {
|
|
330
|
+
const publicUser = user
|
|
331
|
+
? { ...user, homepage: user.homepage ?? null, bio: user.bio ?? null }
|
|
332
|
+
: { id: row.userId, displayName: null, avatar: null, homepage: null, bio: null };
|
|
333
|
+
return {
|
|
334
|
+
id: row.id, postId: row.postId, user: publicUser,
|
|
335
|
+
content: row.content, replyContent: row.replyContent,
|
|
336
|
+
repliedAt: row.repliedAt?.toISOString() ?? null, createdAt: row.createdAt.toISOString(),
|
|
337
|
+
location: row.ipLocation ?? null, client: row.clientLabel ?? null,
|
|
338
|
+
...(row.status === 'pending' ? { pendingReview: true } : {}),
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=public-blog-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-blog-service.js","sourceRoot":"","sources":["../../src/blog/public-blog-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { BlogBrowserApiResponse } from '../contracts/public-api.js';
|
|
2
|
+
import type { InvocationContext } from '@hile/context';
|
|
3
|
+
import type { BlogBrowserApiDispatcher } from './dispatcher.js';
|
|
4
|
+
export declare function dispatchBrowserApiFrame(dispatcher: BlogBrowserApiDispatcher, input: unknown, invocation: InvocationContext): AsyncGenerator<BlogBrowserApiResponse, void, void>;
|
|
5
|
+
//# sourceMappingURL=dispatch-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-stream.d.ts","sourceRoot":"","sources":["../../src/browser-api/dispatch-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAEhE,wBAAuB,uBAAuB,CAC5C,UAAU,EAAE,wBAAwB,EACpC,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,iBAAiB,GAC5B,cAAc,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,CAAC,CAEpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-stream.js","sourceRoot":"","sources":["../../src/browser-api/dispatch-stream.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,uBAAuB,CAC5C,UAAoC,EACpC,KAAc,EACd,UAA6B;IAE7B,MAAM,MAAM,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { InvocationContext } from '@hile/context';
|
|
2
|
+
import { type BlogBrowserApiResponse } from '../contracts/public-api.js';
|
|
3
|
+
import type { PublicBlogService } from '../blog/public-blog-service.js';
|
|
4
|
+
export declare class BlogBrowserApiDispatcher {
|
|
5
|
+
private readonly options;
|
|
6
|
+
constructor(options: {
|
|
7
|
+
readonly blog: PublicBlogService;
|
|
8
|
+
readonly readPublicOrigin: () => string;
|
|
9
|
+
readonly onError?: (error: unknown) => void;
|
|
10
|
+
});
|
|
11
|
+
dispatch(input: unknown, invocation: InvocationContext): Promise<BlogBrowserApiResponse>;
|
|
12
|
+
private route;
|
|
13
|
+
private comments;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/browser-api/dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAEuB,KAAK,sBAAsB,EACxD,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAwBxE,qBAAa,wBAAwB;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAA3C,YAAoC,OAAO,EAAE;QAC3C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;QACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,MAAM,CAAC;QACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;KAC7C,EAAI;IAEQ,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAiCpG;YAEa,KAAK;YAuCL,QAAQ;CAqBvB"}
|