@moontaiworks/fanbox-dl 1.5.0 → 1.5.2
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 +1 -1
- package/dist/bundle/index.cjs.map +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/index.js.map +1 -1
- package/dist/cjs/transport/http2-session.d.ts +4 -0
- package/dist/cjs/transport/http2-session.d.ts.map +1 -1
- package/dist/cjs/transport/http2-session.js +44 -18
- package/dist/cjs/transport/http2-session.js.map +1 -1
- package/dist/cjs/transport/http2.d.ts +2 -0
- package/dist/cjs/transport/http2.d.ts.map +1 -1
- package/dist/cjs/transport/http2.js +9 -2
- package/dist/cjs/transport/http2.js.map +1 -1
- package/dist/cjs/transport/worker.d.ts.map +1 -1
- package/dist/cjs/transport/worker.js +6 -10
- package/dist/cjs/transport/worker.js.map +1 -1
- package/dist/esm/transport/http2-session.d.ts +4 -0
- package/dist/esm/transport/http2-session.d.ts.map +1 -1
- package/dist/esm/transport/http2-session.js +44 -18
- package/dist/esm/transport/http2-session.js.map +1 -1
- package/dist/esm/transport/http2.d.ts +2 -0
- package/dist/esm/transport/http2.d.ts.map +1 -1
- package/dist/esm/transport/http2.js +10 -3
- package/dist/esm/transport/http2.js.map +1 -1
- package/dist/esm/transport/worker.d.ts.map +1 -1
- package/dist/esm/transport/worker.js +6 -10
- package/dist/esm/transport/worker.js.map +1 -1
- package/package.json +1 -1
package/dist/bundle/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var R=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var j=s=>{throw TypeError(s)};var D=(s,t)=>{for(var e in t)R(s,e,{get:t[e],enumerable:!0})},J=(s,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of _(t))!B.call(s,r)&&r!==e&&R(s,r,{get:()=>t[r],enumerable:!(o=$(t,r))||o.enumerable});return s};var W=s=>J(R({},"__esModule",{value:!0}),s);var L=(s,t,e)=>t.has(s)||j("Cannot "+e);var n=(s,t,e)=>(L(s,t,"read from private field"),e?e.call(s):t.get(s)),a=(s,t,e)=>t.has(s)?j("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(s):t.set(s,e),l=(s,t,e,o)=>(L(s,t,"write to private field"),o?o.call(s,e):t.set(s,e),e),F=(s,t,e)=>(L(s,t,"access private method"),e);var tt={};D(tt,{FanboxApiError:()=>g,FanboxClient:()=>S});module.exports=W(tt);var T=require("http2");var p,P,c,O,I,C=class{constructor({sessionsPerOrigin:t=5}={}){a(this,c);a(this,p,new Map);a(this,P);l(this,P,Math.max(1,Math.floor(t)))}async closeAll(){let t=[...n(this,p).values()].flatMap(e=>e.sessions);n(this,p).clear(),await Promise.all(t.map(X))}getSession(t){let e=new URL(t).origin,o=n(this,p).get(e)??F(this,c,O).call(this,e);if(o.sessions.length<n(this,P)){let i=F(this,c,I).call(this,e);return o.sessions.push(i),i}let r=o.sessions[o.nextIndex%o.sessions.length];return o.nextIndex=(o.nextIndex+1)%o.sessions.length,r}};p=new WeakMap,P=new WeakMap,c=new WeakSet,O=function(t){let e={nextIndex:0,sessions:[]};return n(this,p).set(t,e),e},I=function(t){let e=(0,T.connect)(t),o=()=>{let r=n(this,p).get(t);if(!r)return;let i=r.sessions.indexOf(e);i>=0&&(r.sessions.splice(i,1),r.nextIndex=Math.min(r.nextIndex,r.sessions.length)),r.sessions.length===0&&n(this,p).delete(t)};return e.once("close",o),e.once("error",o),e};function X(s){return s.closed||s.destroyed?Promise.resolve():new Promise(t=>{s.close(t)})}var z=":status",H=class extends Error{constructor(t){super(t),this.name="Http2Error"}},f,b=class{constructor(t={}){a(this,f);l(this,f,new C(t))}fetch(t){let e=t instanceof Request?t:new Request(t),o=K(e),i=n(this,f).getSession(e.url).request(o,{endStream:!e.body});return new Promise((y,h)=>{let u=!1;i.once("error",h),i.once("close",()=>{u||h(new H("HTTP/2 stream closed before response"))}),i.once("response",w=>{u=!0,y(new Response(i,{headers:Q(w),status:V(w[z])}))}),e.body&&i.end(e.body)})}};f=new WeakMap;function K(s){let t=new URL(s.url),e={...Object.fromEntries(s.headers)};return e[":authority"]=t.host,e[":method"]=s.method.toUpperCase(),e[":path"]=`${t.pathname}${t.search}`,e[":scheme"]=t.protocol.slice(0,-1),e}function Q(s){let t=new Headers;for(let[e,o]of Object.entries(s))if(!(e.startsWith(":")||o===void 0))if(Array.isArray(o))for(let r of o)t.append(e,r);else t.set(e,o);return t}function V(s){return typeof s=="number"?s:Array.isArray(s)?Number(s[0]??0):Number(s??0)}async function A(s){return this.get("creator.get",s)}async function U(s){return this.get("post.paginateCreator",s)}async function E(s){return this.get("plan.listCreator",s)}async function M(s){return this.get("post.listCreator",s)}async function v(s){return this.get("post.info",s)}async function q(s={}){return this.get("post.listHome",s)}async function G(s={}){return this.get("post.listSupporting",s)}async function k(){return this.get("creator.listFollowing")}async function N(){return this.get("plan.listSupporting")}var Y="https://api.fanbox.cc",g=class extends Error{constructor(t,e){super(`FANBOX API request failed: ${t.status} ${t.statusText}`),this.name="FanboxApiError",this.body=e,this.status=t.status,this.statusText=t.statusText}},m,x,d,S=class{constructor(t={}){this.getCreator=A;this.getPost=v;this.listCreatorPlans=E;this.listCreatorPosts=M;this.listFollowingCreators=k;this.listHomePosts=q;this.listSupportingPlans=N;this.listSupportingPosts=G;this.paginateCreatorPosts=U;a(this,m);a(this,x);a(this,d);l(this,m,t.baseUrl??Y),l(this,x,t.headers??{}),l(this,d,t.transport??new b)}async get(t,e={}){let o=new URL(t,n(this,m).endsWith("/")?n(this,m):`${n(this,m)}/`);for(let[h,u]of Object.entries(e))u!==void 0&&o.searchParams.set(h,String(u));let r=new Request(o,{headers:n(this,x)}),i=await n(this,d).fetch(r),y=await Z(i);if(!i.ok)throw new g(i,y);return y.body}};m=new WeakMap,x=new WeakMap,d=new WeakMap;async function Z(s){let t=await s.text();try{return JSON.parse(t)}catch{return t}}0&&(module.exports={FanboxApiError,FanboxClient});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -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 class Http2SessionManager {\n readonly #sessions = new Map<string, ClientHttp2Session>();\n\n async closeAll(): Promise<void> {\n const sessions = [...this.#sessions.values()];\n this.#sessions.clear();\n await Promise.all(sessions.map(closeHttp2Session));\n }\n\n getSession(url: string): ClientHttp2Session {\n const origin = new URL(url).origin;\n const existing = this.#sessions.get(origin);\n if (existing && !existing.closed && !existing.destroyed) {\n return existing;\n }\n\n // Create a new HTTP/2 session for the origin\n const session = connect(origin);\n this.#sessions.set(origin, session);\n\n const cleanup = () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.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 { Http2SessionManager } 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 = new Http2SessionManager();\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 type GetPostResult = Post;\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 type ListSupportingPlansResult = SupportingPlan[];\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","_sessions","Http2SessionManager","__privateAdd","sessions","__privateGet","closeHttp2Session","url","origin","existing","session","cleanup","resolve","HTTP2_HEADER_STATUS","Http2Error","message","_pool","Http2Transport","__privateAdd","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 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 type GetPostResult = Post;\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 type ListSupportingPlansResult = SupportingPlan[];\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.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var w=s=>{throw TypeError(s)};var S=(s,t,e)=>t.has(s)||w("Cannot "+e);var r=(s,t,e)=>(S(s,t,"read from private field"),e?e.call(s):t.get(s)),a=(s,t,e)=>t.has(s)?w("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(s):t.set(s,e),l=(s,t,e,o)=>(S(s,t,"write to private field"),o?o.call(s,e):t.set(s,e),e),R=(s,t,e)=>(S(s,t,"access private method"),e);import{connect as k}from"http2";var p,P,c,j,T,h=class{constructor({sessionsPerOrigin:t=5}={}){a(this,c);a(this,p,new Map);a(this,P);l(this,P,Math.max(1,Math.floor(t)))}async closeAll(){let t=[...r(this,p).values()].flatMap(e=>e.sessions);r(this,p).clear(),await Promise.all(t.map(N))}getSession(t){let e=new URL(t).origin,o=r(this,p).get(e)??R(this,c,j).call(this,e);if(o.sessions.length<r(this,P)){let n=R(this,c,T).call(this,e);return o.sessions.push(n),n}let i=o.sessions[o.nextIndex%o.sessions.length];return o.nextIndex=(o.nextIndex+1)%o.sessions.length,i}};p=new WeakMap,P=new WeakMap,c=new WeakSet,j=function(t){let e={nextIndex:0,sessions:[]};return r(this,p).set(t,e),e},T=function(t){let e=k(t),o=()=>{let i=r(this,p).get(t);if(!i)return;let n=i.sessions.indexOf(e);n>=0&&(i.sessions.splice(n,1),i.nextIndex=Math.min(i.nextIndex,i.sessions.length)),i.sessions.length===0&&r(this,p).delete(t)};return e.once("close",o),e.once("error",o),e};function N(s){return s.closed||s.destroyed?Promise.resolve():new Promise(t=>{s.close(t)})}var $=":status",L=class extends Error{constructor(t){super(t),this.name="Http2Error"}},f,C=class{constructor(t={}){a(this,f);l(this,f,new h(t))}fetch(t){let e=t instanceof Request?t:new Request(t),o=_(e),n=r(this,f).getSession(e.url).request(o,{endStream:!e.body});return new Promise((d,y)=>{let u=!1;n.once("error",y),n.once("close",()=>{u||y(new L("HTTP/2 stream closed before response"))}),n.once("response",H=>{u=!0,d(new Response(n,{headers:B(H),status:D(H[$])}))}),e.body&&n.end(e.body)})}};f=new WeakMap;function _(s){let t=new URL(s.url),e={...Object.fromEntries(s.headers)};return e[":authority"]=t.host,e[":method"]=s.method.toUpperCase(),e[":path"]=`${t.pathname}${t.search}`,e[":scheme"]=t.protocol.slice(0,-1),e}function B(s){let t=new Headers;for(let[e,o]of Object.entries(s))if(!(e.startsWith(":")||o===void 0))if(Array.isArray(o))for(let i of o)t.append(e,i);else t.set(e,o);return t}function D(s){return typeof s=="number"?s:Array.isArray(s)?Number(s[0]??0):Number(s??0)}async function O(s){return this.get("creator.get",s)}async function I(s){return this.get("post.paginateCreator",s)}async function A(s){return this.get("plan.listCreator",s)}async function U(s){return this.get("post.listCreator",s)}async function E(s){return this.get("post.info",s)}async function M(s={}){return this.get("post.listHome",s)}async function v(s={}){return this.get("post.listSupporting",s)}async function q(){return this.get("creator.listFollowing")}async function G(){return this.get("plan.listSupporting")}var J="https://api.fanbox.cc",b=class extends Error{constructor(t,e){super(`FANBOX API request failed: ${t.status} ${t.statusText}`),this.name="FanboxApiError",this.body=e,this.status=t.status,this.statusText=t.statusText}},m,g,x,F=class{constructor(t={}){this.getCreator=O;this.getPost=E;this.listCreatorPlans=A;this.listCreatorPosts=U;this.listFollowingCreators=q;this.listHomePosts=M;this.listSupportingPlans=G;this.listSupportingPosts=v;this.paginateCreatorPosts=I;a(this,m);a(this,g);a(this,x);l(this,m,t.baseUrl??J),l(this,g,t.headers??{}),l(this,x,t.transport??new C)}async get(t,e={}){let o=new URL(t,r(this,m).endsWith("/")?r(this,m):`${r(this,m)}/`);for(let[y,u]of Object.entries(e))u!==void 0&&o.searchParams.set(y,String(u));let i=new Request(o,{headers:r(this,g)}),n=await r(this,x).fetch(i),d=await W(n);if(!n.ok)throw new b(n,d);return d.body}};m=new WeakMap,g=new WeakMap,x=new WeakMap;async function W(s){let t=await s.text();try{return JSON.parse(t)}catch{return t}}export{b as FanboxApiError,F as FanboxClient};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
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 class Http2SessionManager {\n readonly #sessions = new Map<string, ClientHttp2Session>();\n\n async closeAll(): Promise<void> {\n const sessions = [...this.#sessions.values()];\n this.#sessions.clear();\n await Promise.all(sessions.map(closeHttp2Session));\n }\n\n getSession(url: string): ClientHttp2Session {\n const origin = new URL(url).origin;\n const existing = this.#sessions.get(origin);\n if (existing && !existing.closed && !existing.destroyed) {\n return existing;\n }\n\n // Create a new HTTP/2 session for the origin\n const session = connect(origin);\n this.#sessions.set(origin, session);\n\n const cleanup = () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.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 { Http2SessionManager } 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 = new Http2SessionManager();\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 type GetPostResult = Post;\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 type ListSupportingPlansResult = SupportingPlan[];\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","_sessions","Http2SessionManager","__privateAdd","sessions","__privateGet","closeHttp2Session","url","origin","existing","session","connect","cleanup","resolve","HTTP2_HEADER_STATUS","Http2Error","message","_pool","Http2Transport","__privateAdd","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 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 type GetPostResult = Post;\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 type ListSupportingPlansResult = SupportingPlan[];\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,6 +1,10 @@
|
|
|
1
1
|
import { type ClientHttp2Session } from "node:http2";
|
|
2
|
+
export interface Http2SessionManagerOptions {
|
|
3
|
+
sessionsPerOrigin?: number;
|
|
4
|
+
}
|
|
2
5
|
export declare class Http2SessionManager {
|
|
3
6
|
#private;
|
|
7
|
+
constructor({ sessionsPerOrigin }?: Http2SessionManagerOptions);
|
|
4
8
|
closeAll(): Promise<void>;
|
|
5
9
|
getSession(url: string): ClientHttp2Session;
|
|
6
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http2-session.d.ts","sourceRoot":"","sources":["../../../src/transport/http2-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAW,MAAM,YAAY,CAAC;AAE9D,qBAAa,mBAAmB;;
|
|
1
|
+
{"version":3,"file":"http2-session.d.ts","sourceRoot":"","sources":["../../../src/transport/http2-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAW,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAOD,qBAAa,mBAAmB;;gBAIlB,EAAE,iBAAqB,EAAE,GAAE,0BAA+B;IAIhE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;CA4C5C"}
|
|
@@ -1,42 +1,68 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
2
8
|
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
9
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
12
|
};
|
|
7
|
-
var
|
|
13
|
+
var _Http2SessionManager_instances, _Http2SessionManager_pools, _Http2SessionManager_sessionsPerOrigin, _Http2SessionManager_createPool, _Http2SessionManager_createSession;
|
|
8
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
15
|
exports.Http2SessionManager = void 0;
|
|
10
16
|
const node_http2_1 = require("node:http2");
|
|
11
17
|
class Http2SessionManager {
|
|
12
|
-
constructor() {
|
|
13
|
-
|
|
18
|
+
constructor({ sessionsPerOrigin = 5 } = {}) {
|
|
19
|
+
_Http2SessionManager_instances.add(this);
|
|
20
|
+
_Http2SessionManager_pools.set(this, new Map());
|
|
21
|
+
_Http2SessionManager_sessionsPerOrigin.set(this, void 0);
|
|
22
|
+
__classPrivateFieldSet(this, _Http2SessionManager_sessionsPerOrigin, Math.max(1, Math.floor(sessionsPerOrigin)), "f");
|
|
14
23
|
}
|
|
15
24
|
async closeAll() {
|
|
16
|
-
const sessions = [...__classPrivateFieldGet(this,
|
|
17
|
-
__classPrivateFieldGet(this,
|
|
25
|
+
const sessions = [...__classPrivateFieldGet(this, _Http2SessionManager_pools, "f").values()].flatMap((pool) => pool.sessions);
|
|
26
|
+
__classPrivateFieldGet(this, _Http2SessionManager_pools, "f").clear();
|
|
18
27
|
await Promise.all(sessions.map(closeHttp2Session));
|
|
19
28
|
}
|
|
20
29
|
getSession(url) {
|
|
21
30
|
const origin = new URL(url).origin;
|
|
22
|
-
const
|
|
23
|
-
if (
|
|
24
|
-
|
|
31
|
+
const pool = __classPrivateFieldGet(this, _Http2SessionManager_pools, "f").get(origin) ?? __classPrivateFieldGet(this, _Http2SessionManager_instances, "m", _Http2SessionManager_createPool).call(this, origin);
|
|
32
|
+
if (pool.sessions.length < __classPrivateFieldGet(this, _Http2SessionManager_sessionsPerOrigin, "f")) {
|
|
33
|
+
const session = __classPrivateFieldGet(this, _Http2SessionManager_instances, "m", _Http2SessionManager_createSession).call(this, origin);
|
|
34
|
+
pool.sessions.push(session);
|
|
35
|
+
return session;
|
|
25
36
|
}
|
|
26
|
-
const session =
|
|
27
|
-
|
|
28
|
-
const cleanup = () => {
|
|
29
|
-
if (__classPrivateFieldGet(this, _Http2SessionManager_sessions, "f").get(origin) === session) {
|
|
30
|
-
__classPrivateFieldGet(this, _Http2SessionManager_sessions, "f").delete(origin);
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
session.once("close", cleanup);
|
|
34
|
-
session.once("error", cleanup);
|
|
37
|
+
const session = pool.sessions[pool.nextIndex % pool.sessions.length];
|
|
38
|
+
pool.nextIndex = (pool.nextIndex + 1) % pool.sessions.length;
|
|
35
39
|
return session;
|
|
36
40
|
}
|
|
37
41
|
}
|
|
38
42
|
exports.Http2SessionManager = Http2SessionManager;
|
|
39
|
-
|
|
43
|
+
_Http2SessionManager_pools = new WeakMap(), _Http2SessionManager_sessionsPerOrigin = new WeakMap(), _Http2SessionManager_instances = new WeakSet(), _Http2SessionManager_createPool = function _Http2SessionManager_createPool(origin) {
|
|
44
|
+
const pool = { nextIndex: 0, sessions: [] };
|
|
45
|
+
__classPrivateFieldGet(this, _Http2SessionManager_pools, "f").set(origin, pool);
|
|
46
|
+
return pool;
|
|
47
|
+
}, _Http2SessionManager_createSession = function _Http2SessionManager_createSession(origin) {
|
|
48
|
+
const session = (0, node_http2_1.connect)(origin);
|
|
49
|
+
const cleanup = () => {
|
|
50
|
+
const pool = __classPrivateFieldGet(this, _Http2SessionManager_pools, "f").get(origin);
|
|
51
|
+
if (!pool)
|
|
52
|
+
return;
|
|
53
|
+
const index = pool.sessions.indexOf(session);
|
|
54
|
+
if (index >= 0) {
|
|
55
|
+
pool.sessions.splice(index, 1);
|
|
56
|
+
pool.nextIndex = Math.min(pool.nextIndex, pool.sessions.length);
|
|
57
|
+
}
|
|
58
|
+
if (pool.sessions.length === 0) {
|
|
59
|
+
__classPrivateFieldGet(this, _Http2SessionManager_pools, "f").delete(origin);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
session.once("close", cleanup);
|
|
63
|
+
session.once("error", cleanup);
|
|
64
|
+
return session;
|
|
65
|
+
};
|
|
40
66
|
function closeHttp2Session(session) {
|
|
41
67
|
if (session.closed || session.destroyed) {
|
|
42
68
|
return Promise.resolve();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http2-session.js","sourceRoot":"","sources":["../../../src/transport/http2-session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http2-session.js","sourceRoot":"","sources":["../../../src/transport/http2-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Http2SessionManagerOptions } from "./http2-session.js";
|
|
1
2
|
export interface HttpTransport {
|
|
2
3
|
fetch(input: Request | string | URL): Promise<Response>;
|
|
3
4
|
}
|
|
@@ -6,6 +7,7 @@ export declare class Http2Error extends Error {
|
|
|
6
7
|
}
|
|
7
8
|
export declare class Http2Transport {
|
|
8
9
|
#private;
|
|
10
|
+
constructor(options?: Http2SessionManagerOptions);
|
|
9
11
|
fetch(input: Request | string | URL): Promise<Response>;
|
|
10
12
|
}
|
|
11
13
|
//# sourceMappingURL=http2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http2.d.ts","sourceRoot":"","sources":["../../../src/transport/http2.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http2.d.ts","sourceRoot":"","sources":["../../../src/transport/http2.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,oBAAoB,CAAC;AAI5B,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACzD;AAED,qBAAa,UAAW,SAAQ,KAAK;gBAChB,OAAO,EAAE,MAAM;CAInC;AAED,qBAAa,cAAc;;gBAGb,OAAO,GAAE,0BAA+B;IAIpD,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG;CA8BpC"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
2
8
|
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
9
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
@@ -17,8 +23,9 @@ class Http2Error extends Error {
|
|
|
17
23
|
}
|
|
18
24
|
exports.Http2Error = Http2Error;
|
|
19
25
|
class Http2Transport {
|
|
20
|
-
constructor() {
|
|
21
|
-
_Http2Transport_pool.set(this,
|
|
26
|
+
constructor(options = {}) {
|
|
27
|
+
_Http2Transport_pool.set(this, void 0);
|
|
28
|
+
__classPrivateFieldSet(this, _Http2Transport_pool, new http2_session_js_1.Http2SessionManager(options), "f");
|
|
22
29
|
}
|
|
23
30
|
fetch(input) {
|
|
24
31
|
const request = input instanceof Request ? input : new Request(input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http2.js","sourceRoot":"","sources":["../../../src/transport/http2.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http2.js","sourceRoot":"","sources":["../../../src/transport/http2.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/transport/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAqFD,qBAAa,aAAa;;
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/transport/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAqFD,qBAAa,aAAa;;gBAUtB,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,EAC9B,EACE,WAAiB,EACjB,UAAiB,EACjB,UAAc,EACd,gBAAgB,EAChB,SAAsE,GACvE,GAAE,mBAAwB;IAoBvB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG;CA2F5C"}
|
|
@@ -10,7 +10,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
10
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
11
11
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
12
|
};
|
|
13
|
-
var _ConcurrentLimiter_activeRequests, _ConcurrentLimiter_logger, _TimeRateLimiter_logger, _TimeRateLimiter_nextAvailableAt, _RequestWorker_instances, _RequestWorker_concurrentLimiter, _RequestWorker_logger, _RequestWorker_maxRetries, _RequestWorker_pendingRequests, _RequestWorker_rateLimitPauseMs,
|
|
13
|
+
var _ConcurrentLimiter_activeRequests, _ConcurrentLimiter_logger, _TimeRateLimiter_logger, _TimeRateLimiter_nextAvailableAt, _RequestWorker_instances, _RequestWorker_concurrentLimiter, _RequestWorker_logger, _RequestWorker_maxRetries, _RequestWorker_pendingRequests, _RequestWorker_rateLimitPauseMs, _RequestWorker_timeRateLimiter, _RequestWorker_transport, _RequestWorker_fetch, _RequestWorker_pump, _RequestWorker_schedulePump;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.RequestWorker = void 0;
|
|
16
16
|
const http2_js_1 = require("./http2.js");
|
|
@@ -67,14 +67,13 @@ class TimeRateLimiter {
|
|
|
67
67
|
}
|
|
68
68
|
_TimeRateLimiter_logger = new WeakMap(), _TimeRateLimiter_nextAvailableAt = new WeakMap();
|
|
69
69
|
class RequestWorker {
|
|
70
|
-
constructor({ logger }, { concurrency = 100, intervalMs = 1000, maxRetries = 3, rateLimitPauseMs, transport = new http2_js_1.Http2Transport(), } = {}) {
|
|
70
|
+
constructor({ logger }, { concurrency = 100, intervalMs = 1000, maxRetries = 3, rateLimitPauseMs, transport = new http2_js_1.Http2Transport({ sessionsPerOrigin: concurrency * 5 }), } = {}) {
|
|
71
71
|
_RequestWorker_instances.add(this);
|
|
72
72
|
_RequestWorker_concurrentLimiter.set(this, void 0);
|
|
73
73
|
_RequestWorker_logger.set(this, void 0);
|
|
74
74
|
_RequestWorker_maxRetries.set(this, void 0);
|
|
75
75
|
_RequestWorker_pendingRequests.set(this, []);
|
|
76
76
|
_RequestWorker_rateLimitPauseMs.set(this, void 0);
|
|
77
|
-
_RequestWorker_scheduledPump.set(this, void 0);
|
|
78
77
|
_RequestWorker_timeRateLimiter.set(this, void 0);
|
|
79
78
|
_RequestWorker_transport.set(this, void 0);
|
|
80
79
|
__classPrivateFieldSet(this, _RequestWorker_logger, logger, "f");
|
|
@@ -100,7 +99,7 @@ class RequestWorker {
|
|
|
100
99
|
}
|
|
101
100
|
}
|
|
102
101
|
exports.RequestWorker = RequestWorker;
|
|
103
|
-
_RequestWorker_concurrentLimiter = new WeakMap(), _RequestWorker_logger = new WeakMap(), _RequestWorker_maxRetries = new WeakMap(), _RequestWorker_pendingRequests = new WeakMap(), _RequestWorker_rateLimitPauseMs = new WeakMap(),
|
|
102
|
+
_RequestWorker_concurrentLimiter = new WeakMap(), _RequestWorker_logger = new WeakMap(), _RequestWorker_maxRetries = new WeakMap(), _RequestWorker_pendingRequests = new WeakMap(), _RequestWorker_rateLimitPauseMs = new WeakMap(), _RequestWorker_timeRateLimiter = new WeakMap(), _RequestWorker_transport = new WeakMap(), _RequestWorker_instances = new WeakSet(), _RequestWorker_fetch = async function _RequestWorker_fetch(request, retryRemains = __classPrivateFieldGet(this, _RequestWorker_maxRetries, "f")) {
|
|
104
103
|
__classPrivateFieldGet(this, _RequestWorker_logger, "f").info(`Fetching request with max ${retryRemains} retries to ${request instanceof Request ? request.url : request.toString()}`);
|
|
105
104
|
const requestObj = request instanceof Request ? request.clone() : new Request(request);
|
|
106
105
|
const response = await __classPrivateFieldGet(this, _RequestWorker_transport, "f").fetch(requestObj);
|
|
@@ -147,13 +146,10 @@ _RequestWorker_concurrentLimiter = new WeakMap(), _RequestWorker_logger = new We
|
|
|
147
146
|
__classPrivateFieldGet(this, _RequestWorker_instances, "m", _RequestWorker_pump).call(this);
|
|
148
147
|
});
|
|
149
148
|
}, _RequestWorker_schedulePump = function _RequestWorker_schedulePump(waitMs) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
__classPrivateFieldGet(this, _RequestWorker_logger, "f").trace(`Waiting for request scheduler for ${waitMs}ms, until ${new Date(__classPrivateFieldGet(this, _RequestWorker_timeRateLimiter, "f").nextAvailableAt).toISOString()}.`);
|
|
153
|
-
__classPrivateFieldSet(this, _RequestWorker_scheduledPump, setTimeout(() => {
|
|
154
|
-
__classPrivateFieldSet(this, _RequestWorker_scheduledPump, undefined, "f");
|
|
149
|
+
__classPrivateFieldGet(this, _RequestWorker_logger, "f").trace(`Scheduled pump for ${waitMs}ms, until ${new Date(__classPrivateFieldGet(this, _RequestWorker_timeRateLimiter, "f").nextAvailableAt).toISOString()}.`);
|
|
150
|
+
setTimeout(() => {
|
|
155
151
|
__classPrivateFieldGet(this, _RequestWorker_instances, "m", _RequestWorker_pump).call(this);
|
|
156
|
-
}, waitMs)
|
|
152
|
+
}, waitMs);
|
|
157
153
|
};
|
|
158
154
|
function parseRetryAfter(response, now = Date.now()) {
|
|
159
155
|
const retryAfter = response.headers.get("Retry-After");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/transport/worker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,yCAAgE;AAgBhE,MAAM,iBAAiB;IACrB,IAAI,cAAc;QAChB,OAAO,uBAAA,IAAI,yCAAgB,CAAC;IAC9B,CAAC;IAKD,YACE,EAAE,MAAM,EAAsB,EACd,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QALrC,4CAAkB,CAAC,EAAC;QACpB,4CAAgB;QAMd,uBAAA,IAAI,6BAAW,MAAM,MAAA,CAAC;QACtB,uBAAA,IAAI,iCAAQ,CAAC,KAAK,CAChB,0CAA0C,WAAW,sBAAsB,CAC5E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAAE,OAAO,KAAK,CAAC;QAErC,uIAAwB,CAAC,MAAA,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU;QACR,IAAI,uBAAA,IAAI,yCAAgB,GAAG,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAEzD,uBAAA,IAAI,iCAAQ,CAAC,KAAK,CAChB,8BAA8B,uBAAA,IAAI,yCAAgB,IAAI,IAAI,CAAC,WAAW,qCAAqC,CAC5G,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,uIAAwB,CAAC,MAAA,CAAC;IAC5B,CAAC;CACF;;AAED,MAAM,eAAe;IACnB,IAAI,eAAe;QACjB,OAAO,uBAAA,IAAI,wCAAiB,CAAC;IAC/B,CAAC;IAKD,YACE,EAAE,MAAM,EAAsB,EACtB,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;QAL5B,0CAAgB;QAChB,2CAAmB,CAAC,EAAC;QAMnB,uBAAA,IAAI,2BAAW,MAAM,MAAA,CAAC;QACtB,uBAAA,IAAI,+BAAQ,CAAC,KAAK,CAChB,6CAA6C,UAAU,IAAI,CAC5D,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,WAAmB;QAC/B,uBAAA,IAAI,oCAAoB,IAAI,CAAC,GAAG,CAAC,uBAAA,IAAI,wCAAiB,EAAE,WAAW,CAAC,MAAA,CAAC;QACrE,uBAAA,IAAI,+BAAQ,CAAC,KAAK,CAChB,kCAAkC,IAAI,IAAI,CAAC,uBAAA,IAAI,wCAAiB,CAAC,CAAC,WAAW,EAAE,GAAG,CACnF,CAAC;IACJ,CAAC;IAED,gBAAgB;QACd,uBAAA,IAAI,oCACF,IAAI,CAAC,GAAG,CAAC,uBAAA,IAAI,wCAAiB,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,MAAA,CAAC;QAChE,uBAAA,IAAI,+BAAQ,CAAC,KAAK,CAChB,kCAAkC,IAAI,IAAI,CAAC,uBAAA,IAAI,wCAAiB,CAAC,CAAC,WAAW,EAAE,GAAG,CACnF,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,uBAAA,IAAI,wCAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5C,CAAC;CACF;;AAED,MAAa,aAAa;
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/transport/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { type ClientHttp2Session } from "node:http2";
|
|
2
|
+
export interface Http2SessionManagerOptions {
|
|
3
|
+
sessionsPerOrigin?: number;
|
|
4
|
+
}
|
|
2
5
|
export declare class Http2SessionManager {
|
|
3
6
|
#private;
|
|
7
|
+
constructor({ sessionsPerOrigin }?: Http2SessionManagerOptions);
|
|
4
8
|
closeAll(): Promise<void>;
|
|
5
9
|
getSession(url: string): ClientHttp2Session;
|
|
6
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http2-session.d.ts","sourceRoot":"","sources":["../../../src/transport/http2-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAW,MAAM,YAAY,CAAC;AAE9D,qBAAa,mBAAmB;;
|
|
1
|
+
{"version":3,"file":"http2-session.d.ts","sourceRoot":"","sources":["../../../src/transport/http2-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAW,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAOD,qBAAa,mBAAmB;;gBAIlB,EAAE,iBAAqB,EAAE,GAAE,0BAA+B;IAIhE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;CA4C5C"}
|
|
@@ -1,38 +1,64 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
1
7
|
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
8
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
11
|
};
|
|
6
|
-
var
|
|
12
|
+
var _Http2SessionManager_instances, _Http2SessionManager_pools, _Http2SessionManager_sessionsPerOrigin, _Http2SessionManager_createPool, _Http2SessionManager_createSession;
|
|
7
13
|
import { connect } from "node:http2";
|
|
8
14
|
export class Http2SessionManager {
|
|
9
|
-
constructor() {
|
|
10
|
-
|
|
15
|
+
constructor({ sessionsPerOrigin = 5 } = {}) {
|
|
16
|
+
_Http2SessionManager_instances.add(this);
|
|
17
|
+
_Http2SessionManager_pools.set(this, new Map());
|
|
18
|
+
_Http2SessionManager_sessionsPerOrigin.set(this, void 0);
|
|
19
|
+
__classPrivateFieldSet(this, _Http2SessionManager_sessionsPerOrigin, Math.max(1, Math.floor(sessionsPerOrigin)), "f");
|
|
11
20
|
}
|
|
12
21
|
async closeAll() {
|
|
13
|
-
const sessions = [...__classPrivateFieldGet(this,
|
|
14
|
-
__classPrivateFieldGet(this,
|
|
22
|
+
const sessions = [...__classPrivateFieldGet(this, _Http2SessionManager_pools, "f").values()].flatMap((pool) => pool.sessions);
|
|
23
|
+
__classPrivateFieldGet(this, _Http2SessionManager_pools, "f").clear();
|
|
15
24
|
await Promise.all(sessions.map(closeHttp2Session));
|
|
16
25
|
}
|
|
17
26
|
getSession(url) {
|
|
18
27
|
const origin = new URL(url).origin;
|
|
19
|
-
const
|
|
20
|
-
if (
|
|
21
|
-
|
|
28
|
+
const pool = __classPrivateFieldGet(this, _Http2SessionManager_pools, "f").get(origin) ?? __classPrivateFieldGet(this, _Http2SessionManager_instances, "m", _Http2SessionManager_createPool).call(this, origin);
|
|
29
|
+
if (pool.sessions.length < __classPrivateFieldGet(this, _Http2SessionManager_sessionsPerOrigin, "f")) {
|
|
30
|
+
const session = __classPrivateFieldGet(this, _Http2SessionManager_instances, "m", _Http2SessionManager_createSession).call(this, origin);
|
|
31
|
+
pool.sessions.push(session);
|
|
32
|
+
return session;
|
|
22
33
|
}
|
|
23
|
-
const session =
|
|
24
|
-
|
|
25
|
-
const cleanup = () => {
|
|
26
|
-
if (__classPrivateFieldGet(this, _Http2SessionManager_sessions, "f").get(origin) === session) {
|
|
27
|
-
__classPrivateFieldGet(this, _Http2SessionManager_sessions, "f").delete(origin);
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
session.once("close", cleanup);
|
|
31
|
-
session.once("error", cleanup);
|
|
34
|
+
const session = pool.sessions[pool.nextIndex % pool.sessions.length];
|
|
35
|
+
pool.nextIndex = (pool.nextIndex + 1) % pool.sessions.length;
|
|
32
36
|
return session;
|
|
33
37
|
}
|
|
34
38
|
}
|
|
35
|
-
|
|
39
|
+
_Http2SessionManager_pools = new WeakMap(), _Http2SessionManager_sessionsPerOrigin = new WeakMap(), _Http2SessionManager_instances = new WeakSet(), _Http2SessionManager_createPool = function _Http2SessionManager_createPool(origin) {
|
|
40
|
+
const pool = { nextIndex: 0, sessions: [] };
|
|
41
|
+
__classPrivateFieldGet(this, _Http2SessionManager_pools, "f").set(origin, pool);
|
|
42
|
+
return pool;
|
|
43
|
+
}, _Http2SessionManager_createSession = function _Http2SessionManager_createSession(origin) {
|
|
44
|
+
const session = connect(origin);
|
|
45
|
+
const cleanup = () => {
|
|
46
|
+
const pool = __classPrivateFieldGet(this, _Http2SessionManager_pools, "f").get(origin);
|
|
47
|
+
if (!pool)
|
|
48
|
+
return;
|
|
49
|
+
const index = pool.sessions.indexOf(session);
|
|
50
|
+
if (index >= 0) {
|
|
51
|
+
pool.sessions.splice(index, 1);
|
|
52
|
+
pool.nextIndex = Math.min(pool.nextIndex, pool.sessions.length);
|
|
53
|
+
}
|
|
54
|
+
if (pool.sessions.length === 0) {
|
|
55
|
+
__classPrivateFieldGet(this, _Http2SessionManager_pools, "f").delete(origin);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
session.once("close", cleanup);
|
|
59
|
+
session.once("error", cleanup);
|
|
60
|
+
return session;
|
|
61
|
+
};
|
|
36
62
|
function closeHttp2Session(session) {
|
|
37
63
|
if (session.closed || session.destroyed) {
|
|
38
64
|
return Promise.resolve();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http2-session.js","sourceRoot":"","sources":["../../../src/transport/http2-session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http2-session.js","sourceRoot":"","sources":["../../../src/transport/http2-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Http2SessionManagerOptions } from "./http2-session.js";
|
|
1
2
|
export interface HttpTransport {
|
|
2
3
|
fetch(input: Request | string | URL): Promise<Response>;
|
|
3
4
|
}
|
|
@@ -6,6 +7,7 @@ export declare class Http2Error extends Error {
|
|
|
6
7
|
}
|
|
7
8
|
export declare class Http2Transport {
|
|
8
9
|
#private;
|
|
10
|
+
constructor(options?: Http2SessionManagerOptions);
|
|
9
11
|
fetch(input: Request | string | URL): Promise<Response>;
|
|
10
12
|
}
|
|
11
13
|
//# sourceMappingURL=http2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http2.d.ts","sourceRoot":"","sources":["../../../src/transport/http2.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http2.d.ts","sourceRoot":"","sources":["../../../src/transport/http2.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,oBAAoB,CAAC;AAI5B,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACzD;AAED,qBAAa,UAAW,SAAQ,KAAK;gBAChB,OAAO,EAAE,MAAM;CAInC;AAED,qBAAa,cAAc;;gBAGb,OAAO,GAAE,0BAA+B;IAIpD,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG;CA8BpC"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
1
7
|
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
8
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
11
|
};
|
|
6
12
|
var _Http2Transport_pool;
|
|
7
|
-
import { Http2SessionManager } from "./http2-session.js";
|
|
13
|
+
import { Http2SessionManager, } from "./http2-session.js";
|
|
8
14
|
const HTTP2_HEADER_STATUS = ":status";
|
|
9
15
|
export class Http2Error extends Error {
|
|
10
16
|
constructor(message) {
|
|
@@ -13,8 +19,9 @@ export class Http2Error extends Error {
|
|
|
13
19
|
}
|
|
14
20
|
}
|
|
15
21
|
export class Http2Transport {
|
|
16
|
-
constructor() {
|
|
17
|
-
_Http2Transport_pool.set(this,
|
|
22
|
+
constructor(options = {}) {
|
|
23
|
+
_Http2Transport_pool.set(this, void 0);
|
|
24
|
+
__classPrivateFieldSet(this, _Http2Transport_pool, new Http2SessionManager(options), "f");
|
|
18
25
|
}
|
|
19
26
|
fetch(input) {
|
|
20
27
|
const request = input instanceof Request ? input : new Request(input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http2.js","sourceRoot":"","sources":["../../../src/transport/http2.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http2.js","sourceRoot":"","sources":["../../../src/transport/http2.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/transport/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAqFD,qBAAa,aAAa;;
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/transport/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAqFD,qBAAa,aAAa;;gBAUtB,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,EAC9B,EACE,WAAiB,EACjB,UAAiB,EACjB,UAAc,EACd,gBAAgB,EAChB,SAAsE,GACvE,GAAE,mBAAwB;IAoBvB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG;CA2F5C"}
|
|
@@ -9,7 +9,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
10
10
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
11
11
|
};
|
|
12
|
-
var _ConcurrentLimiter_activeRequests, _ConcurrentLimiter_logger, _TimeRateLimiter_logger, _TimeRateLimiter_nextAvailableAt, _RequestWorker_instances, _RequestWorker_concurrentLimiter, _RequestWorker_logger, _RequestWorker_maxRetries, _RequestWorker_pendingRequests, _RequestWorker_rateLimitPauseMs,
|
|
12
|
+
var _ConcurrentLimiter_activeRequests, _ConcurrentLimiter_logger, _TimeRateLimiter_logger, _TimeRateLimiter_nextAvailableAt, _RequestWorker_instances, _RequestWorker_concurrentLimiter, _RequestWorker_logger, _RequestWorker_maxRetries, _RequestWorker_pendingRequests, _RequestWorker_rateLimitPauseMs, _RequestWorker_timeRateLimiter, _RequestWorker_transport, _RequestWorker_fetch, _RequestWorker_pump, _RequestWorker_schedulePump;
|
|
13
13
|
import { Http2Transport } from "./http2.js";
|
|
14
14
|
class ConcurrentLimiter {
|
|
15
15
|
get activeRequests() {
|
|
@@ -64,14 +64,13 @@ class TimeRateLimiter {
|
|
|
64
64
|
}
|
|
65
65
|
_TimeRateLimiter_logger = new WeakMap(), _TimeRateLimiter_nextAvailableAt = new WeakMap();
|
|
66
66
|
export class RequestWorker {
|
|
67
|
-
constructor({ logger }, { concurrency = 100, intervalMs = 1000, maxRetries = 3, rateLimitPauseMs, transport = new Http2Transport(), } = {}) {
|
|
67
|
+
constructor({ logger }, { concurrency = 100, intervalMs = 1000, maxRetries = 3, rateLimitPauseMs, transport = new Http2Transport({ sessionsPerOrigin: concurrency * 5 }), } = {}) {
|
|
68
68
|
_RequestWorker_instances.add(this);
|
|
69
69
|
_RequestWorker_concurrentLimiter.set(this, void 0);
|
|
70
70
|
_RequestWorker_logger.set(this, void 0);
|
|
71
71
|
_RequestWorker_maxRetries.set(this, void 0);
|
|
72
72
|
_RequestWorker_pendingRequests.set(this, []);
|
|
73
73
|
_RequestWorker_rateLimitPauseMs.set(this, void 0);
|
|
74
|
-
_RequestWorker_scheduledPump.set(this, void 0);
|
|
75
74
|
_RequestWorker_timeRateLimiter.set(this, void 0);
|
|
76
75
|
_RequestWorker_transport.set(this, void 0);
|
|
77
76
|
__classPrivateFieldSet(this, _RequestWorker_logger, logger, "f");
|
|
@@ -96,7 +95,7 @@ export class RequestWorker {
|
|
|
96
95
|
});
|
|
97
96
|
}
|
|
98
97
|
}
|
|
99
|
-
_RequestWorker_concurrentLimiter = new WeakMap(), _RequestWorker_logger = new WeakMap(), _RequestWorker_maxRetries = new WeakMap(), _RequestWorker_pendingRequests = new WeakMap(), _RequestWorker_rateLimitPauseMs = new WeakMap(),
|
|
98
|
+
_RequestWorker_concurrentLimiter = new WeakMap(), _RequestWorker_logger = new WeakMap(), _RequestWorker_maxRetries = new WeakMap(), _RequestWorker_pendingRequests = new WeakMap(), _RequestWorker_rateLimitPauseMs = new WeakMap(), _RequestWorker_timeRateLimiter = new WeakMap(), _RequestWorker_transport = new WeakMap(), _RequestWorker_instances = new WeakSet(), _RequestWorker_fetch = async function _RequestWorker_fetch(request, retryRemains = __classPrivateFieldGet(this, _RequestWorker_maxRetries, "f")) {
|
|
100
99
|
__classPrivateFieldGet(this, _RequestWorker_logger, "f").info(`Fetching request with max ${retryRemains} retries to ${request instanceof Request ? request.url : request.toString()}`);
|
|
101
100
|
const requestObj = request instanceof Request ? request.clone() : new Request(request);
|
|
102
101
|
const response = await __classPrivateFieldGet(this, _RequestWorker_transport, "f").fetch(requestObj);
|
|
@@ -143,13 +142,10 @@ _RequestWorker_concurrentLimiter = new WeakMap(), _RequestWorker_logger = new We
|
|
|
143
142
|
__classPrivateFieldGet(this, _RequestWorker_instances, "m", _RequestWorker_pump).call(this);
|
|
144
143
|
});
|
|
145
144
|
}, _RequestWorker_schedulePump = function _RequestWorker_schedulePump(waitMs) {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
__classPrivateFieldGet(this, _RequestWorker_logger, "f").trace(`Waiting for request scheduler for ${waitMs}ms, until ${new Date(__classPrivateFieldGet(this, _RequestWorker_timeRateLimiter, "f").nextAvailableAt).toISOString()}.`);
|
|
149
|
-
__classPrivateFieldSet(this, _RequestWorker_scheduledPump, setTimeout(() => {
|
|
150
|
-
__classPrivateFieldSet(this, _RequestWorker_scheduledPump, undefined, "f");
|
|
145
|
+
__classPrivateFieldGet(this, _RequestWorker_logger, "f").trace(`Scheduled pump for ${waitMs}ms, until ${new Date(__classPrivateFieldGet(this, _RequestWorker_timeRateLimiter, "f").nextAvailableAt).toISOString()}.`);
|
|
146
|
+
setTimeout(() => {
|
|
151
147
|
__classPrivateFieldGet(this, _RequestWorker_instances, "m", _RequestWorker_pump).call(this);
|
|
152
|
-
}, waitMs)
|
|
148
|
+
}, waitMs);
|
|
153
149
|
};
|
|
154
150
|
function parseRetryAfter(response, now = Date.now()) {
|
|
155
151
|
const retryAfter = response.headers.get("Retry-After");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/transport/worker.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,OAAO,EAAE,cAAc,EAAsB,MAAM,YAAY,CAAC;AAgBhE,MAAM,iBAAiB;IACrB,IAAI,cAAc;QAChB,OAAO,uBAAA,IAAI,yCAAgB,CAAC;IAC9B,CAAC;IAKD,YACE,EAAE,MAAM,EAAsB,EACd,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QALrC,4CAAkB,CAAC,EAAC;QACpB,4CAAgB;QAMd,uBAAA,IAAI,6BAAW,MAAM,MAAA,CAAC;QACtB,uBAAA,IAAI,iCAAQ,CAAC,KAAK,CAChB,0CAA0C,WAAW,sBAAsB,CAC5E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAAE,OAAO,KAAK,CAAC;QAErC,uIAAwB,CAAC,MAAA,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU;QACR,IAAI,uBAAA,IAAI,yCAAgB,GAAG,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAEzD,uBAAA,IAAI,iCAAQ,CAAC,KAAK,CAChB,8BAA8B,uBAAA,IAAI,yCAAgB,IAAI,IAAI,CAAC,WAAW,qCAAqC,CAC5G,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,uIAAwB,CAAC,MAAA,CAAC;IAC5B,CAAC;CACF;;AAED,MAAM,eAAe;IACnB,IAAI,eAAe;QACjB,OAAO,uBAAA,IAAI,wCAAiB,CAAC;IAC/B,CAAC;IAKD,YACE,EAAE,MAAM,EAAsB,EACtB,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;QAL5B,0CAAgB;QAChB,2CAAmB,CAAC,EAAC;QAMnB,uBAAA,IAAI,2BAAW,MAAM,MAAA,CAAC;QACtB,uBAAA,IAAI,+BAAQ,CAAC,KAAK,CAChB,6CAA6C,UAAU,IAAI,CAC5D,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,WAAmB;QAC/B,uBAAA,IAAI,oCAAoB,IAAI,CAAC,GAAG,CAAC,uBAAA,IAAI,wCAAiB,EAAE,WAAW,CAAC,MAAA,CAAC;QACrE,uBAAA,IAAI,+BAAQ,CAAC,KAAK,CAChB,kCAAkC,IAAI,IAAI,CAAC,uBAAA,IAAI,wCAAiB,CAAC,CAAC,WAAW,EAAE,GAAG,CACnF,CAAC;IACJ,CAAC;IAED,gBAAgB;QACd,uBAAA,IAAI,oCACF,IAAI,CAAC,GAAG,CAAC,uBAAA,IAAI,wCAAiB,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,MAAA,CAAC;QAChE,uBAAA,IAAI,+BAAQ,CAAC,KAAK,CAChB,kCAAkC,IAAI,IAAI,CAAC,uBAAA,IAAI,wCAAiB,CAAC,CAAC,WAAW,EAAE,GAAG,CACnF,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,uBAAA,IAAI,wCAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5C,CAAC;CACF;;AAED,MAAM,OAAO,aAAa;
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/transport/worker.ts"],"names":[],"mappings":"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"}
|