@moontaiworks/fanbox-dl 1.0.0 → 1.0.1

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.
@@ -1,2 +1,2 @@
1
- "use strict";var x=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var _=t=>{throw TypeError(t)};var W=(t,e)=>{for(var r in e)x(t,r,{get:e[r],enumerable:!0})},z=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of M(e))!$.call(t,o)&&o!==r&&x(t,o,{get:()=>e[o],enumerable:!(s=q(e,o))||s.enumerable});return t};var J=t=>z(x({},"__esModule",{value:!0}),t);var L=(t,e,r)=>e.has(t)||_("Cannot "+r);var n=(t,e,r)=>(L(t,e,"read from private field"),r?r.call(t):e.get(t)),P=(t,e,r)=>e.has(t)?_("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),g=(t,e,r,s)=>(L(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r),i=(t,e,r)=>(L(t,e,"access private method"),r);var Pt={};W(Pt,{FanboxApiError:()=>f,FanboxClient:()=>b});module.exports=J(Pt);var C="creator.get";var O="creator.listFollowing";var w="plan.listCreator";var E="plan.listSupporting";var I="post.info";var U="post.listCreator";var F="post.listHome";var G="post.listSupporting";var N="post.paginateCreator";function B(t={}){let e={Accept:"application/json, text/plain, */*",Origin:"https://www.fanbox.cc",Referer:"https://www.fanbox.cc/","Sec-Fetch-Dest":"empty","Sec-Fetch-Mode":"cors","Sec-Fetch-Site":"same-site","User-Agent":t.userAgent??X()};return t.cookie!==void 0&&(e.Cookie=t.cookie),e}function X(){return`${Math.random().toString(36).substring(2,15)}/${Math.random().toFixed(5)}`}var k=require("http2");var Y=":authority",K=":method",Q=":path",V=":scheme",Z=":status",p,S,v,T=class{constructor(){P(this,S);P(this,p,new Map)}async close(){let e=[...n(this,p).values()];n(this,p).clear(),await Promise.all(e.map(tt))}request(e){let r=nt(e),s=i(this,S,v).call(this,r.url),o=et(r),m=s.request(o,{endStream:!r.body});return new Promise((h,d)=>{let A=!1;m.once("error",d),m.once("response",l=>{A=!0;let D=it(l[Z]);h(rt({body:m,headers:st(l),status:D}))}),m.once("close",()=>{A||d(new H("HTTP/2 stream closed before response"))}),r.body!==void 0&&pt(m,r.body).catch(l=>{m.destroy(l instanceof Error?l:new Error(String(l)))})})}};p=new WeakMap,S=new WeakSet,v=function(e){let r=e.origin,s=n(this,p).get(r);if(s&&!s.closed&&!s.destroyed)return s;let o=(0,k.connect)(r);return o.once("close",()=>{n(this,p).get(r)===o&&n(this,p).delete(r)}),o.once("error",()=>{n(this,p).get(r)===o&&n(this,p).delete(r)}),n(this,p).set(r,o),o};var H=class extends Error{constructor(e){super(e),this.name="HttpError"}};function tt(t){return t.closed||t.destroyed?Promise.resolve():new Promise(e=>{t.close(e)})}function et(t){let e={[Y]:t.url.host,[K]:t.method.toUpperCase(),[Q]:`${t.url.pathname}${t.url.search}`,[V]:t.url.protocol.slice(0,-1)};return new Headers(t.headers).forEach((r,s)=>{ot(s)||(e[s]=r)}),e}function rt(t){return{body:t.body,headers:t.headers,json:async()=>JSON.parse(await j(t.body)),ok:t.status>=200&&t.status<300,status:t.status,statusText:"",text:async()=>j(t.body)}}function st(t){let e=new Headers;for(let[r,s]of Object.entries(t))if(!(r.startsWith(":")||s===void 0))if(Array.isArray(s))for(let o of s)e.append(r,o);else e.set(r,s);return e}function ot(t){return t.startsWith(":")||t==="connection"||t==="keep-alive"||t==="proxy-connection"||t==="transfer-encoding"||t==="upgrade"}function nt(t){return typeof t=="string"||t instanceof URL?{body:void 0,headers:void 0,method:"GET",url:new URL(t)}:{body:t.body,headers:t.headers,method:t.method??"GET",url:new URL(t.url)}}function it(t){return typeof t=="number"?t:Array.isArray(t)?Number(t[0]??0):Number(t??0)}async function j(t){let e=[];for await(let r of t)e.push(at(r));return Buffer.concat(e).toString("utf8")}function at(t){return Buffer.isBuffer(t)?t:t instanceof Uint8Array||typeof t=="string"?Buffer.from(t):Buffer.from(String(t))}async function pt(t,e){if(typeof e=="string"||e instanceof Uint8Array){t.end(e);return}if(e instanceof Blob){t.end(Buffer.from(new Uint8Array(await e.arrayBuffer())));return}throw new H("Unsupported HTTP request body")}var ut="https://api.fanbox.cc",f=class extends Error{constructor(e,r){super(`FANBOX API request failed: ${e.status} ${e.statusText}`),this.name="FanboxApiError",this.body=r,this.status=e.status,this.statusText=e.statusText}},c,y,R,a,u,b=class{constructor(e={}){P(this,a);P(this,c);P(this,y);P(this,R);g(this,c,e.baseUrl??ut),g(this,y,B({cookie:e.cookie,userAgent:e.userAgent})),g(this,R,e.transport??new T)}getCreator(e){return i(this,a,u).call(this,C,e)}getPost(e){return i(this,a,u).call(this,I,e)}listCreatorPlans(e){return i(this,a,u).call(this,w,e)}listCreatorPosts(e){return i(this,a,u).call(this,U,e)}listFollowingCreators(){return i(this,a,u).call(this,O)}listHomePosts(e={}){return i(this,a,u).call(this,F,e)}listSupportingPlans(){return i(this,a,u).call(this,E)}listSupportingPosts(e={}){return i(this,a,u).call(this,G,e)}paginateCreatorPosts(e){return i(this,a,u).call(this,N,e)}};c=new WeakMap,y=new WeakMap,R=new WeakMap,a=new WeakSet,u=async function(e,r={}){let s=new URL(e,n(this,c).endsWith("/")?n(this,c):`${n(this,c)}/`);for(let[h,d]of Object.entries(r))d!==void 0&&s.searchParams.set(h,String(d));let o=await n(this,R).request({headers:n(this,y),method:"GET",url:s}),m=await mt(o);if(!o.ok)throw new f(o,m);return m.body};async function mt(t){let e=await t.text();try{return JSON.parse(e)}catch{return e}}0&&(module.exports={FanboxApiError,FanboxClient});
1
+ "use strict";var x=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var _=t=>{throw TypeError(t)};var W=(t,e)=>{for(var r in e)x(t,r,{get:e[r],enumerable:!0})},z=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of M(e))!$.call(t,o)&&o!==r&&x(t,o,{get:()=>e[o],enumerable:!(s=q(e,o))||s.enumerable});return t};var J=t=>z(x({},"__esModule",{value:!0}),t);var L=(t,e,r)=>e.has(t)||_("Cannot "+r);var n=(t,e,r)=>(L(t,e,"read from private field"),r?r.call(t):e.get(t)),m=(t,e,r)=>e.has(t)?_("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),g=(t,e,r,s)=>(L(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r),i=(t,e,r)=>(L(t,e,"access private method"),r);var mt={};W(mt,{FanboxApiError:()=>f,FanboxClient:()=>b});module.exports=J(mt);var C="creator.get";var O="creator.listFollowing";var w="plan.listCreator";var E="plan.listSupporting";var I="post.info";var U="post.listCreator";var F="post.listHome";var G="post.listSupporting";var N="post.paginateCreator";function B(t={}){let e={Accept:"application/json, text/plain, */*",Origin:"https://www.fanbox.cc",Referer:"https://www.fanbox.cc/","Sec-Fetch-Dest":"empty","Sec-Fetch-Mode":"cors","Sec-Fetch-Site":"same-site","User-Agent":t.userAgent??X()};return t.cookie!==void 0&&(e.Cookie=t.cookie),e}function X(){return`${Math.random().toString(36).substring(2,15)}/${Math.random().toFixed(5)}`}var k=require("http2");var Y=":authority",K=":method",Q=":path",V=":scheme",Z=":status",p,S,v,T=class{constructor(){m(this,S);m(this,p,new Map)}async close(){let e=[...n(this,p).values()];n(this,p).clear(),await Promise.all(e.map(tt))}request(e){let r=nt(e),s=i(this,S,v).call(this,r.url),o=et(r),c=s.request(o,{endStream:!r.body});return new Promise((h,d)=>{let A=!1;c.once("error",d),c.once("response",l=>{A=!0;let D=it(l[Z]);h(rt({body:c,headers:st(l),status:D}))}),c.once("close",()=>{A||d(new H("HTTP/2 stream closed before response"))}),r.body!==void 0&&pt(c,r.body).catch(l=>{c.destroy(l instanceof Error?l:new Error(String(l)))})})}};p=new WeakMap,S=new WeakSet,v=function(e){let r=e.origin,s=n(this,p).get(r);if(s&&!s.closed&&!s.destroyed)return s;let o=(0,k.connect)(r);return o.once("close",()=>{n(this,p).get(r)===o&&n(this,p).delete(r)}),o.once("error",()=>{n(this,p).get(r)===o&&n(this,p).delete(r)}),n(this,p).set(r,o),o};var H=class extends Error{constructor(e){super(e),this.name="HttpError"}};function tt(t){return t.closed||t.destroyed?Promise.resolve():new Promise(e=>{t.close(e)})}function et(t){let e={[Y]:t.url.host,[K]:t.method.toUpperCase(),[Q]:`${t.url.pathname}${t.url.search}`,[V]:t.url.protocol.slice(0,-1)};return new Headers(t.headers).forEach((r,s)=>{ot(s)||(e[s]=r)}),e}function rt(t){return{body:t.body,headers:t.headers,json:async()=>JSON.parse(await j(t.body)),ok:t.status>=200&&t.status<300,status:t.status,statusText:"",text:async()=>j(t.body)}}function st(t){let e=new Headers;for(let[r,s]of Object.entries(t))if(!(r.startsWith(":")||s===void 0))if(Array.isArray(s))for(let o of s)e.append(r,o);else e.set(r,s);return e}function ot(t){return t.startsWith(":")||t==="connection"||t==="keep-alive"||t==="proxy-connection"||t==="transfer-encoding"||t==="upgrade"}function nt(t){return typeof t=="string"||t instanceof URL?{body:void 0,headers:void 0,method:"GET",url:new URL(t)}:{body:t.body,headers:t.headers,method:t.method??"GET",url:new URL(t.url)}}function it(t){return typeof t=="number"?t:Array.isArray(t)?Number(t[0]??0):Number(t??0)}async function j(t){let e=[];for await(let r of t)e.push(at(r));return Buffer.concat(e).toString("utf8")}function at(t){return Buffer.isBuffer(t)?t:t instanceof Uint8Array||typeof t=="string"?Buffer.from(t):Buffer.from(String(t))}async function pt(t,e){if(typeof e=="string"||e instanceof Uint8Array){t.end(e);return}if(e instanceof Blob){t.end(Buffer.from(new Uint8Array(await e.arrayBuffer())));return}throw new H("Unsupported HTTP request body")}var ut="https://api.fanbox.cc",f=class extends Error{constructor(e,r){super(`FANBOX API request failed: ${e.status} ${e.statusText}`),this.name="FanboxApiError",this.body=r,this.status=e.status,this.statusText=e.statusText}},P,y,R,a,u,b=class{constructor(e={}){m(this,a);m(this,P);m(this,y);m(this,R);g(this,P,e.baseUrl??ut),g(this,y,B({cookie:e.cookie,userAgent:e.userAgent})),g(this,R,e.transport??new T)}getCreator(e){return i(this,a,u).call(this,C,e)}getPost(e){return i(this,a,u).call(this,I,e)}listCreatorPlans(e){return i(this,a,u).call(this,w,e)}listCreatorPosts(e){return i(this,a,u).call(this,U,e)}listFollowingCreators(){return i(this,a,u).call(this,O)}listHomePosts(e={}){return i(this,a,u).call(this,F,e)}listSupportingPlans(){return i(this,a,u).call(this,E)}listSupportingPosts(e={}){return i(this,a,u).call(this,G,e)}paginateCreatorPosts(e){return i(this,a,u).call(this,N,e)}};P=new WeakMap,y=new WeakMap,R=new WeakMap,a=new WeakSet,u=async function(e,r={}){let s=new URL(e,n(this,P).endsWith("/")?n(this,P):`${n(this,P)}/`);for(let[h,d]of Object.entries(r))d!==void 0&&s.searchParams.set(h,String(d));let o=await n(this,R).request({headers:n(this,y),method:"GET",url:s}),c=await ct(o);if(!o.ok)throw new f(o,c);return c.body};async function ct(t){let e=await t.text();try{return JSON.parse(e)}catch{return e}}0&&(module.exports={FanboxApiError,FanboxClient});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/endpoints/creator-get.ts","../../src/endpoints/creator-list-following.ts","../../src/endpoints/plan-list-creator.ts","../../src/endpoints/plan-list-supporting.ts","../../src/endpoints/post-info.ts","../../src/endpoints/post-list-creator.ts","../../src/endpoints/post-list-home.ts","../../src/endpoints/post-list-supporting.ts","../../src/endpoints/post-paginate-creator.ts","../../src/fanbox-headers.ts","../../src/http.ts","../../src/client.ts"],"sourcesContent":["export { FanboxApiError, FanboxClient } from \"./client.js\";\nexport type * from \"./types.js\";\n","import type { Creator } from \"./models/creator.js\";\n\nexport const CREATOR_GET_PATH = \"creator.get\";\n\nexport interface GetCreatorParams {\n creatorId: string;\n}\n\nexport type GetCreatorResult = Creator;\n","import type { CreatorSummary } from \"./models/creator.js\";\n\nexport const CREATOR_LIST_FOLLOWING_PATH = \"creator.listFollowing\";\n\nexport type ListFollowingCreatorsResult = CreatorSummary[];\n","import type { Plan } from \"./models/plan.js\";\n\nexport const PLAN_LIST_CREATOR_PATH = \"plan.listCreator\";\n\nexport interface ListCreatorPlansParams {\n creatorId: string;\n}\n\nexport type ListCreatorPlansResult = Plan[];\n","import type { SupportingPlan } from \"./models/plan.js\";\n\nexport const PLAN_LIST_SUPPORTING_PATH = \"plan.listSupporting\";\n\nexport type ListSupportingPlansResult = SupportingPlan[];\n","import type { Post } from \"./models/post.js\";\n\nexport const POST_INFO_PATH = \"post.info\";\n\nexport interface GetPostParams {\n postId: string;\n}\n\nexport type GetPostResult = Post;\n","import type { PostListParams, PostSort, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_CREATOR_PATH = \"post.listCreator\";\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","import type { PostListParams, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_HOME_PATH = \"post.listHome\";\n\nexport type ListHomePostsParams = PostListParams;\n\nexport type ListHomePostsResult = PostSummary[];\n","import type { PostListParams, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_SUPPORTING_PATH = \"post.listSupporting\";\n\nexport type ListSupportingPostsParams = PostListParams;\n\nexport type ListSupportingPostsResult = PostSummary[];\n","import type { PostSort } from \"./models/post.js\";\n\nexport const POST_PAGINATE_CREATOR_PATH = \"post.paginateCreator\";\n\nexport interface PaginateCreatorPostsParams {\n creatorId: string;\n sort?: PostSort;\n}\n\nexport type PaginateCreatorPostsResult = string[];\n","export interface FanboxRequestHeadersOptions {\n cookie?: string;\n userAgent?: string;\n}\n\nexport function createFanboxRequestHeaders(\n options: FanboxRequestHeadersOptions = {},\n): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json, text/plain, */*\",\n Origin: \"https://www.fanbox.cc\",\n Referer: \"https://www.fanbox.cc/\",\n \"Sec-Fetch-Dest\": \"empty\",\n \"Sec-Fetch-Mode\": \"cors\",\n \"Sec-Fetch-Site\": \"same-site\",\n \"User-Agent\": options.userAgent ?? createRandomUserAgent(),\n };\n if (options.cookie !== undefined) {\n headers.Cookie = options.cookie;\n }\n\n return headers;\n}\n\nexport function createRandomUserAgent(): string {\n return `${Math.random().toString(36).substring(2, 15)}/${Math.random().toFixed(5)}`;\n}\n","import { type ClientHttp2Session, connect } from \"node:http2\";\nimport type { Readable } from \"node:stream\";\n\nconst HTTP2_HEADER_AUTHORITY = \":authority\";\nconst HTTP2_HEADER_METHOD = \":method\";\nconst HTTP2_HEADER_PATH = \":path\";\nconst HTTP2_HEADER_SCHEME = \":scheme\";\nconst HTTP2_HEADER_STATUS = \":status\";\n\nexport interface HttpRequest {\n body?: BodyInit | undefined;\n headers?: Headers | Record<string, string>;\n method?: string;\n url: string | URL;\n}\n\nexport interface HttpResponse {\n body: Readable;\n headers: Headers;\n json(): Promise<unknown>;\n ok: boolean;\n status: number;\n statusText: string;\n text(): Promise<string>;\n}\n\nexport interface HttpTransport {\n close(): Promise<void>;\n request(request: HttpRequest | string | URL): Promise<HttpResponse>;\n}\n\ntype BodyInit = Blob | string | Uint8Array;\n\ninterface NormalizedHttpRequest {\n body: BodyInit | undefined;\n headers: Headers | Record<string, string> | undefined;\n method: string;\n url: URL;\n}\n\nexport class Http2Transport implements HttpTransport {\n readonly #sessions = new Map<string, ClientHttp2Session>();\n\n public async close(): Promise<void> {\n const sessions = [...this.#sessions.values()];\n this.#sessions.clear();\n await Promise.all(sessions.map(closeSession));\n }\n\n public request(request: HttpRequest | string | URL): Promise<HttpResponse> {\n const normalized = normalizeRequest(request);\n const session = this.#getSession(normalized.url);\n const headers = createHttp2Headers(normalized);\n const stream = session.request(headers, { endStream: !normalized.body });\n\n return new Promise((resolve, reject) => {\n let settled = false;\n stream.once(\"error\", reject);\n stream.once(\"response\", (responseHeaders) => {\n settled = true;\n const status = parseStatus(responseHeaders[HTTP2_HEADER_STATUS]);\n resolve(\n createResponse({\n body: stream,\n headers: createResponseHeaders(responseHeaders),\n status,\n }),\n );\n });\n stream.once(\"close\", () => {\n if (!settled) {\n reject(new HttpError(`HTTP/2 stream closed before response`));\n }\n });\n if (normalized.body !== undefined) {\n writeRequestBody(stream, normalized.body).catch((error: unknown) => {\n stream.destroy(\n error instanceof Error ? error : new Error(String(error)),\n );\n });\n }\n });\n }\n\n #getSession(url: URL): ClientHttp2Session {\n const origin = url.origin;\n const existing = this.#sessions.get(origin);\n if (existing && !existing.closed && !existing.destroyed) {\n return existing;\n }\n\n const session = connect(origin);\n session.once(\"close\", () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.delete(origin);\n }\n });\n session.once(\"error\", () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.delete(origin);\n }\n });\n this.#sessions.set(origin, session);\n\n return session;\n }\n}\n\nexport class HttpError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"HttpError\";\n }\n}\n\nfunction closeSession(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\nfunction createHttp2Headers(\n request: NormalizedHttpRequest,\n): Record<string, string> {\n const headers: Record<string, string> = {\n [HTTP2_HEADER_AUTHORITY]: request.url.host,\n [HTTP2_HEADER_METHOD]: request.method.toUpperCase(),\n [HTTP2_HEADER_PATH]: `${request.url.pathname}${request.url.search}`,\n [HTTP2_HEADER_SCHEME]: request.url.protocol.slice(0, -1),\n };\n new Headers(request.headers).forEach((value, key) => {\n if (!isForbiddenHttp2Header(key)) {\n headers[key] = value;\n }\n });\n\n return headers;\n}\n\nfunction createResponse(options: {\n body: Readable;\n headers: Headers;\n status: number;\n}): HttpResponse {\n return {\n body: options.body,\n headers: options.headers,\n json: async () => {\n const parsed: unknown = JSON.parse(await readText(options.body));\n return parsed;\n },\n ok: options.status >= 200 && options.status < 300,\n status: options.status,\n statusText: \"\",\n text: async () => readText(options.body),\n };\n}\n\nfunction createResponseHeaders(\n headers: NodeJS.Dict<string | string[]>,\n): Headers {\n const result = new Headers();\n for (const [key, value] of Object.entries(headers)) {\n if (key.startsWith(\":\") || value === undefined) {\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 isForbiddenHttp2Header(header: string): boolean {\n return (\n header.startsWith(\":\") ||\n header === \"connection\" ||\n header === \"keep-alive\" ||\n header === \"proxy-connection\" ||\n header === \"transfer-encoding\" ||\n header === \"upgrade\"\n );\n}\n\nfunction normalizeRequest(\n request: HttpRequest | string | URL,\n): NormalizedHttpRequest {\n if (typeof request === \"string\" || request instanceof URL) {\n return {\n body: undefined,\n headers: undefined,\n method: \"GET\",\n url: new URL(request),\n };\n }\n\n return {\n body: request.body,\n headers: request.headers,\n method: request.method ?? \"GET\",\n url: new URL(request.url),\n };\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\nasync function readText(body: Readable): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of body) {\n chunks.push(toBuffer(chunk));\n }\n\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nfunction toBuffer(chunk: unknown): Buffer {\n if (Buffer.isBuffer(chunk)) {\n return chunk;\n }\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk);\n }\n if (typeof chunk === \"string\") {\n return Buffer.from(chunk);\n }\n\n return Buffer.from(String(chunk));\n}\n\nasync function writeRequestBody(\n stream: NodeJS.WritableStream,\n body: BodyInit | undefined,\n): Promise<void> {\n if (typeof body === \"string\" || body instanceof Uint8Array) {\n stream.end(body);\n return;\n }\n if (body instanceof Blob) {\n stream.end(Buffer.from(new Uint8Array(await body.arrayBuffer())));\n return;\n }\n\n throw new HttpError(\"Unsupported HTTP request body\");\n}\n","import type { FanboxClientOptions } from \"./client-options.js\";\nimport {\n CREATOR_GET_PATH,\n type GetCreatorParams,\n type GetCreatorResult,\n} from \"./endpoints/creator-get.js\";\nimport {\n CREATOR_LIST_FOLLOWING_PATH,\n type ListFollowingCreatorsResult,\n} from \"./endpoints/creator-list-following.js\";\nimport type { FanboxEnvelope } from \"./endpoints/fanbox-envelope.js\";\nimport {\n type ListCreatorPlansParams,\n type ListCreatorPlansResult,\n PLAN_LIST_CREATOR_PATH,\n} from \"./endpoints/plan-list-creator.js\";\nimport {\n type ListSupportingPlansResult,\n PLAN_LIST_SUPPORTING_PATH,\n} from \"./endpoints/plan-list-supporting.js\";\nimport {\n type GetPostParams,\n type GetPostResult,\n POST_INFO_PATH,\n} from \"./endpoints/post-info.js\";\nimport {\n type ListCreatorPostsParams,\n type ListCreatorPostsResult,\n POST_LIST_CREATOR_PATH,\n} from \"./endpoints/post-list-creator.js\";\nimport {\n type ListHomePostsParams,\n type ListHomePostsResult,\n POST_LIST_HOME_PATH,\n} from \"./endpoints/post-list-home.js\";\nimport {\n type ListSupportingPostsParams,\n type ListSupportingPostsResult,\n POST_LIST_SUPPORTING_PATH,\n} from \"./endpoints/post-list-supporting.js\";\nimport {\n type PaginateCreatorPostsParams,\n type PaginateCreatorPostsResult,\n POST_PAGINATE_CREATOR_PATH,\n} from \"./endpoints/post-paginate-creator.js\";\nimport { createFanboxRequestHeaders } from \"./fanbox-headers.js\";\nimport {\n Http2Transport,\n type HttpResponse,\n type HttpTransport,\n} from \"./http.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.fanbox.cc\";\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: HttpResponse, 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 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 = createFanboxRequestHeaders({\n cookie: options.cookie,\n userAgent: options.userAgent,\n });\n this.#transport = options.transport ?? new Http2Transport();\n }\n\n public getCreator(params: GetCreatorParams): Promise<GetCreatorResult> {\n return this.#get(CREATOR_GET_PATH, params);\n }\n\n public getPost(params: GetPostParams): Promise<GetPostResult> {\n return this.#get(POST_INFO_PATH, params);\n }\n\n public listCreatorPlans(\n params: ListCreatorPlansParams,\n ): Promise<ListCreatorPlansResult> {\n return this.#get(PLAN_LIST_CREATOR_PATH, params);\n }\n\n public listCreatorPosts(\n params: ListCreatorPostsParams,\n ): Promise<ListCreatorPostsResult> {\n return this.#get(POST_LIST_CREATOR_PATH, params);\n }\n\n public listFollowingCreators(): Promise<ListFollowingCreatorsResult> {\n return this.#get(CREATOR_LIST_FOLLOWING_PATH);\n }\n\n public listHomePosts(\n params: ListHomePostsParams = {},\n ): Promise<ListHomePostsResult> {\n return this.#get(POST_LIST_HOME_PATH, params);\n }\n\n public listSupportingPlans(): Promise<ListSupportingPlansResult> {\n return this.#get(PLAN_LIST_SUPPORTING_PATH);\n }\n\n public listSupportingPosts(\n params: ListSupportingPostsParams = {},\n ): Promise<ListSupportingPostsResult> {\n return this.#get(POST_LIST_SUPPORTING_PATH, params);\n }\n\n public paginateCreatorPosts(\n params: PaginateCreatorPostsParams,\n ): Promise<PaginateCreatorPostsResult> {\n return this.#get(POST_PAGINATE_CREATOR_PATH, params);\n }\n\n 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 response = await this.#transport.request({\n headers: this.#headers,\n method: \"GET\",\n url,\n });\n const body = await readResponseBody(response);\n if (!response.ok) {\n throw new FanboxApiError(response, body);\n }\n\n return (body as FanboxEnvelope<T>).body;\n }\n}\n\nasync function readResponseBody(response: HttpResponse): Promise<unknown> {\n const text = await response.text();\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n"],"mappings":"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","names":["index_exports","__export","FanboxApiError","FanboxClient","__toCommonJS","CREATOR_GET_PATH","CREATOR_LIST_FOLLOWING_PATH","PLAN_LIST_CREATOR_PATH","PLAN_LIST_SUPPORTING_PATH","POST_INFO_PATH","POST_LIST_CREATOR_PATH","POST_LIST_HOME_PATH","POST_LIST_SUPPORTING_PATH","POST_PAGINATE_CREATOR_PATH","createFanboxRequestHeaders","options","headers","createRandomUserAgent","import_node_http2","HTTP2_HEADER_AUTHORITY","HTTP2_HEADER_METHOD","HTTP2_HEADER_PATH","HTTP2_HEADER_SCHEME","HTTP2_HEADER_STATUS","_sessions","_Http2Transport_instances","getSession_fn","Http2Transport","__privateAdd","sessions","__privateGet","closeSession","request","normalized","normalizeRequest","session","__privateMethod","headers","createHttp2Headers","stream","resolve","reject","settled","responseHeaders","status","parseStatus","createResponse","createResponseHeaders","HttpError","writeRequestBody","error","url","origin","existing","message","value","key","isForbiddenHttp2Header","options","readText","result","item","header","body","chunks","chunk","toBuffer","DEFAULT_BASE_URL","FanboxApiError","response","body","_baseUrl","_headers","_transport","_FanboxClient_instances","get_fn","FanboxClient","options","__privateAdd","__privateSet","createFanboxRequestHeaders","Http2Transport","params","__privateMethod","CREATOR_GET_PATH","POST_INFO_PATH","PLAN_LIST_CREATOR_PATH","POST_LIST_CREATOR_PATH","CREATOR_LIST_FOLLOWING_PATH","POST_LIST_HOME_PATH","PLAN_LIST_SUPPORTING_PATH","POST_LIST_SUPPORTING_PATH","POST_PAGINATE_CREATOR_PATH","path","query","url","__privateGet","key","value","readResponseBody","text"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/endpoints/creator-get.ts","../../src/endpoints/creator-list-following.ts","../../src/endpoints/plan-list-creator.ts","../../src/endpoints/plan-list-supporting.ts","../../src/endpoints/post-info.ts","../../src/endpoints/post-list-creator.ts","../../src/endpoints/post-list-home.ts","../../src/endpoints/post-list-supporting.ts","../../src/endpoints/post-paginate-creator.ts","../../src/fanbox-headers.ts","../../src/http.ts","../../src/client.ts"],"sourcesContent":["export { FanboxApiError, FanboxClient } from \"./client.js\";\nexport type * from \"./types.js\";\n","import type { Creator } from \"./models/creator.js\";\n\nexport const CREATOR_GET_PATH = \"creator.get\";\n\nexport interface GetCreatorParams {\n creatorId: string;\n}\n\nexport type GetCreatorResult = Creator;\n","import type { CreatorSummary } from \"./models/creator.js\";\n\nexport const CREATOR_LIST_FOLLOWING_PATH = \"creator.listFollowing\";\n\nexport interface ListFollowingCreatorsResult {\n creators: CreatorSummary[];\n}\n","import type { Plan } from \"./models/plan.js\";\n\nexport const PLAN_LIST_CREATOR_PATH = \"plan.listCreator\";\n\nexport interface ListCreatorPlansParams {\n creatorId: string;\n}\n\nexport type ListCreatorPlansResult = Plan[];\n","import type { SupportingPlan } from \"./models/plan.js\";\n\nexport const PLAN_LIST_SUPPORTING_PATH = \"plan.listSupporting\";\n\nexport type ListSupportingPlansResult = SupportingPlan[];\n","import type { Post } from \"./models/post.js\";\n\nexport const POST_INFO_PATH = \"post.info\";\n\nexport interface GetPostParams {\n postId: string;\n}\n\nexport type GetPostResult = Post;\n","import type { PostListParams, PostSort, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_CREATOR_PATH = \"post.listCreator\";\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","import type { PostListParams, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_HOME_PATH = \"post.listHome\";\n\nexport type ListHomePostsParams = PostListParams;\n\nexport type ListHomePostsResult = PostSummary[];\n","import type { PostListParams, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_SUPPORTING_PATH = \"post.listSupporting\";\n\nexport type ListSupportingPostsParams = PostListParams;\n\nexport type ListSupportingPostsResult = PostSummary[];\n","import type { PostSort } from \"./models/post.js\";\n\nexport const POST_PAGINATE_CREATOR_PATH = \"post.paginateCreator\";\n\nexport interface PaginateCreatorPostsParams {\n creatorId: string;\n sort?: PostSort;\n}\n\nexport type PaginateCreatorPostsResult = string[];\n","export interface FanboxRequestHeadersOptions {\n cookie?: string;\n userAgent?: string;\n}\n\nexport function createFanboxRequestHeaders(\n options: FanboxRequestHeadersOptions = {},\n): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json, text/plain, */*\",\n Origin: \"https://www.fanbox.cc\",\n Referer: \"https://www.fanbox.cc/\",\n \"Sec-Fetch-Dest\": \"empty\",\n \"Sec-Fetch-Mode\": \"cors\",\n \"Sec-Fetch-Site\": \"same-site\",\n \"User-Agent\": options.userAgent ?? createRandomUserAgent(),\n };\n if (options.cookie !== undefined) {\n headers.Cookie = options.cookie;\n }\n\n return headers;\n}\n\nexport function createRandomUserAgent(): string {\n return `${Math.random().toString(36).substring(2, 15)}/${Math.random().toFixed(5)}`;\n}\n","import { type ClientHttp2Session, connect } from \"node:http2\";\nimport type { Readable } from \"node:stream\";\n\nconst HTTP2_HEADER_AUTHORITY = \":authority\";\nconst HTTP2_HEADER_METHOD = \":method\";\nconst HTTP2_HEADER_PATH = \":path\";\nconst HTTP2_HEADER_SCHEME = \":scheme\";\nconst HTTP2_HEADER_STATUS = \":status\";\n\nexport interface HttpRequest {\n body?: BodyInit | undefined;\n headers?: Headers | Record<string, string>;\n method?: string;\n url: string | URL;\n}\n\nexport interface HttpResponse {\n body: Readable;\n headers: Headers;\n json(): Promise<unknown>;\n ok: boolean;\n status: number;\n statusText: string;\n text(): Promise<string>;\n}\n\nexport interface HttpTransport {\n close(): Promise<void>;\n request(request: HttpRequest | string | URL): Promise<HttpResponse>;\n}\n\ntype BodyInit = Blob | string | Uint8Array;\n\ninterface NormalizedHttpRequest {\n body: BodyInit | undefined;\n headers: Headers | Record<string, string> | undefined;\n method: string;\n url: URL;\n}\n\nexport class Http2Transport implements HttpTransport {\n readonly #sessions = new Map<string, ClientHttp2Session>();\n\n public async close(): Promise<void> {\n const sessions = [...this.#sessions.values()];\n this.#sessions.clear();\n await Promise.all(sessions.map(closeSession));\n }\n\n public request(request: HttpRequest | string | URL): Promise<HttpResponse> {\n const normalized = normalizeRequest(request);\n const session = this.#getSession(normalized.url);\n const headers = createHttp2Headers(normalized);\n const stream = session.request(headers, { endStream: !normalized.body });\n\n return new Promise((resolve, reject) => {\n let settled = false;\n stream.once(\"error\", reject);\n stream.once(\"response\", (responseHeaders) => {\n settled = true;\n const status = parseStatus(responseHeaders[HTTP2_HEADER_STATUS]);\n resolve(\n createResponse({\n body: stream,\n headers: createResponseHeaders(responseHeaders),\n status,\n }),\n );\n });\n stream.once(\"close\", () => {\n if (!settled) {\n reject(new HttpError(`HTTP/2 stream closed before response`));\n }\n });\n if (normalized.body !== undefined) {\n writeRequestBody(stream, normalized.body).catch((error: unknown) => {\n stream.destroy(\n error instanceof Error ? error : new Error(String(error)),\n );\n });\n }\n });\n }\n\n #getSession(url: URL): ClientHttp2Session {\n const origin = url.origin;\n const existing = this.#sessions.get(origin);\n if (existing && !existing.closed && !existing.destroyed) {\n return existing;\n }\n\n const session = connect(origin);\n session.once(\"close\", () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.delete(origin);\n }\n });\n session.once(\"error\", () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.delete(origin);\n }\n });\n this.#sessions.set(origin, session);\n\n return session;\n }\n}\n\nexport class HttpError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"HttpError\";\n }\n}\n\nfunction closeSession(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\nfunction createHttp2Headers(\n request: NormalizedHttpRequest,\n): Record<string, string> {\n const headers: Record<string, string> = {\n [HTTP2_HEADER_AUTHORITY]: request.url.host,\n [HTTP2_HEADER_METHOD]: request.method.toUpperCase(),\n [HTTP2_HEADER_PATH]: `${request.url.pathname}${request.url.search}`,\n [HTTP2_HEADER_SCHEME]: request.url.protocol.slice(0, -1),\n };\n new Headers(request.headers).forEach((value, key) => {\n if (!isForbiddenHttp2Header(key)) {\n headers[key] = value;\n }\n });\n\n return headers;\n}\n\nfunction createResponse(options: {\n body: Readable;\n headers: Headers;\n status: number;\n}): HttpResponse {\n return {\n body: options.body,\n headers: options.headers,\n json: async () => {\n const parsed: unknown = JSON.parse(await readText(options.body));\n return parsed;\n },\n ok: options.status >= 200 && options.status < 300,\n status: options.status,\n statusText: \"\",\n text: async () => readText(options.body),\n };\n}\n\nfunction createResponseHeaders(\n headers: NodeJS.Dict<string | string[]>,\n): Headers {\n const result = new Headers();\n for (const [key, value] of Object.entries(headers)) {\n if (key.startsWith(\":\") || value === undefined) {\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 isForbiddenHttp2Header(header: string): boolean {\n return (\n header.startsWith(\":\") ||\n header === \"connection\" ||\n header === \"keep-alive\" ||\n header === \"proxy-connection\" ||\n header === \"transfer-encoding\" ||\n header === \"upgrade\"\n );\n}\n\nfunction normalizeRequest(\n request: HttpRequest | string | URL,\n): NormalizedHttpRequest {\n if (typeof request === \"string\" || request instanceof URL) {\n return {\n body: undefined,\n headers: undefined,\n method: \"GET\",\n url: new URL(request),\n };\n }\n\n return {\n body: request.body,\n headers: request.headers,\n method: request.method ?? \"GET\",\n url: new URL(request.url),\n };\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\nasync function readText(body: Readable): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of body) {\n chunks.push(toBuffer(chunk));\n }\n\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nfunction toBuffer(chunk: unknown): Buffer {\n if (Buffer.isBuffer(chunk)) {\n return chunk;\n }\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk);\n }\n if (typeof chunk === \"string\") {\n return Buffer.from(chunk);\n }\n\n return Buffer.from(String(chunk));\n}\n\nasync function writeRequestBody(\n stream: NodeJS.WritableStream,\n body: BodyInit | undefined,\n): Promise<void> {\n if (typeof body === \"string\" || body instanceof Uint8Array) {\n stream.end(body);\n return;\n }\n if (body instanceof Blob) {\n stream.end(Buffer.from(new Uint8Array(await body.arrayBuffer())));\n return;\n }\n\n throw new HttpError(\"Unsupported HTTP request body\");\n}\n","import type { FanboxClientOptions } from \"./client-options.js\";\nimport {\n CREATOR_GET_PATH,\n type GetCreatorParams,\n type GetCreatorResult,\n} from \"./endpoints/creator-get.js\";\nimport {\n CREATOR_LIST_FOLLOWING_PATH,\n type ListFollowingCreatorsResult,\n} from \"./endpoints/creator-list-following.js\";\nimport type { FanboxEnvelope } from \"./endpoints/fanbox-envelope.js\";\nimport {\n type ListCreatorPlansParams,\n type ListCreatorPlansResult,\n PLAN_LIST_CREATOR_PATH,\n} from \"./endpoints/plan-list-creator.js\";\nimport {\n type ListSupportingPlansResult,\n PLAN_LIST_SUPPORTING_PATH,\n} from \"./endpoints/plan-list-supporting.js\";\nimport {\n type GetPostParams,\n type GetPostResult,\n POST_INFO_PATH,\n} from \"./endpoints/post-info.js\";\nimport {\n type ListCreatorPostsParams,\n type ListCreatorPostsResult,\n POST_LIST_CREATOR_PATH,\n} from \"./endpoints/post-list-creator.js\";\nimport {\n type ListHomePostsParams,\n type ListHomePostsResult,\n POST_LIST_HOME_PATH,\n} from \"./endpoints/post-list-home.js\";\nimport {\n type ListSupportingPostsParams,\n type ListSupportingPostsResult,\n POST_LIST_SUPPORTING_PATH,\n} from \"./endpoints/post-list-supporting.js\";\nimport {\n type PaginateCreatorPostsParams,\n type PaginateCreatorPostsResult,\n POST_PAGINATE_CREATOR_PATH,\n} from \"./endpoints/post-paginate-creator.js\";\nimport { createFanboxRequestHeaders } from \"./fanbox-headers.js\";\nimport {\n Http2Transport,\n type HttpResponse,\n type HttpTransport,\n} from \"./http.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.fanbox.cc\";\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: HttpResponse, 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 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 = createFanboxRequestHeaders({\n cookie: options.cookie,\n userAgent: options.userAgent,\n });\n this.#transport = options.transport ?? new Http2Transport();\n }\n\n public getCreator(params: GetCreatorParams): Promise<GetCreatorResult> {\n return this.#get(CREATOR_GET_PATH, params);\n }\n\n public getPost(params: GetPostParams): Promise<GetPostResult> {\n return this.#get(POST_INFO_PATH, params);\n }\n\n public listCreatorPlans(\n params: ListCreatorPlansParams,\n ): Promise<ListCreatorPlansResult> {\n return this.#get(PLAN_LIST_CREATOR_PATH, params);\n }\n\n public listCreatorPosts(\n params: ListCreatorPostsParams,\n ): Promise<ListCreatorPostsResult> {\n return this.#get(POST_LIST_CREATOR_PATH, params);\n }\n\n public listFollowingCreators(): Promise<ListFollowingCreatorsResult> {\n return this.#get(CREATOR_LIST_FOLLOWING_PATH);\n }\n\n public listHomePosts(\n params: ListHomePostsParams = {},\n ): Promise<ListHomePostsResult> {\n return this.#get(POST_LIST_HOME_PATH, params);\n }\n\n public listSupportingPlans(): Promise<ListSupportingPlansResult> {\n return this.#get(PLAN_LIST_SUPPORTING_PATH);\n }\n\n public listSupportingPosts(\n params: ListSupportingPostsParams = {},\n ): Promise<ListSupportingPostsResult> {\n return this.#get(POST_LIST_SUPPORTING_PATH, params);\n }\n\n public paginateCreatorPosts(\n params: PaginateCreatorPostsParams,\n ): Promise<PaginateCreatorPostsResult> {\n return this.#get(POST_PAGINATE_CREATOR_PATH, params);\n }\n\n 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 response = await this.#transport.request({\n headers: this.#headers,\n method: \"GET\",\n url,\n });\n const body = await readResponseBody(response);\n if (!response.ok) {\n throw new FanboxApiError(response, body);\n }\n\n return (body as FanboxEnvelope<T>).body;\n }\n}\n\nasync function readResponseBody(response: HttpResponse): Promise<unknown> {\n const text = await response.text();\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n"],"mappings":"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","names":["index_exports","__export","FanboxApiError","FanboxClient","__toCommonJS","CREATOR_GET_PATH","CREATOR_LIST_FOLLOWING_PATH","PLAN_LIST_CREATOR_PATH","PLAN_LIST_SUPPORTING_PATH","POST_INFO_PATH","POST_LIST_CREATOR_PATH","POST_LIST_HOME_PATH","POST_LIST_SUPPORTING_PATH","POST_PAGINATE_CREATOR_PATH","createFanboxRequestHeaders","options","headers","createRandomUserAgent","import_node_http2","HTTP2_HEADER_AUTHORITY","HTTP2_HEADER_METHOD","HTTP2_HEADER_PATH","HTTP2_HEADER_SCHEME","HTTP2_HEADER_STATUS","_sessions","_Http2Transport_instances","getSession_fn","Http2Transport","__privateAdd","sessions","__privateGet","closeSession","request","normalized","normalizeRequest","session","__privateMethod","headers","createHttp2Headers","stream","resolve","reject","settled","responseHeaders","status","parseStatus","createResponse","createResponseHeaders","HttpError","writeRequestBody","error","url","origin","existing","message","value","key","isForbiddenHttp2Header","options","readText","result","item","header","body","chunks","chunk","toBuffer","DEFAULT_BASE_URL","FanboxApiError","response","body","_baseUrl","_headers","_transport","_FanboxClient_instances","get_fn","FanboxClient","options","__privateAdd","__privateSet","createFanboxRequestHeaders","Http2Transport","params","__privateMethod","CREATOR_GET_PATH","POST_INFO_PATH","PLAN_LIST_CREATOR_PATH","POST_LIST_CREATOR_PATH","CREATOR_LIST_FOLLOWING_PATH","POST_LIST_HOME_PATH","PLAN_LIST_SUPPORTING_PATH","POST_LIST_SUPPORTING_PATH","POST_PAGINATE_CREATOR_PATH","path","query","url","__privateGet","key","value","readResponseBody","text"]}
@@ -80,7 +80,9 @@ interface GetCreatorParams {
80
80
  type GetCreatorResult = Creator;
81
81
 
82
82
  declare const CREATOR_LIST_FOLLOWING_PATH = "creator.listFollowing";
83
- type ListFollowingCreatorsResult = CreatorSummary[];
83
+ interface ListFollowingCreatorsResult {
84
+ creators: CreatorSummary[];
85
+ }
84
86
 
85
87
  interface Plan {
86
88
  coverImageUrl: null | string;
@@ -80,7 +80,9 @@ interface GetCreatorParams {
80
80
  type GetCreatorResult = Creator;
81
81
 
82
82
  declare const CREATOR_LIST_FOLLOWING_PATH = "creator.listFollowing";
83
- type ListFollowingCreatorsResult = CreatorSummary[];
83
+ interface ListFollowingCreatorsResult {
84
+ creators: CreatorSummary[];
85
+ }
84
86
 
85
87
  interface Plan {
86
88
  coverImageUrl: null | string;
@@ -1,2 +1,2 @@
1
- var A=t=>{throw TypeError(t)};var h=(t,e,r)=>e.has(t)||A("Cannot "+r);var o=(t,e,r)=>(h(t,e,"read from private field"),r?r.call(t):e.get(t)),P=(t,e,r)=>e.has(t)?A("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),R=(t,e,r,s)=>(h(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r),i=(t,e,r)=>(h(t,e,"access private method"),r);var _="creator.get";var C="creator.listFollowing";var O="plan.listCreator";var w="plan.listSupporting";var E="post.info";var I="post.listCreator";var U="post.listHome";var F="post.listSupporting";var G="post.paginateCreator";function N(t={}){let e={Accept:"application/json, text/plain, */*",Origin:"https://www.fanbox.cc",Referer:"https://www.fanbox.cc/","Sec-Fetch-Dest":"empty","Sec-Fetch-Mode":"cors","Sec-Fetch-Site":"same-site","User-Agent":t.userAgent??v()};return t.cookie!==void 0&&(e.Cookie=t.cookie),e}function v(){return`${Math.random().toString(36).substring(2,15)}/${Math.random().toFixed(5)}`}import{connect as D}from"http2";var q=":authority",M=":method",$=":path",W=":scheme",z=":status",p,H,j,g=class{constructor(){P(this,H);P(this,p,new Map)}async close(){let e=[...o(this,p).values()];o(this,p).clear(),await Promise.all(e.map(J))}request(e){let r=V(e),s=i(this,H,j).call(this,r.url),n=X(r),m=s.request(n,{endStream:!r.body});return new Promise((b,d)=>{let L=!1;m.once("error",d),m.once("response",l=>{L=!0;let k=Z(l[z]);b(Y({body:m,headers:K(l),status:k}))}),m.once("close",()=>{L||d(new T("HTTP/2 stream closed before response"))}),r.body!==void 0&&et(m,r.body).catch(l=>{m.destroy(l instanceof Error?l:new Error(String(l)))})})}};p=new WeakMap,H=new WeakSet,j=function(e){let r=e.origin,s=o(this,p).get(r);if(s&&!s.closed&&!s.destroyed)return s;let n=D(r);return n.once("close",()=>{o(this,p).get(r)===n&&o(this,p).delete(r)}),n.once("error",()=>{o(this,p).get(r)===n&&o(this,p).delete(r)}),o(this,p).set(r,n),n};var T=class extends Error{constructor(e){super(e),this.name="HttpError"}};function J(t){return t.closed||t.destroyed?Promise.resolve():new Promise(e=>{t.close(e)})}function X(t){let e={[q]:t.url.host,[M]:t.method.toUpperCase(),[$]:`${t.url.pathname}${t.url.search}`,[W]:t.url.protocol.slice(0,-1)};return new Headers(t.headers).forEach((r,s)=>{Q(s)||(e[s]=r)}),e}function Y(t){return{body:t.body,headers:t.headers,json:async()=>JSON.parse(await B(t.body)),ok:t.status>=200&&t.status<300,status:t.status,statusText:"",text:async()=>B(t.body)}}function K(t){let e=new Headers;for(let[r,s]of Object.entries(t))if(!(r.startsWith(":")||s===void 0))if(Array.isArray(s))for(let n of s)e.append(r,n);else e.set(r,s);return e}function Q(t){return t.startsWith(":")||t==="connection"||t==="keep-alive"||t==="proxy-connection"||t==="transfer-encoding"||t==="upgrade"}function V(t){return typeof t=="string"||t instanceof URL?{body:void 0,headers:void 0,method:"GET",url:new URL(t)}:{body:t.body,headers:t.headers,method:t.method??"GET",url:new URL(t.url)}}function Z(t){return typeof t=="number"?t:Array.isArray(t)?Number(t[0]??0):Number(t??0)}async function B(t){let e=[];for await(let r of t)e.push(tt(r));return Buffer.concat(e).toString("utf8")}function tt(t){return Buffer.isBuffer(t)?t:t instanceof Uint8Array||typeof t=="string"?Buffer.from(t):Buffer.from(String(t))}async function et(t,e){if(typeof e=="string"||e instanceof Uint8Array){t.end(e);return}if(e instanceof Blob){t.end(Buffer.from(new Uint8Array(await e.arrayBuffer())));return}throw new T("Unsupported HTTP request body")}var rt="https://api.fanbox.cc",S=class extends Error{constructor(e,r){super(`FANBOX API request failed: ${e.status} ${e.statusText}`),this.name="FanboxApiError",this.body=r,this.status=e.status,this.statusText=e.statusText}},c,f,y,a,u,x=class{constructor(e={}){P(this,a);P(this,c);P(this,f);P(this,y);R(this,c,e.baseUrl??rt),R(this,f,N({cookie:e.cookie,userAgent:e.userAgent})),R(this,y,e.transport??new g)}getCreator(e){return i(this,a,u).call(this,_,e)}getPost(e){return i(this,a,u).call(this,E,e)}listCreatorPlans(e){return i(this,a,u).call(this,O,e)}listCreatorPosts(e){return i(this,a,u).call(this,I,e)}listFollowingCreators(){return i(this,a,u).call(this,C)}listHomePosts(e={}){return i(this,a,u).call(this,U,e)}listSupportingPlans(){return i(this,a,u).call(this,w)}listSupportingPosts(e={}){return i(this,a,u).call(this,F,e)}paginateCreatorPosts(e){return i(this,a,u).call(this,G,e)}};c=new WeakMap,f=new WeakMap,y=new WeakMap,a=new WeakSet,u=async function(e,r={}){let s=new URL(e,o(this,c).endsWith("/")?o(this,c):`${o(this,c)}/`);for(let[b,d]of Object.entries(r))d!==void 0&&s.searchParams.set(b,String(d));let n=await o(this,y).request({headers:o(this,f),method:"GET",url:s}),m=await st(n);if(!n.ok)throw new S(n,m);return m.body};async function st(t){let e=await t.text();try{return JSON.parse(e)}catch{return e}}export{S as FanboxApiError,x as FanboxClient};
1
+ var A=t=>{throw TypeError(t)};var h=(t,e,r)=>e.has(t)||A("Cannot "+r);var o=(t,e,r)=>(h(t,e,"read from private field"),r?r.call(t):e.get(t)),m=(t,e,r)=>e.has(t)?A("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),R=(t,e,r,s)=>(h(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r),i=(t,e,r)=>(h(t,e,"access private method"),r);var _="creator.get";var C="creator.listFollowing";var O="plan.listCreator";var w="plan.listSupporting";var E="post.info";var I="post.listCreator";var U="post.listHome";var F="post.listSupporting";var G="post.paginateCreator";function N(t={}){let e={Accept:"application/json, text/plain, */*",Origin:"https://www.fanbox.cc",Referer:"https://www.fanbox.cc/","Sec-Fetch-Dest":"empty","Sec-Fetch-Mode":"cors","Sec-Fetch-Site":"same-site","User-Agent":t.userAgent??v()};return t.cookie!==void 0&&(e.Cookie=t.cookie),e}function v(){return`${Math.random().toString(36).substring(2,15)}/${Math.random().toFixed(5)}`}import{connect as D}from"http2";var q=":authority",M=":method",$=":path",W=":scheme",z=":status",p,H,j,g=class{constructor(){m(this,H);m(this,p,new Map)}async close(){let e=[...o(this,p).values()];o(this,p).clear(),await Promise.all(e.map(J))}request(e){let r=V(e),s=i(this,H,j).call(this,r.url),n=X(r),c=s.request(n,{endStream:!r.body});return new Promise((b,d)=>{let L=!1;c.once("error",d),c.once("response",l=>{L=!0;let k=Z(l[z]);b(Y({body:c,headers:K(l),status:k}))}),c.once("close",()=>{L||d(new T("HTTP/2 stream closed before response"))}),r.body!==void 0&&et(c,r.body).catch(l=>{c.destroy(l instanceof Error?l:new Error(String(l)))})})}};p=new WeakMap,H=new WeakSet,j=function(e){let r=e.origin,s=o(this,p).get(r);if(s&&!s.closed&&!s.destroyed)return s;let n=D(r);return n.once("close",()=>{o(this,p).get(r)===n&&o(this,p).delete(r)}),n.once("error",()=>{o(this,p).get(r)===n&&o(this,p).delete(r)}),o(this,p).set(r,n),n};var T=class extends Error{constructor(e){super(e),this.name="HttpError"}};function J(t){return t.closed||t.destroyed?Promise.resolve():new Promise(e=>{t.close(e)})}function X(t){let e={[q]:t.url.host,[M]:t.method.toUpperCase(),[$]:`${t.url.pathname}${t.url.search}`,[W]:t.url.protocol.slice(0,-1)};return new Headers(t.headers).forEach((r,s)=>{Q(s)||(e[s]=r)}),e}function Y(t){return{body:t.body,headers:t.headers,json:async()=>JSON.parse(await B(t.body)),ok:t.status>=200&&t.status<300,status:t.status,statusText:"",text:async()=>B(t.body)}}function K(t){let e=new Headers;for(let[r,s]of Object.entries(t))if(!(r.startsWith(":")||s===void 0))if(Array.isArray(s))for(let n of s)e.append(r,n);else e.set(r,s);return e}function Q(t){return t.startsWith(":")||t==="connection"||t==="keep-alive"||t==="proxy-connection"||t==="transfer-encoding"||t==="upgrade"}function V(t){return typeof t=="string"||t instanceof URL?{body:void 0,headers:void 0,method:"GET",url:new URL(t)}:{body:t.body,headers:t.headers,method:t.method??"GET",url:new URL(t.url)}}function Z(t){return typeof t=="number"?t:Array.isArray(t)?Number(t[0]??0):Number(t??0)}async function B(t){let e=[];for await(let r of t)e.push(tt(r));return Buffer.concat(e).toString("utf8")}function tt(t){return Buffer.isBuffer(t)?t:t instanceof Uint8Array||typeof t=="string"?Buffer.from(t):Buffer.from(String(t))}async function et(t,e){if(typeof e=="string"||e instanceof Uint8Array){t.end(e);return}if(e instanceof Blob){t.end(Buffer.from(new Uint8Array(await e.arrayBuffer())));return}throw new T("Unsupported HTTP request body")}var rt="https://api.fanbox.cc",S=class extends Error{constructor(e,r){super(`FANBOX API request failed: ${e.status} ${e.statusText}`),this.name="FanboxApiError",this.body=r,this.status=e.status,this.statusText=e.statusText}},P,f,y,a,u,x=class{constructor(e={}){m(this,a);m(this,P);m(this,f);m(this,y);R(this,P,e.baseUrl??rt),R(this,f,N({cookie:e.cookie,userAgent:e.userAgent})),R(this,y,e.transport??new g)}getCreator(e){return i(this,a,u).call(this,_,e)}getPost(e){return i(this,a,u).call(this,E,e)}listCreatorPlans(e){return i(this,a,u).call(this,O,e)}listCreatorPosts(e){return i(this,a,u).call(this,I,e)}listFollowingCreators(){return i(this,a,u).call(this,C)}listHomePosts(e={}){return i(this,a,u).call(this,U,e)}listSupportingPlans(){return i(this,a,u).call(this,w)}listSupportingPosts(e={}){return i(this,a,u).call(this,F,e)}paginateCreatorPosts(e){return i(this,a,u).call(this,G,e)}};P=new WeakMap,f=new WeakMap,y=new WeakMap,a=new WeakSet,u=async function(e,r={}){let s=new URL(e,o(this,P).endsWith("/")?o(this,P):`${o(this,P)}/`);for(let[b,d]of Object.entries(r))d!==void 0&&s.searchParams.set(b,String(d));let n=await o(this,y).request({headers:o(this,f),method:"GET",url:s}),c=await st(n);if(!n.ok)throw new S(n,c);return c.body};async function st(t){let e=await t.text();try{return JSON.parse(e)}catch{return e}}export{S as FanboxApiError,x as FanboxClient};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/endpoints/creator-get.ts","../../src/endpoints/creator-list-following.ts","../../src/endpoints/plan-list-creator.ts","../../src/endpoints/plan-list-supporting.ts","../../src/endpoints/post-info.ts","../../src/endpoints/post-list-creator.ts","../../src/endpoints/post-list-home.ts","../../src/endpoints/post-list-supporting.ts","../../src/endpoints/post-paginate-creator.ts","../../src/fanbox-headers.ts","../../src/http.ts","../../src/client.ts"],"sourcesContent":["import type { Creator } from \"./models/creator.js\";\n\nexport const CREATOR_GET_PATH = \"creator.get\";\n\nexport interface GetCreatorParams {\n creatorId: string;\n}\n\nexport type GetCreatorResult = Creator;\n","import type { CreatorSummary } from \"./models/creator.js\";\n\nexport const CREATOR_LIST_FOLLOWING_PATH = \"creator.listFollowing\";\n\nexport type ListFollowingCreatorsResult = CreatorSummary[];\n","import type { Plan } from \"./models/plan.js\";\n\nexport const PLAN_LIST_CREATOR_PATH = \"plan.listCreator\";\n\nexport interface ListCreatorPlansParams {\n creatorId: string;\n}\n\nexport type ListCreatorPlansResult = Plan[];\n","import type { SupportingPlan } from \"./models/plan.js\";\n\nexport const PLAN_LIST_SUPPORTING_PATH = \"plan.listSupporting\";\n\nexport type ListSupportingPlansResult = SupportingPlan[];\n","import type { Post } from \"./models/post.js\";\n\nexport const POST_INFO_PATH = \"post.info\";\n\nexport interface GetPostParams {\n postId: string;\n}\n\nexport type GetPostResult = Post;\n","import type { PostListParams, PostSort, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_CREATOR_PATH = \"post.listCreator\";\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","import type { PostListParams, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_HOME_PATH = \"post.listHome\";\n\nexport type ListHomePostsParams = PostListParams;\n\nexport type ListHomePostsResult = PostSummary[];\n","import type { PostListParams, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_SUPPORTING_PATH = \"post.listSupporting\";\n\nexport type ListSupportingPostsParams = PostListParams;\n\nexport type ListSupportingPostsResult = PostSummary[];\n","import type { PostSort } from \"./models/post.js\";\n\nexport const POST_PAGINATE_CREATOR_PATH = \"post.paginateCreator\";\n\nexport interface PaginateCreatorPostsParams {\n creatorId: string;\n sort?: PostSort;\n}\n\nexport type PaginateCreatorPostsResult = string[];\n","export interface FanboxRequestHeadersOptions {\n cookie?: string;\n userAgent?: string;\n}\n\nexport function createFanboxRequestHeaders(\n options: FanboxRequestHeadersOptions = {},\n): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json, text/plain, */*\",\n Origin: \"https://www.fanbox.cc\",\n Referer: \"https://www.fanbox.cc/\",\n \"Sec-Fetch-Dest\": \"empty\",\n \"Sec-Fetch-Mode\": \"cors\",\n \"Sec-Fetch-Site\": \"same-site\",\n \"User-Agent\": options.userAgent ?? createRandomUserAgent(),\n };\n if (options.cookie !== undefined) {\n headers.Cookie = options.cookie;\n }\n\n return headers;\n}\n\nexport function createRandomUserAgent(): string {\n return `${Math.random().toString(36).substring(2, 15)}/${Math.random().toFixed(5)}`;\n}\n","import { type ClientHttp2Session, connect } from \"node:http2\";\nimport type { Readable } from \"node:stream\";\n\nconst HTTP2_HEADER_AUTHORITY = \":authority\";\nconst HTTP2_HEADER_METHOD = \":method\";\nconst HTTP2_HEADER_PATH = \":path\";\nconst HTTP2_HEADER_SCHEME = \":scheme\";\nconst HTTP2_HEADER_STATUS = \":status\";\n\nexport interface HttpRequest {\n body?: BodyInit | undefined;\n headers?: Headers | Record<string, string>;\n method?: string;\n url: string | URL;\n}\n\nexport interface HttpResponse {\n body: Readable;\n headers: Headers;\n json(): Promise<unknown>;\n ok: boolean;\n status: number;\n statusText: string;\n text(): Promise<string>;\n}\n\nexport interface HttpTransport {\n close(): Promise<void>;\n request(request: HttpRequest | string | URL): Promise<HttpResponse>;\n}\n\ntype BodyInit = Blob | string | Uint8Array;\n\ninterface NormalizedHttpRequest {\n body: BodyInit | undefined;\n headers: Headers | Record<string, string> | undefined;\n method: string;\n url: URL;\n}\n\nexport class Http2Transport implements HttpTransport {\n readonly #sessions = new Map<string, ClientHttp2Session>();\n\n public async close(): Promise<void> {\n const sessions = [...this.#sessions.values()];\n this.#sessions.clear();\n await Promise.all(sessions.map(closeSession));\n }\n\n public request(request: HttpRequest | string | URL): Promise<HttpResponse> {\n const normalized = normalizeRequest(request);\n const session = this.#getSession(normalized.url);\n const headers = createHttp2Headers(normalized);\n const stream = session.request(headers, { endStream: !normalized.body });\n\n return new Promise((resolve, reject) => {\n let settled = false;\n stream.once(\"error\", reject);\n stream.once(\"response\", (responseHeaders) => {\n settled = true;\n const status = parseStatus(responseHeaders[HTTP2_HEADER_STATUS]);\n resolve(\n createResponse({\n body: stream,\n headers: createResponseHeaders(responseHeaders),\n status,\n }),\n );\n });\n stream.once(\"close\", () => {\n if (!settled) {\n reject(new HttpError(`HTTP/2 stream closed before response`));\n }\n });\n if (normalized.body !== undefined) {\n writeRequestBody(stream, normalized.body).catch((error: unknown) => {\n stream.destroy(\n error instanceof Error ? error : new Error(String(error)),\n );\n });\n }\n });\n }\n\n #getSession(url: URL): ClientHttp2Session {\n const origin = url.origin;\n const existing = this.#sessions.get(origin);\n if (existing && !existing.closed && !existing.destroyed) {\n return existing;\n }\n\n const session = connect(origin);\n session.once(\"close\", () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.delete(origin);\n }\n });\n session.once(\"error\", () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.delete(origin);\n }\n });\n this.#sessions.set(origin, session);\n\n return session;\n }\n}\n\nexport class HttpError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"HttpError\";\n }\n}\n\nfunction closeSession(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\nfunction createHttp2Headers(\n request: NormalizedHttpRequest,\n): Record<string, string> {\n const headers: Record<string, string> = {\n [HTTP2_HEADER_AUTHORITY]: request.url.host,\n [HTTP2_HEADER_METHOD]: request.method.toUpperCase(),\n [HTTP2_HEADER_PATH]: `${request.url.pathname}${request.url.search}`,\n [HTTP2_HEADER_SCHEME]: request.url.protocol.slice(0, -1),\n };\n new Headers(request.headers).forEach((value, key) => {\n if (!isForbiddenHttp2Header(key)) {\n headers[key] = value;\n }\n });\n\n return headers;\n}\n\nfunction createResponse(options: {\n body: Readable;\n headers: Headers;\n status: number;\n}): HttpResponse {\n return {\n body: options.body,\n headers: options.headers,\n json: async () => {\n const parsed: unknown = JSON.parse(await readText(options.body));\n return parsed;\n },\n ok: options.status >= 200 && options.status < 300,\n status: options.status,\n statusText: \"\",\n text: async () => readText(options.body),\n };\n}\n\nfunction createResponseHeaders(\n headers: NodeJS.Dict<string | string[]>,\n): Headers {\n const result = new Headers();\n for (const [key, value] of Object.entries(headers)) {\n if (key.startsWith(\":\") || value === undefined) {\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 isForbiddenHttp2Header(header: string): boolean {\n return (\n header.startsWith(\":\") ||\n header === \"connection\" ||\n header === \"keep-alive\" ||\n header === \"proxy-connection\" ||\n header === \"transfer-encoding\" ||\n header === \"upgrade\"\n );\n}\n\nfunction normalizeRequest(\n request: HttpRequest | string | URL,\n): NormalizedHttpRequest {\n if (typeof request === \"string\" || request instanceof URL) {\n return {\n body: undefined,\n headers: undefined,\n method: \"GET\",\n url: new URL(request),\n };\n }\n\n return {\n body: request.body,\n headers: request.headers,\n method: request.method ?? \"GET\",\n url: new URL(request.url),\n };\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\nasync function readText(body: Readable): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of body) {\n chunks.push(toBuffer(chunk));\n }\n\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nfunction toBuffer(chunk: unknown): Buffer {\n if (Buffer.isBuffer(chunk)) {\n return chunk;\n }\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk);\n }\n if (typeof chunk === \"string\") {\n return Buffer.from(chunk);\n }\n\n return Buffer.from(String(chunk));\n}\n\nasync function writeRequestBody(\n stream: NodeJS.WritableStream,\n body: BodyInit | undefined,\n): Promise<void> {\n if (typeof body === \"string\" || body instanceof Uint8Array) {\n stream.end(body);\n return;\n }\n if (body instanceof Blob) {\n stream.end(Buffer.from(new Uint8Array(await body.arrayBuffer())));\n return;\n }\n\n throw new HttpError(\"Unsupported HTTP request body\");\n}\n","import type { FanboxClientOptions } from \"./client-options.js\";\nimport {\n CREATOR_GET_PATH,\n type GetCreatorParams,\n type GetCreatorResult,\n} from \"./endpoints/creator-get.js\";\nimport {\n CREATOR_LIST_FOLLOWING_PATH,\n type ListFollowingCreatorsResult,\n} from \"./endpoints/creator-list-following.js\";\nimport type { FanboxEnvelope } from \"./endpoints/fanbox-envelope.js\";\nimport {\n type ListCreatorPlansParams,\n type ListCreatorPlansResult,\n PLAN_LIST_CREATOR_PATH,\n} from \"./endpoints/plan-list-creator.js\";\nimport {\n type ListSupportingPlansResult,\n PLAN_LIST_SUPPORTING_PATH,\n} from \"./endpoints/plan-list-supporting.js\";\nimport {\n type GetPostParams,\n type GetPostResult,\n POST_INFO_PATH,\n} from \"./endpoints/post-info.js\";\nimport {\n type ListCreatorPostsParams,\n type ListCreatorPostsResult,\n POST_LIST_CREATOR_PATH,\n} from \"./endpoints/post-list-creator.js\";\nimport {\n type ListHomePostsParams,\n type ListHomePostsResult,\n POST_LIST_HOME_PATH,\n} from \"./endpoints/post-list-home.js\";\nimport {\n type ListSupportingPostsParams,\n type ListSupportingPostsResult,\n POST_LIST_SUPPORTING_PATH,\n} from \"./endpoints/post-list-supporting.js\";\nimport {\n type PaginateCreatorPostsParams,\n type PaginateCreatorPostsResult,\n POST_PAGINATE_CREATOR_PATH,\n} from \"./endpoints/post-paginate-creator.js\";\nimport { createFanboxRequestHeaders } from \"./fanbox-headers.js\";\nimport {\n Http2Transport,\n type HttpResponse,\n type HttpTransport,\n} from \"./http.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.fanbox.cc\";\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: HttpResponse, 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 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 = createFanboxRequestHeaders({\n cookie: options.cookie,\n userAgent: options.userAgent,\n });\n this.#transport = options.transport ?? new Http2Transport();\n }\n\n public getCreator(params: GetCreatorParams): Promise<GetCreatorResult> {\n return this.#get(CREATOR_GET_PATH, params);\n }\n\n public getPost(params: GetPostParams): Promise<GetPostResult> {\n return this.#get(POST_INFO_PATH, params);\n }\n\n public listCreatorPlans(\n params: ListCreatorPlansParams,\n ): Promise<ListCreatorPlansResult> {\n return this.#get(PLAN_LIST_CREATOR_PATH, params);\n }\n\n public listCreatorPosts(\n params: ListCreatorPostsParams,\n ): Promise<ListCreatorPostsResult> {\n return this.#get(POST_LIST_CREATOR_PATH, params);\n }\n\n public listFollowingCreators(): Promise<ListFollowingCreatorsResult> {\n return this.#get(CREATOR_LIST_FOLLOWING_PATH);\n }\n\n public listHomePosts(\n params: ListHomePostsParams = {},\n ): Promise<ListHomePostsResult> {\n return this.#get(POST_LIST_HOME_PATH, params);\n }\n\n public listSupportingPlans(): Promise<ListSupportingPlansResult> {\n return this.#get(PLAN_LIST_SUPPORTING_PATH);\n }\n\n public listSupportingPosts(\n params: ListSupportingPostsParams = {},\n ): Promise<ListSupportingPostsResult> {\n return this.#get(POST_LIST_SUPPORTING_PATH, params);\n }\n\n public paginateCreatorPosts(\n params: PaginateCreatorPostsParams,\n ): Promise<PaginateCreatorPostsResult> {\n return this.#get(POST_PAGINATE_CREATOR_PATH, params);\n }\n\n 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 response = await this.#transport.request({\n headers: this.#headers,\n method: \"GET\",\n url,\n });\n const body = await readResponseBody(response);\n if (!response.ok) {\n throw new FanboxApiError(response, body);\n }\n\n return (body as FanboxEnvelope<T>).body;\n }\n}\n\nasync function readResponseBody(response: HttpResponse): Promise<unknown> {\n const text = await response.text();\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n"],"mappings":"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","names":["CREATOR_GET_PATH","CREATOR_LIST_FOLLOWING_PATH","PLAN_LIST_CREATOR_PATH","PLAN_LIST_SUPPORTING_PATH","POST_INFO_PATH","POST_LIST_CREATOR_PATH","POST_LIST_HOME_PATH","POST_LIST_SUPPORTING_PATH","POST_PAGINATE_CREATOR_PATH","createFanboxRequestHeaders","options","headers","createRandomUserAgent","connect","HTTP2_HEADER_AUTHORITY","HTTP2_HEADER_METHOD","HTTP2_HEADER_PATH","HTTP2_HEADER_SCHEME","HTTP2_HEADER_STATUS","_sessions","_Http2Transport_instances","getSession_fn","Http2Transport","__privateAdd","sessions","__privateGet","closeSession","request","normalized","normalizeRequest","session","__privateMethod","headers","createHttp2Headers","stream","resolve","reject","settled","responseHeaders","status","parseStatus","createResponse","createResponseHeaders","HttpError","writeRequestBody","error","url","origin","existing","connect","message","value","key","isForbiddenHttp2Header","options","readText","result","item","header","body","chunks","chunk","toBuffer","DEFAULT_BASE_URL","FanboxApiError","response","body","_baseUrl","_headers","_transport","_FanboxClient_instances","get_fn","FanboxClient","options","__privateAdd","__privateSet","createFanboxRequestHeaders","Http2Transport","params","__privateMethod","CREATOR_GET_PATH","POST_INFO_PATH","PLAN_LIST_CREATOR_PATH","POST_LIST_CREATOR_PATH","CREATOR_LIST_FOLLOWING_PATH","POST_LIST_HOME_PATH","PLAN_LIST_SUPPORTING_PATH","POST_LIST_SUPPORTING_PATH","POST_PAGINATE_CREATOR_PATH","path","query","url","__privateGet","key","value","readResponseBody","text"]}
1
+ {"version":3,"sources":["../../src/endpoints/creator-get.ts","../../src/endpoints/creator-list-following.ts","../../src/endpoints/plan-list-creator.ts","../../src/endpoints/plan-list-supporting.ts","../../src/endpoints/post-info.ts","../../src/endpoints/post-list-creator.ts","../../src/endpoints/post-list-home.ts","../../src/endpoints/post-list-supporting.ts","../../src/endpoints/post-paginate-creator.ts","../../src/fanbox-headers.ts","../../src/http.ts","../../src/client.ts"],"sourcesContent":["import type { Creator } from \"./models/creator.js\";\n\nexport const CREATOR_GET_PATH = \"creator.get\";\n\nexport interface GetCreatorParams {\n creatorId: string;\n}\n\nexport type GetCreatorResult = Creator;\n","import type { CreatorSummary } from \"./models/creator.js\";\n\nexport const CREATOR_LIST_FOLLOWING_PATH = \"creator.listFollowing\";\n\nexport interface ListFollowingCreatorsResult {\n creators: CreatorSummary[];\n}\n","import type { Plan } from \"./models/plan.js\";\n\nexport const PLAN_LIST_CREATOR_PATH = \"plan.listCreator\";\n\nexport interface ListCreatorPlansParams {\n creatorId: string;\n}\n\nexport type ListCreatorPlansResult = Plan[];\n","import type { SupportingPlan } from \"./models/plan.js\";\n\nexport const PLAN_LIST_SUPPORTING_PATH = \"plan.listSupporting\";\n\nexport type ListSupportingPlansResult = SupportingPlan[];\n","import type { Post } from \"./models/post.js\";\n\nexport const POST_INFO_PATH = \"post.info\";\n\nexport interface GetPostParams {\n postId: string;\n}\n\nexport type GetPostResult = Post;\n","import type { PostListParams, PostSort, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_CREATOR_PATH = \"post.listCreator\";\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","import type { PostListParams, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_HOME_PATH = \"post.listHome\";\n\nexport type ListHomePostsParams = PostListParams;\n\nexport type ListHomePostsResult = PostSummary[];\n","import type { PostListParams, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_SUPPORTING_PATH = \"post.listSupporting\";\n\nexport type ListSupportingPostsParams = PostListParams;\n\nexport type ListSupportingPostsResult = PostSummary[];\n","import type { PostSort } from \"./models/post.js\";\n\nexport const POST_PAGINATE_CREATOR_PATH = \"post.paginateCreator\";\n\nexport interface PaginateCreatorPostsParams {\n creatorId: string;\n sort?: PostSort;\n}\n\nexport type PaginateCreatorPostsResult = string[];\n","export interface FanboxRequestHeadersOptions {\n cookie?: string;\n userAgent?: string;\n}\n\nexport function createFanboxRequestHeaders(\n options: FanboxRequestHeadersOptions = {},\n): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json, text/plain, */*\",\n Origin: \"https://www.fanbox.cc\",\n Referer: \"https://www.fanbox.cc/\",\n \"Sec-Fetch-Dest\": \"empty\",\n \"Sec-Fetch-Mode\": \"cors\",\n \"Sec-Fetch-Site\": \"same-site\",\n \"User-Agent\": options.userAgent ?? createRandomUserAgent(),\n };\n if (options.cookie !== undefined) {\n headers.Cookie = options.cookie;\n }\n\n return headers;\n}\n\nexport function createRandomUserAgent(): string {\n return `${Math.random().toString(36).substring(2, 15)}/${Math.random().toFixed(5)}`;\n}\n","import { type ClientHttp2Session, connect } from \"node:http2\";\nimport type { Readable } from \"node:stream\";\n\nconst HTTP2_HEADER_AUTHORITY = \":authority\";\nconst HTTP2_HEADER_METHOD = \":method\";\nconst HTTP2_HEADER_PATH = \":path\";\nconst HTTP2_HEADER_SCHEME = \":scheme\";\nconst HTTP2_HEADER_STATUS = \":status\";\n\nexport interface HttpRequest {\n body?: BodyInit | undefined;\n headers?: Headers | Record<string, string>;\n method?: string;\n url: string | URL;\n}\n\nexport interface HttpResponse {\n body: Readable;\n headers: Headers;\n json(): Promise<unknown>;\n ok: boolean;\n status: number;\n statusText: string;\n text(): Promise<string>;\n}\n\nexport interface HttpTransport {\n close(): Promise<void>;\n request(request: HttpRequest | string | URL): Promise<HttpResponse>;\n}\n\ntype BodyInit = Blob | string | Uint8Array;\n\ninterface NormalizedHttpRequest {\n body: BodyInit | undefined;\n headers: Headers | Record<string, string> | undefined;\n method: string;\n url: URL;\n}\n\nexport class Http2Transport implements HttpTransport {\n readonly #sessions = new Map<string, ClientHttp2Session>();\n\n public async close(): Promise<void> {\n const sessions = [...this.#sessions.values()];\n this.#sessions.clear();\n await Promise.all(sessions.map(closeSession));\n }\n\n public request(request: HttpRequest | string | URL): Promise<HttpResponse> {\n const normalized = normalizeRequest(request);\n const session = this.#getSession(normalized.url);\n const headers = createHttp2Headers(normalized);\n const stream = session.request(headers, { endStream: !normalized.body });\n\n return new Promise((resolve, reject) => {\n let settled = false;\n stream.once(\"error\", reject);\n stream.once(\"response\", (responseHeaders) => {\n settled = true;\n const status = parseStatus(responseHeaders[HTTP2_HEADER_STATUS]);\n resolve(\n createResponse({\n body: stream,\n headers: createResponseHeaders(responseHeaders),\n status,\n }),\n );\n });\n stream.once(\"close\", () => {\n if (!settled) {\n reject(new HttpError(`HTTP/2 stream closed before response`));\n }\n });\n if (normalized.body !== undefined) {\n writeRequestBody(stream, normalized.body).catch((error: unknown) => {\n stream.destroy(\n error instanceof Error ? error : new Error(String(error)),\n );\n });\n }\n });\n }\n\n #getSession(url: URL): ClientHttp2Session {\n const origin = url.origin;\n const existing = this.#sessions.get(origin);\n if (existing && !existing.closed && !existing.destroyed) {\n return existing;\n }\n\n const session = connect(origin);\n session.once(\"close\", () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.delete(origin);\n }\n });\n session.once(\"error\", () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.delete(origin);\n }\n });\n this.#sessions.set(origin, session);\n\n return session;\n }\n}\n\nexport class HttpError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"HttpError\";\n }\n}\n\nfunction closeSession(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\nfunction createHttp2Headers(\n request: NormalizedHttpRequest,\n): Record<string, string> {\n const headers: Record<string, string> = {\n [HTTP2_HEADER_AUTHORITY]: request.url.host,\n [HTTP2_HEADER_METHOD]: request.method.toUpperCase(),\n [HTTP2_HEADER_PATH]: `${request.url.pathname}${request.url.search}`,\n [HTTP2_HEADER_SCHEME]: request.url.protocol.slice(0, -1),\n };\n new Headers(request.headers).forEach((value, key) => {\n if (!isForbiddenHttp2Header(key)) {\n headers[key] = value;\n }\n });\n\n return headers;\n}\n\nfunction createResponse(options: {\n body: Readable;\n headers: Headers;\n status: number;\n}): HttpResponse {\n return {\n body: options.body,\n headers: options.headers,\n json: async () => {\n const parsed: unknown = JSON.parse(await readText(options.body));\n return parsed;\n },\n ok: options.status >= 200 && options.status < 300,\n status: options.status,\n statusText: \"\",\n text: async () => readText(options.body),\n };\n}\n\nfunction createResponseHeaders(\n headers: NodeJS.Dict<string | string[]>,\n): Headers {\n const result = new Headers();\n for (const [key, value] of Object.entries(headers)) {\n if (key.startsWith(\":\") || value === undefined) {\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 isForbiddenHttp2Header(header: string): boolean {\n return (\n header.startsWith(\":\") ||\n header === \"connection\" ||\n header === \"keep-alive\" ||\n header === \"proxy-connection\" ||\n header === \"transfer-encoding\" ||\n header === \"upgrade\"\n );\n}\n\nfunction normalizeRequest(\n request: HttpRequest | string | URL,\n): NormalizedHttpRequest {\n if (typeof request === \"string\" || request instanceof URL) {\n return {\n body: undefined,\n headers: undefined,\n method: \"GET\",\n url: new URL(request),\n };\n }\n\n return {\n body: request.body,\n headers: request.headers,\n method: request.method ?? \"GET\",\n url: new URL(request.url),\n };\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\nasync function readText(body: Readable): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of body) {\n chunks.push(toBuffer(chunk));\n }\n\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nfunction toBuffer(chunk: unknown): Buffer {\n if (Buffer.isBuffer(chunk)) {\n return chunk;\n }\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk);\n }\n if (typeof chunk === \"string\") {\n return Buffer.from(chunk);\n }\n\n return Buffer.from(String(chunk));\n}\n\nasync function writeRequestBody(\n stream: NodeJS.WritableStream,\n body: BodyInit | undefined,\n): Promise<void> {\n if (typeof body === \"string\" || body instanceof Uint8Array) {\n stream.end(body);\n return;\n }\n if (body instanceof Blob) {\n stream.end(Buffer.from(new Uint8Array(await body.arrayBuffer())));\n return;\n }\n\n throw new HttpError(\"Unsupported HTTP request body\");\n}\n","import type { FanboxClientOptions } from \"./client-options.js\";\nimport {\n CREATOR_GET_PATH,\n type GetCreatorParams,\n type GetCreatorResult,\n} from \"./endpoints/creator-get.js\";\nimport {\n CREATOR_LIST_FOLLOWING_PATH,\n type ListFollowingCreatorsResult,\n} from \"./endpoints/creator-list-following.js\";\nimport type { FanboxEnvelope } from \"./endpoints/fanbox-envelope.js\";\nimport {\n type ListCreatorPlansParams,\n type ListCreatorPlansResult,\n PLAN_LIST_CREATOR_PATH,\n} from \"./endpoints/plan-list-creator.js\";\nimport {\n type ListSupportingPlansResult,\n PLAN_LIST_SUPPORTING_PATH,\n} from \"./endpoints/plan-list-supporting.js\";\nimport {\n type GetPostParams,\n type GetPostResult,\n POST_INFO_PATH,\n} from \"./endpoints/post-info.js\";\nimport {\n type ListCreatorPostsParams,\n type ListCreatorPostsResult,\n POST_LIST_CREATOR_PATH,\n} from \"./endpoints/post-list-creator.js\";\nimport {\n type ListHomePostsParams,\n type ListHomePostsResult,\n POST_LIST_HOME_PATH,\n} from \"./endpoints/post-list-home.js\";\nimport {\n type ListSupportingPostsParams,\n type ListSupportingPostsResult,\n POST_LIST_SUPPORTING_PATH,\n} from \"./endpoints/post-list-supporting.js\";\nimport {\n type PaginateCreatorPostsParams,\n type PaginateCreatorPostsResult,\n POST_PAGINATE_CREATOR_PATH,\n} from \"./endpoints/post-paginate-creator.js\";\nimport { createFanboxRequestHeaders } from \"./fanbox-headers.js\";\nimport {\n Http2Transport,\n type HttpResponse,\n type HttpTransport,\n} from \"./http.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.fanbox.cc\";\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: HttpResponse, 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 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 = createFanboxRequestHeaders({\n cookie: options.cookie,\n userAgent: options.userAgent,\n });\n this.#transport = options.transport ?? new Http2Transport();\n }\n\n public getCreator(params: GetCreatorParams): Promise<GetCreatorResult> {\n return this.#get(CREATOR_GET_PATH, params);\n }\n\n public getPost(params: GetPostParams): Promise<GetPostResult> {\n return this.#get(POST_INFO_PATH, params);\n }\n\n public listCreatorPlans(\n params: ListCreatorPlansParams,\n ): Promise<ListCreatorPlansResult> {\n return this.#get(PLAN_LIST_CREATOR_PATH, params);\n }\n\n public listCreatorPosts(\n params: ListCreatorPostsParams,\n ): Promise<ListCreatorPostsResult> {\n return this.#get(POST_LIST_CREATOR_PATH, params);\n }\n\n public listFollowingCreators(): Promise<ListFollowingCreatorsResult> {\n return this.#get(CREATOR_LIST_FOLLOWING_PATH);\n }\n\n public listHomePosts(\n params: ListHomePostsParams = {},\n ): Promise<ListHomePostsResult> {\n return this.#get(POST_LIST_HOME_PATH, params);\n }\n\n public listSupportingPlans(): Promise<ListSupportingPlansResult> {\n return this.#get(PLAN_LIST_SUPPORTING_PATH);\n }\n\n public listSupportingPosts(\n params: ListSupportingPostsParams = {},\n ): Promise<ListSupportingPostsResult> {\n return this.#get(POST_LIST_SUPPORTING_PATH, params);\n }\n\n public paginateCreatorPosts(\n params: PaginateCreatorPostsParams,\n ): Promise<PaginateCreatorPostsResult> {\n return this.#get(POST_PAGINATE_CREATOR_PATH, params);\n }\n\n 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 response = await this.#transport.request({\n headers: this.#headers,\n method: \"GET\",\n url,\n });\n const body = await readResponseBody(response);\n if (!response.ok) {\n throw new FanboxApiError(response, body);\n }\n\n return (body as FanboxEnvelope<T>).body;\n }\n}\n\nasync function readResponseBody(response: HttpResponse): Promise<unknown> {\n const text = await response.text();\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n"],"mappings":"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","names":["CREATOR_GET_PATH","CREATOR_LIST_FOLLOWING_PATH","PLAN_LIST_CREATOR_PATH","PLAN_LIST_SUPPORTING_PATH","POST_INFO_PATH","POST_LIST_CREATOR_PATH","POST_LIST_HOME_PATH","POST_LIST_SUPPORTING_PATH","POST_PAGINATE_CREATOR_PATH","createFanboxRequestHeaders","options","headers","createRandomUserAgent","connect","HTTP2_HEADER_AUTHORITY","HTTP2_HEADER_METHOD","HTTP2_HEADER_PATH","HTTP2_HEADER_SCHEME","HTTP2_HEADER_STATUS","_sessions","_Http2Transport_instances","getSession_fn","Http2Transport","__privateAdd","sessions","__privateGet","closeSession","request","normalized","normalizeRequest","session","__privateMethod","headers","createHttp2Headers","stream","resolve","reject","settled","responseHeaders","status","parseStatus","createResponse","createResponseHeaders","HttpError","writeRequestBody","error","url","origin","existing","connect","message","value","key","isForbiddenHttp2Header","options","readText","result","item","header","body","chunks","chunk","toBuffer","DEFAULT_BASE_URL","FanboxApiError","response","body","_baseUrl","_headers","_transport","_FanboxClient_instances","get_fn","FanboxClient","options","__privateAdd","__privateSet","createFanboxRequestHeaders","Http2Transport","params","__privateMethod","CREATOR_GET_PATH","POST_INFO_PATH","PLAN_LIST_CREATOR_PATH","POST_LIST_CREATOR_PATH","CREATOR_LIST_FOLLOWING_PATH","POST_LIST_HOME_PATH","PLAN_LIST_SUPPORTING_PATH","POST_LIST_SUPPORTING_PATH","POST_PAGINATE_CREATOR_PATH","path","query","url","__privateGet","key","value","readResponseBody","text"]}
@@ -1,7 +1,9 @@
1
1
  export interface CreatorResolverClient {
2
2
  listFollowingCreators(): Promise<{
3
- creatorId: string;
4
- }[]>;
3
+ creators: {
4
+ creatorId: string;
5
+ }[];
6
+ }>;
5
7
  listSupportingPlans(): Promise<{
6
8
  creatorId: string;
7
9
  }[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/downloader/resolver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,qBAAqB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IAC1D,mBAAmB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/downloader/resolver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,qBAAqB,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC,CAAC;IACxE,mBAAmB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB"}
@@ -4,7 +4,8 @@ exports.resolveCreatorIds = resolveCreatorIds;
4
4
  async function resolveCreatorIds(client, options) {
5
5
  const creatorIds = new Set(options.creatorIds);
6
6
  if (options.following) {
7
- for (const creator of await client.listFollowingCreators()) {
7
+ const { creators } = await client.listFollowingCreators();
8
+ for (const creator of creators) {
8
9
  creatorIds.add(creator.creatorId);
9
10
  }
10
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/downloader/resolver.ts"],"names":[],"mappings":";;AAYA,8CAoBC;AApBM,KAAK,UAAU,iBAAiB,CACrC,MAA6B,EAC7B,OAAiC;IAEjC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,KAAK,MAAM,OAAO,IAAI,MAAM,MAAM,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC3D,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;YACtD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC/C,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/downloader/resolver.ts"],"names":[],"mappings":";;AAYA,8CAqBC;AArBM,KAAK,UAAU,iBAAiB,CACrC,MAA6B,EAC7B,OAAiC;IAEjC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,EAAE,CAAC;QAC1D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;YACtD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC/C,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AACzB,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import type { CreatorSummary } from "./models/creator.js";
2
2
  export declare const CREATOR_LIST_FOLLOWING_PATH = "creator.listFollowing";
3
- export type ListFollowingCreatorsResult = CreatorSummary[];
3
+ export interface ListFollowingCreatorsResult {
4
+ creators: CreatorSummary[];
5
+ }
4
6
  //# sourceMappingURL=creator-list-following.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"creator-list-following.d.ts","sourceRoot":"","sources":["../../../src/endpoints/creator-list-following.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,eAAO,MAAM,2BAA2B,0BAA0B,CAAC;AAEnE,MAAM,MAAM,2BAA2B,GAAG,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"creator-list-following.d.ts","sourceRoot":"","sources":["../../../src/endpoints/creator-list-following.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,eAAO,MAAM,2BAA2B,0BAA0B,CAAC;AAEnE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B"}
@@ -1,7 +1,9 @@
1
1
  export interface CreatorResolverClient {
2
2
  listFollowingCreators(): Promise<{
3
- creatorId: string;
4
- }[]>;
3
+ creators: {
4
+ creatorId: string;
5
+ }[];
6
+ }>;
5
7
  listSupportingPlans(): Promise<{
6
8
  creatorId: string;
7
9
  }[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/downloader/resolver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,qBAAqB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IAC1D,mBAAmB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/downloader/resolver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,qBAAqB,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC,CAAC;IACxE,mBAAmB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB"}
@@ -1,7 +1,8 @@
1
1
  export async function resolveCreatorIds(client, options) {
2
2
  const creatorIds = new Set(options.creatorIds);
3
3
  if (options.following) {
4
- for (const creator of await client.listFollowingCreators()) {
4
+ const { creators } = await client.listFollowingCreators();
5
+ for (const creator of creators) {
5
6
  creatorIds.add(creator.creatorId);
6
7
  }
7
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/downloader/resolver.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAA6B,EAC7B,OAAiC;IAEjC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,KAAK,MAAM,OAAO,IAAI,MAAM,MAAM,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC3D,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;YACtD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC/C,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/downloader/resolver.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAA6B,EAC7B,OAAiC;IAEjC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,EAAE,CAAC;QAC1D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;YACtD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC/C,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AACzB,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import type { CreatorSummary } from "./models/creator.js";
2
2
  export declare const CREATOR_LIST_FOLLOWING_PATH = "creator.listFollowing";
3
- export type ListFollowingCreatorsResult = CreatorSummary[];
3
+ export interface ListFollowingCreatorsResult {
4
+ creators: CreatorSummary[];
5
+ }
4
6
  //# sourceMappingURL=creator-list-following.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"creator-list-following.d.ts","sourceRoot":"","sources":["../../../src/endpoints/creator-list-following.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,eAAO,MAAM,2BAA2B,0BAA0B,CAAC;AAEnE,MAAM,MAAM,2BAA2B,GAAG,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"creator-list-following.d.ts","sourceRoot":"","sources":["../../../src/endpoints/creator-list-following.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,eAAO,MAAM,2BAA2B,0BAA0B,CAAC;AAEnE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moontaiworks/fanbox-dl",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "A TypeScript PixivFanbox Downloader and SDK",
5
5
  "author": "moontai0724",
6
6
  "license": "MIT",