@moontaiworks/fanbox-dl 1.7.3 → 1.7.4
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/bundle/index.cjs.map +1 -1
- package/dist/bundle/index.d.cts +3 -1
- package/dist/bundle/index.d.ts +3 -1
- package/dist/bundle/index.js.map +1 -1
- package/dist/cjs/client/endpoints/creator-list-posts.d.ts +3 -1
- package/dist/cjs/client/endpoints/creator-list-posts.d.ts.map +1 -1
- package/dist/cjs/client/endpoints/creator-list-posts.js.map +1 -1
- package/dist/cjs/downloader/creator/discover-posts.js +1 -1
- package/dist/cjs/downloader/creator/discover-posts.js.map +1 -1
- package/dist/esm/client/endpoints/creator-list-posts.d.ts +3 -1
- package/dist/esm/client/endpoints/creator-list-posts.d.ts.map +1 -1
- package/dist/esm/client/endpoints/creator-list-posts.js.map +1 -1
- package/dist/esm/downloader/creator/discover-posts.js +1 -1
- package/dist/esm/downloader/creator/discover-posts.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/transport/http2-session.ts","../../src/transport/http2.ts","../../src/client/endpoints/creator-get.ts","../../src/client/endpoints/creator-list-pages.ts","../../src/client/endpoints/creator-list-plans.ts","../../src/client/endpoints/creator-list-posts.ts","../../src/client/endpoints/post-info.ts","../../src/client/endpoints/post-list-home.ts","../../src/client/endpoints/post-list-supporting.ts","../../src/client/endpoints/user-list-following.ts","../../src/client/endpoints/user-list-supporting.ts","../../src/client/client.ts"],"sourcesContent":["export { FanboxApiError, FanboxClient } from \"./client/client.js\";\nexport type * from \"./client/types.js\";\n","import { type ClientHttp2Session, connect } from \"node:http2\";\n\nexport interface Http2SessionManagerOptions {\n sessionsPerOrigin?: number;\n}\n\ninterface OriginSessionPool {\n nextIndex: number;\n sessions: ClientHttp2Session[];\n}\n\nexport class Http2SessionManager {\n readonly #pools = new Map<string, OriginSessionPool>();\n readonly #sessionsPerOrigin: number;\n\n constructor({ sessionsPerOrigin = 5 }: Http2SessionManagerOptions = {}) {\n this.#sessionsPerOrigin = Math.max(1, Math.floor(sessionsPerOrigin));\n }\n\n async closeAll(): Promise<void> {\n const sessions = [...this.#pools.values()].flatMap((pool) => pool.sessions);\n this.#pools.clear();\n await Promise.all(sessions.map(closeHttp2Session));\n }\n\n getSession(url: string): ClientHttp2Session {\n const origin = new URL(url).origin;\n const pool = this.#pools.get(origin) ?? this.#createPool(origin);\n\n if (pool.sessions.length < this.#sessionsPerOrigin) {\n const session = this.#createSession(origin);\n pool.sessions.push(session);\n return session;\n }\n\n const session = pool.sessions[pool.nextIndex % pool.sessions.length];\n pool.nextIndex = (pool.nextIndex + 1) % pool.sessions.length;\n\n return session;\n }\n\n #createPool(origin: string): OriginSessionPool {\n const pool = { nextIndex: 0, sessions: [] };\n this.#pools.set(origin, pool);\n return pool;\n }\n\n #createSession(origin: string) {\n const session = connect(origin);\n\n const cleanup = () => {\n const pool = this.#pools.get(origin);\n if (!pool) return;\n\n const index = pool.sessions.indexOf(session);\n if (index >= 0) {\n pool.sessions.splice(index, 1);\n pool.nextIndex = Math.min(pool.nextIndex, pool.sessions.length);\n }\n\n if (pool.sessions.length === 0) {\n this.#pools.delete(origin);\n }\n };\n session.once(\"close\", cleanup);\n session.once(\"error\", cleanup);\n\n return session;\n }\n}\n\nfunction closeHttp2Session(session: ClientHttp2Session): Promise<void> {\n if (session.closed || session.destroyed) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n session.close(resolve);\n });\n}\n","import {\n Http2SessionManager,\n type Http2SessionManagerOptions,\n} from \"./http2-session.js\";\n\nconst HTTP2_HEADER_STATUS = \":status\";\n\nexport interface HttpTransport {\n fetch(input: Request | string | URL): Promise<Response>;\n}\n\nexport class Http2Error extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"Http2Error\";\n }\n}\n\nexport class Http2Transport {\n readonly #pool: Http2SessionManager;\n\n constructor(options: Http2SessionManagerOptions = {}) {\n this.#pool = new Http2SessionManager(options);\n }\n\n fetch(input: Request | string | URL) {\n const request = input instanceof Request ? input : new Request(input);\n const headers = attachHttp2Headers(request);\n\n const session = this.#pool.getSession(request.url);\n const stream = session.request(headers, { endStream: !request.body });\n\n return new Promise<Response>((resolve, reject) => {\n let settled = false;\n stream.once(\"error\", reject);\n stream.once(\"close\", () => {\n if (!settled) {\n reject(new Http2Error(`HTTP/2 stream closed before response`));\n }\n });\n\n stream.once(\"response\", (responseHeaders) => {\n settled = true;\n resolve(\n new Response(stream, {\n headers: createResponseHeaders(responseHeaders),\n status: parseStatus(responseHeaders[HTTP2_HEADER_STATUS]),\n }),\n );\n });\n\n // If the request has a body, write it to the stream. If writing fails, destroy the stream to trigger error handling.\n if (request.body) stream.end(request.body);\n });\n }\n}\n\nfunction attachHttp2Headers(request: Request) {\n const url = new URL(request.url);\n const headers = { ...Object.fromEntries(request.headers) };\n\n headers[\":authority\"] = url.host;\n headers[\":method\"] = request.method.toUpperCase();\n headers[\":path\"] = `${url.pathname}${url.search}`;\n headers[\":scheme\"] = url.protocol.slice(0, -1);\n\n return headers;\n}\n\nfunction createResponseHeaders(\n headers: Record<string, string | string[] | undefined>,\n): Headers {\n const result = new Headers();\n for (const [key, value] of Object.entries(headers)) {\n if (\n // ignore HTTP/2 pseudo-headers in the response\n key.startsWith(\":\") ||\n value === undefined\n )\n continue;\n\n if (Array.isArray(value)) {\n for (const item of value) {\n result.append(key, item);\n }\n } else {\n result.set(key, value);\n }\n }\n\n return result;\n}\n\nfunction parseStatus(status: number | string | string[] | undefined): number {\n if (typeof status === \"number\") {\n return status;\n }\n if (Array.isArray(status)) {\n return Number(status[0] ?? 0);\n }\n\n return Number(status ?? 0);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { Creator } from \"../models/creator.js\";\n\nexport interface GetCreatorParams {\n creatorId: string;\n}\n\nexport type GetCreatorResult = Creator;\n\n/**\n * Get detailed information about a specific creator.\n */\nexport async function getCreator(\n this: FanboxClient,\n params: GetCreatorParams,\n): Promise<GetCreatorResult> {\n return this.get(\"creator.get\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostSort } from \"../models/post.js\";\n\nexport interface PaginateCreatorPostsParams {\n creatorId: string;\n sort?: PostSort;\n}\n\nexport type PaginateCreatorPostsResult = string[];\n\n/**\n * List all urls to the pages, which paginated by the given conditions.\n */\nexport async function paginateCreatorPosts(\n this: FanboxClient,\n params: PaginateCreatorPostsParams,\n): Promise<PaginateCreatorPostsResult> {\n return this.get(\"post.paginateCreator\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { Plan } from \"../models/plan.js\";\n\nexport interface ListCreatorPlansParams {\n creatorId: string;\n}\n\nexport type ListCreatorPlansResult = Plan[];\n\n/**\n * List plans for a specific creator.\n */\nexport async function listCreatorPlans(\n this: FanboxClient,\n params: ListCreatorPlansParams,\n): Promise<ListCreatorPlansResult> {\n return this.get(\"plan.listCreator\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostListParams, PostSort, PostSummary } from \"../models/post.js\";\n\nexport interface ListCreatorPostsParams extends PostListParams {\n creatorId: string;\n firstId?: string;\n firstPublishedDatetime?: string;\n sort?: PostSort;\n}\n\nexport type ListCreatorPostsResult = PostSummary[];\n\n/**\n * List posts for a specific creator.\n */\nexport async function listCreatorPosts(\n this: FanboxClient,\n params: ListCreatorPostsParams,\n): Promise<ListCreatorPostsResult> {\n return this.get(\"post.listCreator\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { Post } from \"../models/post.js\";\n\nexport interface GetPostParams {\n postId: string;\n}\n\nexport interface GetPostResult {\n post: Post;\n}\n\n/**\n * Get detailed information about a specific post.\n */\nexport async function getPost(\n this: FanboxClient,\n params: GetPostParams,\n): Promise<GetPostResult> {\n return this.get(\"post.info\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostListParams, PostSummary } from \"../models/post.js\";\n\nexport type ListHomePostsParams = PostListParams;\n\nexport type ListHomePostsResult = PostSummary[];\n\n/**\n * List all posts from the home feed from both following and supporting\n * creators. This endpoint is only available to logged-in users.\n */\nexport async function listHomePosts(\n this: FanboxClient,\n params: ListHomePostsParams = {},\n): Promise<ListHomePostsResult> {\n return this.get(\"post.listHome\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostListParams, PostSummary } from \"../models/post.js\";\n\nexport type ListSupportingPostsParams = PostListParams;\n\nexport type ListSupportingPostsResult = PostSummary[];\n\n/**\n * List all posts from the home feed from supporting creators only. This\n * endpoint is only available to logged-in users.\n */\nexport async function listSupportingPosts(\n this: FanboxClient,\n params: ListSupportingPostsParams = {},\n): Promise<ListSupportingPostsResult> {\n return this.get(\"post.listSupporting\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { CreatorSummary } from \"../models/creator.js\";\n\nexport interface ListFollowingCreatorsResult {\n creators: CreatorSummary[];\n}\n\n/**\n * List creators that the authenticated user is following.\n */\nexport async function listFollowingCreators(\n this: FanboxClient,\n): Promise<ListFollowingCreatorsResult> {\n return this.get(\"creator.listFollowing\");\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { SupportingPlan } from \"../models/plan.js\";\n\nexport interface ListSupportingPlansResult {\n plans: SupportingPlan[];\n}\n\n/**\n * List plans that the authenticated user is supporting.\n */\nexport async function listSupportingPlans(\n this: FanboxClient,\n): Promise<ListSupportingPlansResult> {\n return this.get(\"plan.listSupporting\");\n}\n","import { Http2Transport, type HttpTransport } from \"../transport/http2.js\";\nimport { getCreator } from \"./endpoints/creator-get.js\";\nimport { paginateCreatorPosts } from \"./endpoints/creator-list-pages.js\";\nimport { listCreatorPlans } from \"./endpoints/creator-list-plans.js\";\nimport { listCreatorPosts } from \"./endpoints/creator-list-posts.js\";\nimport { getPost } from \"./endpoints/post-info.js\";\nimport { listHomePosts } from \"./endpoints/post-list-home.js\";\nimport { listSupportingPosts } from \"./endpoints/post-list-supporting.js\";\nimport { listFollowingCreators } from \"./endpoints/user-list-following.js\";\nimport { listSupportingPlans } from \"./endpoints/user-list-supporting.js\";\nimport type { FanboxEnvelope } from \"./fanbox-envelope.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.fanbox.cc\";\n\nexport interface FanboxClientOptions {\n baseUrl?: string;\n headers?: Record<string, string>;\n transport?: HttpTransport;\n}\n\nexport class FanboxApiError extends Error {\n public readonly body: unknown;\n public readonly status: number;\n public readonly statusText: string;\n\n public constructor(response: Response, body: unknown) {\n super(\n `FANBOX API request failed: ${response.status} ${response.statusText}`,\n );\n this.name = \"FanboxApiError\";\n this.body = body;\n this.status = response.status;\n this.statusText = response.statusText;\n }\n}\n\nexport class FanboxClient {\n getCreator = getCreator;\n getPost = getPost;\n listCreatorPlans = listCreatorPlans;\n listCreatorPosts = listCreatorPosts;\n listFollowingCreators = listFollowingCreators;\n listHomePosts = listHomePosts;\n listSupportingPlans = listSupportingPlans;\n listSupportingPosts = listSupportingPosts;\n paginateCreatorPosts = paginateCreatorPosts;\n\n readonly #baseUrl: string;\n readonly #headers: Record<string, string>;\n readonly #transport: HttpTransport;\n\n public constructor(options: FanboxClientOptions = {}) {\n this.#baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.#headers = options.headers ?? {};\n this.#transport = options.transport ?? new Http2Transport();\n }\n\n protected async get<T>(path: string, query: object = {}): Promise<T> {\n const url = new URL(\n path,\n this.#baseUrl.endsWith(\"/\") ? this.#baseUrl : `${this.#baseUrl}/`,\n );\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const request = new Request(url, { headers: this.#headers });\n const response = await this.#transport.fetch(request);\n const body = await parseJSONBody<FanboxEnvelope<T>>(response);\n if (!response.ok) {\n throw new FanboxApiError(response, body);\n }\n\n return body.body;\n }\n}\n\nasync function parseJSONBody<T>(response: Response): Promise<T> {\n const text = await response.text();\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n}\n"],"mappings":"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","names":["index_exports","__export","FanboxApiError","FanboxClient","__toCommonJS","import_node_http2","_pools","_sessionsPerOrigin","_Http2SessionManager_instances","createPool_fn","createSession_fn","Http2SessionManager","sessionsPerOrigin","__privateAdd","__privateSet","sessions","__privateGet","pool","closeHttp2Session","url","origin","__privateMethod","session","cleanup","index","resolve","HTTP2_HEADER_STATUS","Http2Error","message","_pool","Http2Transport","options","__privateAdd","__privateSet","Http2SessionManager","input","request","headers","attachHttp2Headers","stream","__privateGet","resolve","reject","settled","responseHeaders","createResponseHeaders","parseStatus","url","result","key","value","item","status","getCreator","params","paginateCreatorPosts","params","listCreatorPlans","params","listCreatorPosts","params","getPost","params","listHomePosts","params","listSupportingPosts","params","listFollowingCreators","listSupportingPlans","DEFAULT_BASE_URL","FanboxApiError","response","body","_baseUrl","_headers","_transport","FanboxClient","options","getCreator","getPost","listCreatorPlans","listCreatorPosts","listFollowingCreators","listHomePosts","listSupportingPlans","listSupportingPosts","paginateCreatorPosts","__privateAdd","__privateSet","Http2Transport","path","query","url","__privateGet","key","value","request","parseJSONBody","text"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/transport/http2-session.ts","../../src/transport/http2.ts","../../src/client/endpoints/creator-get.ts","../../src/client/endpoints/creator-list-pages.ts","../../src/client/endpoints/creator-list-plans.ts","../../src/client/endpoints/creator-list-posts.ts","../../src/client/endpoints/post-info.ts","../../src/client/endpoints/post-list-home.ts","../../src/client/endpoints/post-list-supporting.ts","../../src/client/endpoints/user-list-following.ts","../../src/client/endpoints/user-list-supporting.ts","../../src/client/client.ts"],"sourcesContent":["export { FanboxApiError, FanboxClient } from \"./client/client.js\";\nexport type * from \"./client/types.js\";\n","import { type ClientHttp2Session, connect } from \"node:http2\";\n\nexport interface Http2SessionManagerOptions {\n sessionsPerOrigin?: number;\n}\n\ninterface OriginSessionPool {\n nextIndex: number;\n sessions: ClientHttp2Session[];\n}\n\nexport class Http2SessionManager {\n readonly #pools = new Map<string, OriginSessionPool>();\n readonly #sessionsPerOrigin: number;\n\n constructor({ sessionsPerOrigin = 5 }: Http2SessionManagerOptions = {}) {\n this.#sessionsPerOrigin = Math.max(1, Math.floor(sessionsPerOrigin));\n }\n\n async closeAll(): Promise<void> {\n const sessions = [...this.#pools.values()].flatMap((pool) => pool.sessions);\n this.#pools.clear();\n await Promise.all(sessions.map(closeHttp2Session));\n }\n\n getSession(url: string): ClientHttp2Session {\n const origin = new URL(url).origin;\n const pool = this.#pools.get(origin) ?? this.#createPool(origin);\n\n if (pool.sessions.length < this.#sessionsPerOrigin) {\n const session = this.#createSession(origin);\n pool.sessions.push(session);\n return session;\n }\n\n const session = pool.sessions[pool.nextIndex % pool.sessions.length];\n pool.nextIndex = (pool.nextIndex + 1) % pool.sessions.length;\n\n return session;\n }\n\n #createPool(origin: string): OriginSessionPool {\n const pool = { nextIndex: 0, sessions: [] };\n this.#pools.set(origin, pool);\n return pool;\n }\n\n #createSession(origin: string) {\n const session = connect(origin);\n\n const cleanup = () => {\n const pool = this.#pools.get(origin);\n if (!pool) return;\n\n const index = pool.sessions.indexOf(session);\n if (index >= 0) {\n pool.sessions.splice(index, 1);\n pool.nextIndex = Math.min(pool.nextIndex, pool.sessions.length);\n }\n\n if (pool.sessions.length === 0) {\n this.#pools.delete(origin);\n }\n };\n session.once(\"close\", cleanup);\n session.once(\"error\", cleanup);\n\n return session;\n }\n}\n\nfunction closeHttp2Session(session: ClientHttp2Session): Promise<void> {\n if (session.closed || session.destroyed) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n session.close(resolve);\n });\n}\n","import {\n Http2SessionManager,\n type Http2SessionManagerOptions,\n} from \"./http2-session.js\";\n\nconst HTTP2_HEADER_STATUS = \":status\";\n\nexport interface HttpTransport {\n fetch(input: Request | string | URL): Promise<Response>;\n}\n\nexport class Http2Error extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"Http2Error\";\n }\n}\n\nexport class Http2Transport {\n readonly #pool: Http2SessionManager;\n\n constructor(options: Http2SessionManagerOptions = {}) {\n this.#pool = new Http2SessionManager(options);\n }\n\n fetch(input: Request | string | URL) {\n const request = input instanceof Request ? input : new Request(input);\n const headers = attachHttp2Headers(request);\n\n const session = this.#pool.getSession(request.url);\n const stream = session.request(headers, { endStream: !request.body });\n\n return new Promise<Response>((resolve, reject) => {\n let settled = false;\n stream.once(\"error\", reject);\n stream.once(\"close\", () => {\n if (!settled) {\n reject(new Http2Error(`HTTP/2 stream closed before response`));\n }\n });\n\n stream.once(\"response\", (responseHeaders) => {\n settled = true;\n resolve(\n new Response(stream, {\n headers: createResponseHeaders(responseHeaders),\n status: parseStatus(responseHeaders[HTTP2_HEADER_STATUS]),\n }),\n );\n });\n\n // If the request has a body, write it to the stream. If writing fails, destroy the stream to trigger error handling.\n if (request.body) stream.end(request.body);\n });\n }\n}\n\nfunction attachHttp2Headers(request: Request) {\n const url = new URL(request.url);\n const headers = { ...Object.fromEntries(request.headers) };\n\n headers[\":authority\"] = url.host;\n headers[\":method\"] = request.method.toUpperCase();\n headers[\":path\"] = `${url.pathname}${url.search}`;\n headers[\":scheme\"] = url.protocol.slice(0, -1);\n\n return headers;\n}\n\nfunction createResponseHeaders(\n headers: Record<string, string | string[] | undefined>,\n): Headers {\n const result = new Headers();\n for (const [key, value] of Object.entries(headers)) {\n if (\n // ignore HTTP/2 pseudo-headers in the response\n key.startsWith(\":\") ||\n value === undefined\n )\n continue;\n\n if (Array.isArray(value)) {\n for (const item of value) {\n result.append(key, item);\n }\n } else {\n result.set(key, value);\n }\n }\n\n return result;\n}\n\nfunction parseStatus(status: number | string | string[] | undefined): number {\n if (typeof status === \"number\") {\n return status;\n }\n if (Array.isArray(status)) {\n return Number(status[0] ?? 0);\n }\n\n return Number(status ?? 0);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { Creator } from \"../models/creator.js\";\n\nexport interface GetCreatorParams {\n creatorId: string;\n}\n\nexport type GetCreatorResult = Creator;\n\n/**\n * Get detailed information about a specific creator.\n */\nexport async function getCreator(\n this: FanboxClient,\n params: GetCreatorParams,\n): Promise<GetCreatorResult> {\n return this.get(\"creator.get\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostSort } from \"../models/post.js\";\n\nexport interface PaginateCreatorPostsParams {\n creatorId: string;\n sort?: PostSort;\n}\n\nexport type PaginateCreatorPostsResult = string[];\n\n/**\n * List all urls to the pages, which paginated by the given conditions.\n */\nexport async function paginateCreatorPosts(\n this: FanboxClient,\n params: PaginateCreatorPostsParams,\n): Promise<PaginateCreatorPostsResult> {\n return this.get(\"post.paginateCreator\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { Plan } from \"../models/plan.js\";\n\nexport interface ListCreatorPlansParams {\n creatorId: string;\n}\n\nexport type ListCreatorPlansResult = Plan[];\n\n/**\n * List plans for a specific creator.\n */\nexport async function listCreatorPlans(\n this: FanboxClient,\n params: ListCreatorPlansParams,\n): Promise<ListCreatorPlansResult> {\n return this.get(\"plan.listCreator\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostListParams, PostSort, PostSummary } from \"../models/post.js\";\n\nexport interface ListCreatorPostsParams extends PostListParams {\n creatorId: string;\n firstId?: string;\n firstPublishedDatetime?: string;\n sort?: PostSort;\n}\n\nexport interface ListCreatorPostsResult {\n posts: PostSummary[];\n}\n\n/**\n * List posts for a specific creator.\n */\nexport async function listCreatorPosts(\n this: FanboxClient,\n params: ListCreatorPostsParams,\n): Promise<ListCreatorPostsResult> {\n return this.get(\"post.listCreator\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { Post } from \"../models/post.js\";\n\nexport interface GetPostParams {\n postId: string;\n}\n\nexport interface GetPostResult {\n post: Post;\n}\n\n/**\n * Get detailed information about a specific post.\n */\nexport async function getPost(\n this: FanboxClient,\n params: GetPostParams,\n): Promise<GetPostResult> {\n return this.get(\"post.info\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostListParams, PostSummary } from \"../models/post.js\";\n\nexport type ListHomePostsParams = PostListParams;\n\nexport type ListHomePostsResult = PostSummary[];\n\n/**\n * List all posts from the home feed from both following and supporting\n * creators. This endpoint is only available to logged-in users.\n */\nexport async function listHomePosts(\n this: FanboxClient,\n params: ListHomePostsParams = {},\n): Promise<ListHomePostsResult> {\n return this.get(\"post.listHome\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostListParams, PostSummary } from \"../models/post.js\";\n\nexport type ListSupportingPostsParams = PostListParams;\n\nexport type ListSupportingPostsResult = PostSummary[];\n\n/**\n * List all posts from the home feed from supporting creators only. This\n * endpoint is only available to logged-in users.\n */\nexport async function listSupportingPosts(\n this: FanboxClient,\n params: ListSupportingPostsParams = {},\n): Promise<ListSupportingPostsResult> {\n return this.get(\"post.listSupporting\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { CreatorSummary } from \"../models/creator.js\";\n\nexport interface ListFollowingCreatorsResult {\n creators: CreatorSummary[];\n}\n\n/**\n * List creators that the authenticated user is following.\n */\nexport async function listFollowingCreators(\n this: FanboxClient,\n): Promise<ListFollowingCreatorsResult> {\n return this.get(\"creator.listFollowing\");\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { SupportingPlan } from \"../models/plan.js\";\n\nexport interface ListSupportingPlansResult {\n plans: SupportingPlan[];\n}\n\n/**\n * List plans that the authenticated user is supporting.\n */\nexport async function listSupportingPlans(\n this: FanboxClient,\n): Promise<ListSupportingPlansResult> {\n return this.get(\"plan.listSupporting\");\n}\n","import { Http2Transport, type HttpTransport } from \"../transport/http2.js\";\nimport { getCreator } from \"./endpoints/creator-get.js\";\nimport { paginateCreatorPosts } from \"./endpoints/creator-list-pages.js\";\nimport { listCreatorPlans } from \"./endpoints/creator-list-plans.js\";\nimport { listCreatorPosts } from \"./endpoints/creator-list-posts.js\";\nimport { getPost } from \"./endpoints/post-info.js\";\nimport { listHomePosts } from \"./endpoints/post-list-home.js\";\nimport { listSupportingPosts } from \"./endpoints/post-list-supporting.js\";\nimport { listFollowingCreators } from \"./endpoints/user-list-following.js\";\nimport { listSupportingPlans } from \"./endpoints/user-list-supporting.js\";\nimport type { FanboxEnvelope } from \"./fanbox-envelope.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.fanbox.cc\";\n\nexport interface FanboxClientOptions {\n baseUrl?: string;\n headers?: Record<string, string>;\n transport?: HttpTransport;\n}\n\nexport class FanboxApiError extends Error {\n public readonly body: unknown;\n public readonly status: number;\n public readonly statusText: string;\n\n public constructor(response: Response, body: unknown) {\n super(\n `FANBOX API request failed: ${response.status} ${response.statusText}`,\n );\n this.name = \"FanboxApiError\";\n this.body = body;\n this.status = response.status;\n this.statusText = response.statusText;\n }\n}\n\nexport class FanboxClient {\n getCreator = getCreator;\n getPost = getPost;\n listCreatorPlans = listCreatorPlans;\n listCreatorPosts = listCreatorPosts;\n listFollowingCreators = listFollowingCreators;\n listHomePosts = listHomePosts;\n listSupportingPlans = listSupportingPlans;\n listSupportingPosts = listSupportingPosts;\n paginateCreatorPosts = paginateCreatorPosts;\n\n readonly #baseUrl: string;\n readonly #headers: Record<string, string>;\n readonly #transport: HttpTransport;\n\n public constructor(options: FanboxClientOptions = {}) {\n this.#baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.#headers = options.headers ?? {};\n this.#transport = options.transport ?? new Http2Transport();\n }\n\n protected async get<T>(path: string, query: object = {}): Promise<T> {\n const url = new URL(\n path,\n this.#baseUrl.endsWith(\"/\") ? this.#baseUrl : `${this.#baseUrl}/`,\n );\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const request = new Request(url, { headers: this.#headers });\n const response = await this.#transport.fetch(request);\n const body = await parseJSONBody<FanboxEnvelope<T>>(response);\n if (!response.ok) {\n throw new FanboxApiError(response, body);\n }\n\n return body.body;\n }\n}\n\nasync function parseJSONBody<T>(response: Response): Promise<T> {\n const text = await response.text();\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n}\n"],"mappings":"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","names":["index_exports","__export","FanboxApiError","FanboxClient","__toCommonJS","import_node_http2","_pools","_sessionsPerOrigin","_Http2SessionManager_instances","createPool_fn","createSession_fn","Http2SessionManager","sessionsPerOrigin","__privateAdd","__privateSet","sessions","__privateGet","pool","closeHttp2Session","url","origin","__privateMethod","session","cleanup","index","resolve","HTTP2_HEADER_STATUS","Http2Error","message","_pool","Http2Transport","options","__privateAdd","__privateSet","Http2SessionManager","input","request","headers","attachHttp2Headers","stream","__privateGet","resolve","reject","settled","responseHeaders","createResponseHeaders","parseStatus","url","result","key","value","item","status","getCreator","params","paginateCreatorPosts","params","listCreatorPlans","params","listCreatorPosts","params","getPost","params","listHomePosts","params","listSupportingPosts","params","listFollowingCreators","listSupportingPlans","DEFAULT_BASE_URL","FanboxApiError","response","body","_baseUrl","_headers","_transport","FanboxClient","options","getCreator","getPost","listCreatorPlans","listCreatorPosts","listFollowingCreators","listHomePosts","listSupportingPlans","listSupportingPosts","paginateCreatorPosts","__privateAdd","__privateSet","Http2Transport","path","query","url","__privateGet","key","value","request","parseJSONBody","text"]}
|
package/dist/bundle/index.d.cts
CHANGED
|
@@ -257,7 +257,9 @@ interface ListCreatorPostsParams extends PostListParams {
|
|
|
257
257
|
firstPublishedDatetime?: string;
|
|
258
258
|
sort?: PostSort;
|
|
259
259
|
}
|
|
260
|
-
|
|
260
|
+
interface ListCreatorPostsResult {
|
|
261
|
+
posts: PostSummary[];
|
|
262
|
+
}
|
|
261
263
|
declare function listCreatorPosts(this: FanboxClient, params: ListCreatorPostsParams): Promise<ListCreatorPostsResult>;
|
|
262
264
|
|
|
263
265
|
interface GetPostParams {
|
package/dist/bundle/index.d.ts
CHANGED
|
@@ -257,7 +257,9 @@ interface ListCreatorPostsParams extends PostListParams {
|
|
|
257
257
|
firstPublishedDatetime?: string;
|
|
258
258
|
sort?: PostSort;
|
|
259
259
|
}
|
|
260
|
-
|
|
260
|
+
interface ListCreatorPostsResult {
|
|
261
|
+
posts: PostSummary[];
|
|
262
|
+
}
|
|
261
263
|
declare function listCreatorPosts(this: FanboxClient, params: ListCreatorPostsParams): Promise<ListCreatorPostsResult>;
|
|
262
264
|
|
|
263
265
|
interface GetPostParams {
|
package/dist/bundle/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/transport/http2-session.ts","../../src/transport/http2.ts","../../src/client/endpoints/creator-get.ts","../../src/client/endpoints/creator-list-pages.ts","../../src/client/endpoints/creator-list-plans.ts","../../src/client/endpoints/creator-list-posts.ts","../../src/client/endpoints/post-info.ts","../../src/client/endpoints/post-list-home.ts","../../src/client/endpoints/post-list-supporting.ts","../../src/client/endpoints/user-list-following.ts","../../src/client/endpoints/user-list-supporting.ts","../../src/client/client.ts"],"sourcesContent":["import { type ClientHttp2Session, connect } from \"node:http2\";\n\nexport interface Http2SessionManagerOptions {\n sessionsPerOrigin?: number;\n}\n\ninterface OriginSessionPool {\n nextIndex: number;\n sessions: ClientHttp2Session[];\n}\n\nexport class Http2SessionManager {\n readonly #pools = new Map<string, OriginSessionPool>();\n readonly #sessionsPerOrigin: number;\n\n constructor({ sessionsPerOrigin = 5 }: Http2SessionManagerOptions = {}) {\n this.#sessionsPerOrigin = Math.max(1, Math.floor(sessionsPerOrigin));\n }\n\n async closeAll(): Promise<void> {\n const sessions = [...this.#pools.values()].flatMap((pool) => pool.sessions);\n this.#pools.clear();\n await Promise.all(sessions.map(closeHttp2Session));\n }\n\n getSession(url: string): ClientHttp2Session {\n const origin = new URL(url).origin;\n const pool = this.#pools.get(origin) ?? this.#createPool(origin);\n\n if (pool.sessions.length < this.#sessionsPerOrigin) {\n const session = this.#createSession(origin);\n pool.sessions.push(session);\n return session;\n }\n\n const session = pool.sessions[pool.nextIndex % pool.sessions.length];\n pool.nextIndex = (pool.nextIndex + 1) % pool.sessions.length;\n\n return session;\n }\n\n #createPool(origin: string): OriginSessionPool {\n const pool = { nextIndex: 0, sessions: [] };\n this.#pools.set(origin, pool);\n return pool;\n }\n\n #createSession(origin: string) {\n const session = connect(origin);\n\n const cleanup = () => {\n const pool = this.#pools.get(origin);\n if (!pool) return;\n\n const index = pool.sessions.indexOf(session);\n if (index >= 0) {\n pool.sessions.splice(index, 1);\n pool.nextIndex = Math.min(pool.nextIndex, pool.sessions.length);\n }\n\n if (pool.sessions.length === 0) {\n this.#pools.delete(origin);\n }\n };\n session.once(\"close\", cleanup);\n session.once(\"error\", cleanup);\n\n return session;\n }\n}\n\nfunction closeHttp2Session(session: ClientHttp2Session): Promise<void> {\n if (session.closed || session.destroyed) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n session.close(resolve);\n });\n}\n","import {\n Http2SessionManager,\n type Http2SessionManagerOptions,\n} from \"./http2-session.js\";\n\nconst HTTP2_HEADER_STATUS = \":status\";\n\nexport interface HttpTransport {\n fetch(input: Request | string | URL): Promise<Response>;\n}\n\nexport class Http2Error extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"Http2Error\";\n }\n}\n\nexport class Http2Transport {\n readonly #pool: Http2SessionManager;\n\n constructor(options: Http2SessionManagerOptions = {}) {\n this.#pool = new Http2SessionManager(options);\n }\n\n fetch(input: Request | string | URL) {\n const request = input instanceof Request ? input : new Request(input);\n const headers = attachHttp2Headers(request);\n\n const session = this.#pool.getSession(request.url);\n const stream = session.request(headers, { endStream: !request.body });\n\n return new Promise<Response>((resolve, reject) => {\n let settled = false;\n stream.once(\"error\", reject);\n stream.once(\"close\", () => {\n if (!settled) {\n reject(new Http2Error(`HTTP/2 stream closed before response`));\n }\n });\n\n stream.once(\"response\", (responseHeaders) => {\n settled = true;\n resolve(\n new Response(stream, {\n headers: createResponseHeaders(responseHeaders),\n status: parseStatus(responseHeaders[HTTP2_HEADER_STATUS]),\n }),\n );\n });\n\n // If the request has a body, write it to the stream. If writing fails, destroy the stream to trigger error handling.\n if (request.body) stream.end(request.body);\n });\n }\n}\n\nfunction attachHttp2Headers(request: Request) {\n const url = new URL(request.url);\n const headers = { ...Object.fromEntries(request.headers) };\n\n headers[\":authority\"] = url.host;\n headers[\":method\"] = request.method.toUpperCase();\n headers[\":path\"] = `${url.pathname}${url.search}`;\n headers[\":scheme\"] = url.protocol.slice(0, -1);\n\n return headers;\n}\n\nfunction createResponseHeaders(\n headers: Record<string, string | string[] | undefined>,\n): Headers {\n const result = new Headers();\n for (const [key, value] of Object.entries(headers)) {\n if (\n // ignore HTTP/2 pseudo-headers in the response\n key.startsWith(\":\") ||\n value === undefined\n )\n continue;\n\n if (Array.isArray(value)) {\n for (const item of value) {\n result.append(key, item);\n }\n } else {\n result.set(key, value);\n }\n }\n\n return result;\n}\n\nfunction parseStatus(status: number | string | string[] | undefined): number {\n if (typeof status === \"number\") {\n return status;\n }\n if (Array.isArray(status)) {\n return Number(status[0] ?? 0);\n }\n\n return Number(status ?? 0);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { Creator } from \"../models/creator.js\";\n\nexport interface GetCreatorParams {\n creatorId: string;\n}\n\nexport type GetCreatorResult = Creator;\n\n/**\n * Get detailed information about a specific creator.\n */\nexport async function getCreator(\n this: FanboxClient,\n params: GetCreatorParams,\n): Promise<GetCreatorResult> {\n return this.get(\"creator.get\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostSort } from \"../models/post.js\";\n\nexport interface PaginateCreatorPostsParams {\n creatorId: string;\n sort?: PostSort;\n}\n\nexport type PaginateCreatorPostsResult = string[];\n\n/**\n * List all urls to the pages, which paginated by the given conditions.\n */\nexport async function paginateCreatorPosts(\n this: FanboxClient,\n params: PaginateCreatorPostsParams,\n): Promise<PaginateCreatorPostsResult> {\n return this.get(\"post.paginateCreator\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { Plan } from \"../models/plan.js\";\n\nexport interface ListCreatorPlansParams {\n creatorId: string;\n}\n\nexport type ListCreatorPlansResult = Plan[];\n\n/**\n * List plans for a specific creator.\n */\nexport async function listCreatorPlans(\n this: FanboxClient,\n params: ListCreatorPlansParams,\n): Promise<ListCreatorPlansResult> {\n return this.get(\"plan.listCreator\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostListParams, PostSort, PostSummary } from \"../models/post.js\";\n\nexport interface ListCreatorPostsParams extends PostListParams {\n creatorId: string;\n firstId?: string;\n firstPublishedDatetime?: string;\n sort?: PostSort;\n}\n\nexport type ListCreatorPostsResult = PostSummary[];\n\n/**\n * List posts for a specific creator.\n */\nexport async function listCreatorPosts(\n this: FanboxClient,\n params: ListCreatorPostsParams,\n): Promise<ListCreatorPostsResult> {\n return this.get(\"post.listCreator\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { Post } from \"../models/post.js\";\n\nexport interface GetPostParams {\n postId: string;\n}\n\nexport interface GetPostResult {\n post: Post;\n}\n\n/**\n * Get detailed information about a specific post.\n */\nexport async function getPost(\n this: FanboxClient,\n params: GetPostParams,\n): Promise<GetPostResult> {\n return this.get(\"post.info\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostListParams, PostSummary } from \"../models/post.js\";\n\nexport type ListHomePostsParams = PostListParams;\n\nexport type ListHomePostsResult = PostSummary[];\n\n/**\n * List all posts from the home feed from both following and supporting\n * creators. This endpoint is only available to logged-in users.\n */\nexport async function listHomePosts(\n this: FanboxClient,\n params: ListHomePostsParams = {},\n): Promise<ListHomePostsResult> {\n return this.get(\"post.listHome\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostListParams, PostSummary } from \"../models/post.js\";\n\nexport type ListSupportingPostsParams = PostListParams;\n\nexport type ListSupportingPostsResult = PostSummary[];\n\n/**\n * List all posts from the home feed from supporting creators only. This\n * endpoint is only available to logged-in users.\n */\nexport async function listSupportingPosts(\n this: FanboxClient,\n params: ListSupportingPostsParams = {},\n): Promise<ListSupportingPostsResult> {\n return this.get(\"post.listSupporting\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { CreatorSummary } from \"../models/creator.js\";\n\nexport interface ListFollowingCreatorsResult {\n creators: CreatorSummary[];\n}\n\n/**\n * List creators that the authenticated user is following.\n */\nexport async function listFollowingCreators(\n this: FanboxClient,\n): Promise<ListFollowingCreatorsResult> {\n return this.get(\"creator.listFollowing\");\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { SupportingPlan } from \"../models/plan.js\";\n\nexport interface ListSupportingPlansResult {\n plans: SupportingPlan[];\n}\n\n/**\n * List plans that the authenticated user is supporting.\n */\nexport async function listSupportingPlans(\n this: FanboxClient,\n): Promise<ListSupportingPlansResult> {\n return this.get(\"plan.listSupporting\");\n}\n","import { Http2Transport, type HttpTransport } from \"../transport/http2.js\";\nimport { getCreator } from \"./endpoints/creator-get.js\";\nimport { paginateCreatorPosts } from \"./endpoints/creator-list-pages.js\";\nimport { listCreatorPlans } from \"./endpoints/creator-list-plans.js\";\nimport { listCreatorPosts } from \"./endpoints/creator-list-posts.js\";\nimport { getPost } from \"./endpoints/post-info.js\";\nimport { listHomePosts } from \"./endpoints/post-list-home.js\";\nimport { listSupportingPosts } from \"./endpoints/post-list-supporting.js\";\nimport { listFollowingCreators } from \"./endpoints/user-list-following.js\";\nimport { listSupportingPlans } from \"./endpoints/user-list-supporting.js\";\nimport type { FanboxEnvelope } from \"./fanbox-envelope.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.fanbox.cc\";\n\nexport interface FanboxClientOptions {\n baseUrl?: string;\n headers?: Record<string, string>;\n transport?: HttpTransport;\n}\n\nexport class FanboxApiError extends Error {\n public readonly body: unknown;\n public readonly status: number;\n public readonly statusText: string;\n\n public constructor(response: Response, body: unknown) {\n super(\n `FANBOX API request failed: ${response.status} ${response.statusText}`,\n );\n this.name = \"FanboxApiError\";\n this.body = body;\n this.status = response.status;\n this.statusText = response.statusText;\n }\n}\n\nexport class FanboxClient {\n getCreator = getCreator;\n getPost = getPost;\n listCreatorPlans = listCreatorPlans;\n listCreatorPosts = listCreatorPosts;\n listFollowingCreators = listFollowingCreators;\n listHomePosts = listHomePosts;\n listSupportingPlans = listSupportingPlans;\n listSupportingPosts = listSupportingPosts;\n paginateCreatorPosts = paginateCreatorPosts;\n\n readonly #baseUrl: string;\n readonly #headers: Record<string, string>;\n readonly #transport: HttpTransport;\n\n public constructor(options: FanboxClientOptions = {}) {\n this.#baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.#headers = options.headers ?? {};\n this.#transport = options.transport ?? new Http2Transport();\n }\n\n protected async get<T>(path: string, query: object = {}): Promise<T> {\n const url = new URL(\n path,\n this.#baseUrl.endsWith(\"/\") ? this.#baseUrl : `${this.#baseUrl}/`,\n );\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const request = new Request(url, { headers: this.#headers });\n const response = await this.#transport.fetch(request);\n const body = await parseJSONBody<FanboxEnvelope<T>>(response);\n if (!response.ok) {\n throw new FanboxApiError(response, body);\n }\n\n return body.body;\n }\n}\n\nasync function parseJSONBody<T>(response: Response): Promise<T> {\n const text = await response.text();\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n}\n"],"mappings":"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","names":["connect","_pools","_sessionsPerOrigin","_Http2SessionManager_instances","createPool_fn","createSession_fn","Http2SessionManager","sessionsPerOrigin","__privateAdd","__privateSet","sessions","__privateGet","pool","closeHttp2Session","url","origin","__privateMethod","session","connect","cleanup","index","resolve","HTTP2_HEADER_STATUS","Http2Error","message","_pool","Http2Transport","options","__privateAdd","__privateSet","Http2SessionManager","input","request","headers","attachHttp2Headers","stream","__privateGet","resolve","reject","settled","responseHeaders","createResponseHeaders","parseStatus","url","result","key","value","item","status","getCreator","params","paginateCreatorPosts","params","listCreatorPlans","params","listCreatorPosts","params","getPost","params","listHomePosts","params","listSupportingPosts","params","listFollowingCreators","listSupportingPlans","DEFAULT_BASE_URL","FanboxApiError","response","body","_baseUrl","_headers","_transport","FanboxClient","options","getCreator","getPost","listCreatorPlans","listCreatorPosts","listFollowingCreators","listHomePosts","listSupportingPlans","listSupportingPosts","paginateCreatorPosts","__privateAdd","__privateSet","Http2Transport","path","query","url","__privateGet","key","value","request","parseJSONBody","text"]}
|
|
1
|
+
{"version":3,"sources":["../../src/transport/http2-session.ts","../../src/transport/http2.ts","../../src/client/endpoints/creator-get.ts","../../src/client/endpoints/creator-list-pages.ts","../../src/client/endpoints/creator-list-plans.ts","../../src/client/endpoints/creator-list-posts.ts","../../src/client/endpoints/post-info.ts","../../src/client/endpoints/post-list-home.ts","../../src/client/endpoints/post-list-supporting.ts","../../src/client/endpoints/user-list-following.ts","../../src/client/endpoints/user-list-supporting.ts","../../src/client/client.ts"],"sourcesContent":["import { type ClientHttp2Session, connect } from \"node:http2\";\n\nexport interface Http2SessionManagerOptions {\n sessionsPerOrigin?: number;\n}\n\ninterface OriginSessionPool {\n nextIndex: number;\n sessions: ClientHttp2Session[];\n}\n\nexport class Http2SessionManager {\n readonly #pools = new Map<string, OriginSessionPool>();\n readonly #sessionsPerOrigin: number;\n\n constructor({ sessionsPerOrigin = 5 }: Http2SessionManagerOptions = {}) {\n this.#sessionsPerOrigin = Math.max(1, Math.floor(sessionsPerOrigin));\n }\n\n async closeAll(): Promise<void> {\n const sessions = [...this.#pools.values()].flatMap((pool) => pool.sessions);\n this.#pools.clear();\n await Promise.all(sessions.map(closeHttp2Session));\n }\n\n getSession(url: string): ClientHttp2Session {\n const origin = new URL(url).origin;\n const pool = this.#pools.get(origin) ?? this.#createPool(origin);\n\n if (pool.sessions.length < this.#sessionsPerOrigin) {\n const session = this.#createSession(origin);\n pool.sessions.push(session);\n return session;\n }\n\n const session = pool.sessions[pool.nextIndex % pool.sessions.length];\n pool.nextIndex = (pool.nextIndex + 1) % pool.sessions.length;\n\n return session;\n }\n\n #createPool(origin: string): OriginSessionPool {\n const pool = { nextIndex: 0, sessions: [] };\n this.#pools.set(origin, pool);\n return pool;\n }\n\n #createSession(origin: string) {\n const session = connect(origin);\n\n const cleanup = () => {\n const pool = this.#pools.get(origin);\n if (!pool) return;\n\n const index = pool.sessions.indexOf(session);\n if (index >= 0) {\n pool.sessions.splice(index, 1);\n pool.nextIndex = Math.min(pool.nextIndex, pool.sessions.length);\n }\n\n if (pool.sessions.length === 0) {\n this.#pools.delete(origin);\n }\n };\n session.once(\"close\", cleanup);\n session.once(\"error\", cleanup);\n\n return session;\n }\n}\n\nfunction closeHttp2Session(session: ClientHttp2Session): Promise<void> {\n if (session.closed || session.destroyed) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n session.close(resolve);\n });\n}\n","import {\n Http2SessionManager,\n type Http2SessionManagerOptions,\n} from \"./http2-session.js\";\n\nconst HTTP2_HEADER_STATUS = \":status\";\n\nexport interface HttpTransport {\n fetch(input: Request | string | URL): Promise<Response>;\n}\n\nexport class Http2Error extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"Http2Error\";\n }\n}\n\nexport class Http2Transport {\n readonly #pool: Http2SessionManager;\n\n constructor(options: Http2SessionManagerOptions = {}) {\n this.#pool = new Http2SessionManager(options);\n }\n\n fetch(input: Request | string | URL) {\n const request = input instanceof Request ? input : new Request(input);\n const headers = attachHttp2Headers(request);\n\n const session = this.#pool.getSession(request.url);\n const stream = session.request(headers, { endStream: !request.body });\n\n return new Promise<Response>((resolve, reject) => {\n let settled = false;\n stream.once(\"error\", reject);\n stream.once(\"close\", () => {\n if (!settled) {\n reject(new Http2Error(`HTTP/2 stream closed before response`));\n }\n });\n\n stream.once(\"response\", (responseHeaders) => {\n settled = true;\n resolve(\n new Response(stream, {\n headers: createResponseHeaders(responseHeaders),\n status: parseStatus(responseHeaders[HTTP2_HEADER_STATUS]),\n }),\n );\n });\n\n // If the request has a body, write it to the stream. If writing fails, destroy the stream to trigger error handling.\n if (request.body) stream.end(request.body);\n });\n }\n}\n\nfunction attachHttp2Headers(request: Request) {\n const url = new URL(request.url);\n const headers = { ...Object.fromEntries(request.headers) };\n\n headers[\":authority\"] = url.host;\n headers[\":method\"] = request.method.toUpperCase();\n headers[\":path\"] = `${url.pathname}${url.search}`;\n headers[\":scheme\"] = url.protocol.slice(0, -1);\n\n return headers;\n}\n\nfunction createResponseHeaders(\n headers: Record<string, string | string[] | undefined>,\n): Headers {\n const result = new Headers();\n for (const [key, value] of Object.entries(headers)) {\n if (\n // ignore HTTP/2 pseudo-headers in the response\n key.startsWith(\":\") ||\n value === undefined\n )\n continue;\n\n if (Array.isArray(value)) {\n for (const item of value) {\n result.append(key, item);\n }\n } else {\n result.set(key, value);\n }\n }\n\n return result;\n}\n\nfunction parseStatus(status: number | string | string[] | undefined): number {\n if (typeof status === \"number\") {\n return status;\n }\n if (Array.isArray(status)) {\n return Number(status[0] ?? 0);\n }\n\n return Number(status ?? 0);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { Creator } from \"../models/creator.js\";\n\nexport interface GetCreatorParams {\n creatorId: string;\n}\n\nexport type GetCreatorResult = Creator;\n\n/**\n * Get detailed information about a specific creator.\n */\nexport async function getCreator(\n this: FanboxClient,\n params: GetCreatorParams,\n): Promise<GetCreatorResult> {\n return this.get(\"creator.get\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostSort } from \"../models/post.js\";\n\nexport interface PaginateCreatorPostsParams {\n creatorId: string;\n sort?: PostSort;\n}\n\nexport type PaginateCreatorPostsResult = string[];\n\n/**\n * List all urls to the pages, which paginated by the given conditions.\n */\nexport async function paginateCreatorPosts(\n this: FanboxClient,\n params: PaginateCreatorPostsParams,\n): Promise<PaginateCreatorPostsResult> {\n return this.get(\"post.paginateCreator\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { Plan } from \"../models/plan.js\";\n\nexport interface ListCreatorPlansParams {\n creatorId: string;\n}\n\nexport type ListCreatorPlansResult = Plan[];\n\n/**\n * List plans for a specific creator.\n */\nexport async function listCreatorPlans(\n this: FanboxClient,\n params: ListCreatorPlansParams,\n): Promise<ListCreatorPlansResult> {\n return this.get(\"plan.listCreator\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostListParams, PostSort, PostSummary } from \"../models/post.js\";\n\nexport interface ListCreatorPostsParams extends PostListParams {\n creatorId: string;\n firstId?: string;\n firstPublishedDatetime?: string;\n sort?: PostSort;\n}\n\nexport interface ListCreatorPostsResult {\n posts: PostSummary[];\n}\n\n/**\n * List posts for a specific creator.\n */\nexport async function listCreatorPosts(\n this: FanboxClient,\n params: ListCreatorPostsParams,\n): Promise<ListCreatorPostsResult> {\n return this.get(\"post.listCreator\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { Post } from \"../models/post.js\";\n\nexport interface GetPostParams {\n postId: string;\n}\n\nexport interface GetPostResult {\n post: Post;\n}\n\n/**\n * Get detailed information about a specific post.\n */\nexport async function getPost(\n this: FanboxClient,\n params: GetPostParams,\n): Promise<GetPostResult> {\n return this.get(\"post.info\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostListParams, PostSummary } from \"../models/post.js\";\n\nexport type ListHomePostsParams = PostListParams;\n\nexport type ListHomePostsResult = PostSummary[];\n\n/**\n * List all posts from the home feed from both following and supporting\n * creators. This endpoint is only available to logged-in users.\n */\nexport async function listHomePosts(\n this: FanboxClient,\n params: ListHomePostsParams = {},\n): Promise<ListHomePostsResult> {\n return this.get(\"post.listHome\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { PostListParams, PostSummary } from \"../models/post.js\";\n\nexport type ListSupportingPostsParams = PostListParams;\n\nexport type ListSupportingPostsResult = PostSummary[];\n\n/**\n * List all posts from the home feed from supporting creators only. This\n * endpoint is only available to logged-in users.\n */\nexport async function listSupportingPosts(\n this: FanboxClient,\n params: ListSupportingPostsParams = {},\n): Promise<ListSupportingPostsResult> {\n return this.get(\"post.listSupporting\", params);\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { CreatorSummary } from \"../models/creator.js\";\n\nexport interface ListFollowingCreatorsResult {\n creators: CreatorSummary[];\n}\n\n/**\n * List creators that the authenticated user is following.\n */\nexport async function listFollowingCreators(\n this: FanboxClient,\n): Promise<ListFollowingCreatorsResult> {\n return this.get(\"creator.listFollowing\");\n}\n","import type { FanboxClient } from \"../client.js\";\nimport type { SupportingPlan } from \"../models/plan.js\";\n\nexport interface ListSupportingPlansResult {\n plans: SupportingPlan[];\n}\n\n/**\n * List plans that the authenticated user is supporting.\n */\nexport async function listSupportingPlans(\n this: FanboxClient,\n): Promise<ListSupportingPlansResult> {\n return this.get(\"plan.listSupporting\");\n}\n","import { Http2Transport, type HttpTransport } from \"../transport/http2.js\";\nimport { getCreator } from \"./endpoints/creator-get.js\";\nimport { paginateCreatorPosts } from \"./endpoints/creator-list-pages.js\";\nimport { listCreatorPlans } from \"./endpoints/creator-list-plans.js\";\nimport { listCreatorPosts } from \"./endpoints/creator-list-posts.js\";\nimport { getPost } from \"./endpoints/post-info.js\";\nimport { listHomePosts } from \"./endpoints/post-list-home.js\";\nimport { listSupportingPosts } from \"./endpoints/post-list-supporting.js\";\nimport { listFollowingCreators } from \"./endpoints/user-list-following.js\";\nimport { listSupportingPlans } from \"./endpoints/user-list-supporting.js\";\nimport type { FanboxEnvelope } from \"./fanbox-envelope.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.fanbox.cc\";\n\nexport interface FanboxClientOptions {\n baseUrl?: string;\n headers?: Record<string, string>;\n transport?: HttpTransport;\n}\n\nexport class FanboxApiError extends Error {\n public readonly body: unknown;\n public readonly status: number;\n public readonly statusText: string;\n\n public constructor(response: Response, body: unknown) {\n super(\n `FANBOX API request failed: ${response.status} ${response.statusText}`,\n );\n this.name = \"FanboxApiError\";\n this.body = body;\n this.status = response.status;\n this.statusText = response.statusText;\n }\n}\n\nexport class FanboxClient {\n getCreator = getCreator;\n getPost = getPost;\n listCreatorPlans = listCreatorPlans;\n listCreatorPosts = listCreatorPosts;\n listFollowingCreators = listFollowingCreators;\n listHomePosts = listHomePosts;\n listSupportingPlans = listSupportingPlans;\n listSupportingPosts = listSupportingPosts;\n paginateCreatorPosts = paginateCreatorPosts;\n\n readonly #baseUrl: string;\n readonly #headers: Record<string, string>;\n readonly #transport: HttpTransport;\n\n public constructor(options: FanboxClientOptions = {}) {\n this.#baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.#headers = options.headers ?? {};\n this.#transport = options.transport ?? new Http2Transport();\n }\n\n protected async get<T>(path: string, query: object = {}): Promise<T> {\n const url = new URL(\n path,\n this.#baseUrl.endsWith(\"/\") ? this.#baseUrl : `${this.#baseUrl}/`,\n );\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const request = new Request(url, { headers: this.#headers });\n const response = await this.#transport.fetch(request);\n const body = await parseJSONBody<FanboxEnvelope<T>>(response);\n if (!response.ok) {\n throw new FanboxApiError(response, body);\n }\n\n return body.body;\n }\n}\n\nasync function parseJSONBody<T>(response: Response): Promise<T> {\n const text = await response.text();\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n}\n"],"mappings":"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","names":["connect","_pools","_sessionsPerOrigin","_Http2SessionManager_instances","createPool_fn","createSession_fn","Http2SessionManager","sessionsPerOrigin","__privateAdd","__privateSet","sessions","__privateGet","pool","closeHttp2Session","url","origin","__privateMethod","session","connect","cleanup","index","resolve","HTTP2_HEADER_STATUS","Http2Error","message","_pool","Http2Transport","options","__privateAdd","__privateSet","Http2SessionManager","input","request","headers","attachHttp2Headers","stream","__privateGet","resolve","reject","settled","responseHeaders","createResponseHeaders","parseStatus","url","result","key","value","item","status","getCreator","params","paginateCreatorPosts","params","listCreatorPlans","params","listCreatorPosts","params","getPost","params","listHomePosts","params","listSupportingPosts","params","listFollowingCreators","listSupportingPlans","DEFAULT_BASE_URL","FanboxApiError","response","body","_baseUrl","_headers","_transport","FanboxClient","options","getCreator","getPost","listCreatorPlans","listCreatorPosts","listFollowingCreators","listHomePosts","listSupportingPlans","listSupportingPosts","paginateCreatorPosts","__privateAdd","__privateSet","Http2Transport","path","query","url","__privateGet","key","value","request","parseJSONBody","text"]}
|
|
@@ -6,6 +6,8 @@ export interface ListCreatorPostsParams extends PostListParams {
|
|
|
6
6
|
firstPublishedDatetime?: string;
|
|
7
7
|
sort?: PostSort;
|
|
8
8
|
}
|
|
9
|
-
export
|
|
9
|
+
export interface ListCreatorPostsResult {
|
|
10
|
+
posts: PostSummary[];
|
|
11
|
+
}
|
|
10
12
|
export declare function listCreatorPosts(this: FanboxClient, params: ListCreatorPostsParams): Promise<ListCreatorPostsResult>;
|
|
11
13
|
//# sourceMappingURL=creator-list-posts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"creator-list-posts.d.ts","sourceRoot":"","sources":["../../../../src/client/endpoints/creator-list-posts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/E,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"creator-list-posts.d.ts","sourceRoot":"","sources":["../../../../src/client/endpoints/creator-list-posts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/E,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAKD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,sBAAsB,CAAC,CAEjC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"creator-list-posts.js","sourceRoot":"","sources":["../../../../src/client/endpoints/creator-list-posts.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"creator-list-posts.js","sourceRoot":"","sources":["../../../../src/client/endpoints/creator-list-posts.ts"],"names":[],"mappings":";;AAiBA,4CAKC;AALM,KAAK,UAAU,gBAAgB,CAEpC,MAA8B;IAE9B,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -10,7 +10,7 @@ async function discoverCreatorPosts({ client, logger }, { creatorId, firstId, fi
|
|
|
10
10
|
limit,
|
|
11
11
|
sort: "newest",
|
|
12
12
|
};
|
|
13
|
-
const posts = await client.listCreatorPosts(listCreatorPostsOptions);
|
|
13
|
+
const { posts } = await client.listCreatorPosts(listCreatorPostsOptions);
|
|
14
14
|
logger.debug(`Discovered ${posts.length} posts for creator ${creatorId}`);
|
|
15
15
|
if (posts.length < limit)
|
|
16
16
|
return posts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover-posts.js","sourceRoot":"","sources":["../../../../src/downloader/creator/discover-posts.ts"],"names":[],"mappings":";;AAoBA,oDAqCC;AArCM,KAAK,UAAU,oBAAoB,CACxC,EAAE,MAAM,EAAE,MAAM,EAAoC,EACpD,EACE,SAAS,EACT,OAAO,EACP,sBAAsB,EACtB,KAAK,GAAG,GAAG,GACiB;IAE9B,MAAM,CAAC,KAAK,CACV,mBAAmB,KAAK,eAAe,OAAO,IAAI,OAAO,gBAAgB,SAAS,EAAE,CACrF,CAAC;IACF,MAAM,uBAAuB,GAAG;QAC9B,SAAS;QACT,OAAO;QACP,sBAAsB;QACtB,KAAK;QACL,IAAI,EAAE,QAAQ;KACkB,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"discover-posts.js","sourceRoot":"","sources":["../../../../src/downloader/creator/discover-posts.ts"],"names":[],"mappings":";;AAoBA,oDAqCC;AArCM,KAAK,UAAU,oBAAoB,CACxC,EAAE,MAAM,EAAE,MAAM,EAAoC,EACpD,EACE,SAAS,EACT,OAAO,EACP,sBAAsB,EACtB,KAAK,GAAG,GAAG,GACiB;IAE9B,MAAM,CAAC,KAAK,CACV,mBAAmB,KAAK,eAAe,OAAO,IAAI,OAAO,gBAAgB,SAAS,EAAE,CACrF,CAAC;IACF,MAAM,uBAAuB,GAAG;QAC9B,SAAS;QACT,OAAO;QACP,sBAAsB;QACtB,KAAK;QACL,IAAI,EAAE,QAAQ;KACkB,CAAC;IACnC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;IACzE,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,MAAM,sBAAsB,SAAS,EAAE,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5B,MAAM,OAAO,GAAG,MAAM,oBAAoB,CACxC,EAAE,MAAM,EAAE,MAAM,EAAE,EAClB;QACE,SAAS;QACT,OAAO,EAAE,QAAQ,CAAC,EAAE;QACpB,sBAAsB,EAAE,QAAQ,CAAC,iBAAiB;QAClD,KAAK;KACN,CACF,CAAC;IAEF,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -6,6 +6,8 @@ export interface ListCreatorPostsParams extends PostListParams {
|
|
|
6
6
|
firstPublishedDatetime?: string;
|
|
7
7
|
sort?: PostSort;
|
|
8
8
|
}
|
|
9
|
-
export
|
|
9
|
+
export interface ListCreatorPostsResult {
|
|
10
|
+
posts: PostSummary[];
|
|
11
|
+
}
|
|
10
12
|
export declare function listCreatorPosts(this: FanboxClient, params: ListCreatorPostsParams): Promise<ListCreatorPostsResult>;
|
|
11
13
|
//# sourceMappingURL=creator-list-posts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"creator-list-posts.d.ts","sourceRoot":"","sources":["../../../../src/client/endpoints/creator-list-posts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/E,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"creator-list-posts.d.ts","sourceRoot":"","sources":["../../../../src/client/endpoints/creator-list-posts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/E,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAKD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,sBAAsB,CAAC,CAEjC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"creator-list-posts.js","sourceRoot":"","sources":["../../../../src/client/endpoints/creator-list-posts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"creator-list-posts.js","sourceRoot":"","sources":["../../../../src/client/endpoints/creator-list-posts.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAEpC,MAA8B;IAE9B,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -7,7 +7,7 @@ export async function discoverCreatorPosts({ client, logger }, { creatorId, firs
|
|
|
7
7
|
limit,
|
|
8
8
|
sort: "newest",
|
|
9
9
|
};
|
|
10
|
-
const posts = await client.listCreatorPosts(listCreatorPostsOptions);
|
|
10
|
+
const { posts } = await client.listCreatorPosts(listCreatorPostsOptions);
|
|
11
11
|
logger.debug(`Discovered ${posts.length} posts for creator ${creatorId}`);
|
|
12
12
|
if (posts.length < limit)
|
|
13
13
|
return posts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover-posts.js","sourceRoot":"","sources":["../../../../src/downloader/creator/discover-posts.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAE,MAAM,EAAE,MAAM,EAAoC,EACpD,EACE,SAAS,EACT,OAAO,EACP,sBAAsB,EACtB,KAAK,GAAG,GAAG,GACiB;IAE9B,MAAM,CAAC,KAAK,CACV,mBAAmB,KAAK,eAAe,OAAO,IAAI,OAAO,gBAAgB,SAAS,EAAE,CACrF,CAAC;IACF,MAAM,uBAAuB,GAAG;QAC9B,SAAS;QACT,OAAO;QACP,sBAAsB;QACtB,KAAK;QACL,IAAI,EAAE,QAAQ;KACkB,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"discover-posts.js","sourceRoot":"","sources":["../../../../src/downloader/creator/discover-posts.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAE,MAAM,EAAE,MAAM,EAAoC,EACpD,EACE,SAAS,EACT,OAAO,EACP,sBAAsB,EACtB,KAAK,GAAG,GAAG,GACiB;IAE9B,MAAM,CAAC,KAAK,CACV,mBAAmB,KAAK,eAAe,OAAO,IAAI,OAAO,gBAAgB,SAAS,EAAE,CACrF,CAAC;IACF,MAAM,uBAAuB,GAAG;QAC9B,SAAS;QACT,OAAO;QACP,sBAAsB;QACtB,KAAK;QACL,IAAI,EAAE,QAAQ;KACkB,CAAC;IACnC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;IACzE,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,MAAM,sBAAsB,SAAS,EAAE,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5B,MAAM,OAAO,GAAG,MAAM,oBAAoB,CACxC,EAAE,MAAM,EAAE,MAAM,EAAE,EAClB;QACE,SAAS;QACT,OAAO,EAAE,QAAQ,CAAC,EAAE;QACpB,sBAAsB,EAAE,QAAQ,CAAC,iBAAiB;QAClD,KAAK;KACN,CACF,CAAC;IAEF,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC"}
|