🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@ksefnik/http

Package Overview
Dependencies
Maintainers
1
Versions
6
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@ksefnik/http - npm Package Compare versions

Comparing version
0.0.1
to
0.1.0
+34
dist/upo.d.ts
import type { HttpClient } from './http.js';
export interface FetchUpoParams {
accessToken: string;
sessionReferenceNumber: string;
ksefNumber: string;
}
/**
* Fetches the UPO (Urzędowe Poświadczenie Odbioru) XML for an invoice
* via `GET /sessions/{referenceNumber}/invoices/ksef/{ksefNumber}/upo`.
*
* Returns the raw UPO XML string. Throws `KsefApiError` with code 21178
* when the UPO is not yet available (invoice still being processed).
*/
export declare function fetchUpoXml(http: HttpClient, params: FetchUpoParams): Promise<string>;
/**
* Fetches the invoice status from the session, which includes the
* `upoDownloadUrl` pre-signed URL when the UPO is ready.
*
* Uses `GET /sessions/{referenceNumber}/invoices/{invoiceReferenceNumber}`.
*/
export declare function fetchInvoiceStatus(http: HttpClient, params: {
accessToken: string;
sessionReferenceNumber: string;
invoiceReferenceNumber: string;
}): Promise<InvoiceStatusResult>;
export declare function upoStatusFromCode(code: number | undefined): 'confirmed' | 'pending' | 'rejected';
export interface InvoiceStatusResult {
ksefNumber?: string;
statusCode: number | undefined;
statusDescription?: string;
upoDownloadUrl?: string;
permanentStorageDate?: string;
}
//# sourceMappingURL=upo.d.ts.map
{"version":3,"file":"upo.d.ts","sourceRoot":"","sources":["../src/upo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE3C,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE;IACN,WAAW,EAAE,MAAM,CAAA;IACnB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,sBAAsB,EAAE,MAAM,CAAA;CAC/B,GACA,OAAO,CAAC,mBAAmB,CAAC,CAe9B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAKhG;AASD,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B"}
import { PATHS } from './endpoints.js';
/**
* Fetches the UPO (Urzędowe Poświadczenie Odbioru) XML for an invoice
* via `GET /sessions/{referenceNumber}/invoices/ksef/{ksefNumber}/upo`.
*
* Returns the raw UPO XML string. Throws `KsefApiError` with code 21178
* when the UPO is not yet available (invoice still being processed).
*/
export async function fetchUpoXml(http, params) {
return http.request({
method: 'GET',
path: PATHS.invoiceUpoByKsefNumber(params.sessionReferenceNumber, params.ksefNumber),
headers: {
Authorization: `Bearer ${params.accessToken}`,
Accept: 'application/xml',
},
responseType: 'text',
});
}
/**
* Fetches the invoice status from the session, which includes the
* `upoDownloadUrl` pre-signed URL when the UPO is ready.
*
* Uses `GET /sessions/{referenceNumber}/invoices/{invoiceReferenceNumber}`.
*/
export async function fetchInvoiceStatus(http, params) {
const response = await http.request({
method: 'GET',
path: PATHS.invoiceStatus(params.sessionReferenceNumber, params.invoiceReferenceNumber),
headers: { Authorization: `Bearer ${params.accessToken}` },
});
const code = response.status?.code;
return {
ksefNumber: response.ksefNumber ?? undefined,
statusCode: code,
statusDescription: response.status?.description,
upoDownloadUrl: response.upoDownloadUrl ?? undefined,
permanentStorageDate: response.permanentStorageDate ?? undefined,
};
}
export function upoStatusFromCode(code) {
if (code === undefined)
return 'pending';
if (code === 200)
return 'confirmed';
if (code >= 400)
return 'rejected';
return 'pending';
}
//# sourceMappingURL=upo.js.map
{"version":3,"file":"upo.js","sourceRoot":"","sources":["../src/upo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAStC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAgB,EAChB,MAAsB;IAEtB,OAAO,IAAI,CAAC,OAAO,CAAS;QAC1B,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,KAAK,CAAC,sBAAsB,CAAC,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,UAAU,CAAC;QACpF,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE;YAC7C,MAAM,EAAE,iBAAiB;SAC1B;QACD,YAAY,EAAE,MAAM;KACrB,CAAC,CAAA;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAgB,EAChB,MAIC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAA2B;QAC5D,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,sBAAsB,CAAC;QACvF,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE,EAAE;KAC3D,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;IAClC,OAAO;QACL,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,SAAS;QAC5C,UAAU,EAAE,IAAI;QAChB,iBAAiB,EAAE,QAAQ,CAAC,MAAM,EAAE,WAAW;QAC/C,cAAc,EAAE,QAAQ,CAAC,cAAc,IAAI,SAAS;QACpD,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB,IAAI,SAAS;KACjE,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACxD,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACxC,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,WAAW,CAAA;IACpC,IAAI,IAAI,IAAI,GAAG;QAAE,OAAO,UAAU,CAAA;IAClC,OAAO,SAAS,CAAA;AAClB,CAAC"}
+4
-1

@@ -43,3 +43,6 @@ import { type HttpRetryOptions } from './retry.js';

}>;
getUpo(): Promise<{
getUpo(params: {
token: string;
ksefReferenceNumber: string;
}): Promise<{
xml: string;

@@ -46,0 +49,0 @@ status: 'confirmed' | 'pending' | 'rejected';

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACjE,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACf,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAYhE,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,eAAe,CAAA;IAC5B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,gBAAgB,CAAA;CACzB;AAkCD,qBAAa,cAAe,YAAW,UAAU;IAKnC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,kBAAkB,CAAoB;gBAEjB,IAAI,EAAE,qBAAqB;YAY1C,gBAAgB;IAOxB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwBhE,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,aAAa,CAAC,MAAM,EAAE;QAC1B,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,WAAW,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,CAAA;QAClD,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA4BpD,WAAW,IAAI,OAAO,CAAC;QAAE,mBAAmB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAM1E,MAAM,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,CAAA;KAAE,CAAC;CAGvF"}
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACjE,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACf,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAchE,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,eAAe,CAAA;IAC5B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,gBAAgB,CAAA;CACzB;AAkCD,qBAAa,cAAe,YAAW,UAAU;IAKnC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,kBAAkB,CAAoB;gBAEjB,IAAI,EAAE,qBAAqB;YAY1C,gBAAgB;IAOxB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwBhE,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,aAAa,CAAC,MAAM,EAAE;QAC1B,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,WAAW,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,CAAA;QAClD,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA4BpD,WAAW,IAAI,OAAO,CAAC;QAAE,mBAAmB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAM1E,MAAM,CAAC,MAAM,EAAE;QACnB,KAAK,EAAE,MAAM,CAAA;QACb,mBAAmB,EAAE,MAAM,CAAA;KAC5B,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,CAAA;KAAE,CAAC;CAiC3E"}

@@ -6,2 +6,4 @@ import { withHttpRetry } from './retry.js';

import { fetchInvoices as fetchInvoicesHttp } from './invoices.js';
import { fetchUpoXml } from './upo.js';
import { KsefApiError } from './errors.js';
import { fetchKsefTokenEncryptionKey } from './public-key.js';

@@ -104,6 +106,29 @@ /**

}
async getUpo() {
throw new Error('KsefHttpClient.getUpo: not implemented in HTTP client MVP');
async getUpo(params) {
let session = decodeSessionToken(params.token);
if (!session) {
throw new Error('KsefHttpClient.getUpo: invalid session token');
}
if (shouldRefresh(session)) {
session = await withHttpRetry(() => refreshAccessToken(this.http, session), this.retryOpts);
}
// Try fetching UPO XML directly. If the invoice is still processing,
// KSeF returns 400 with code 21178 — we catch that and return 'pending'.
try {
const xml = await withHttpRetry(() => fetchUpoXml(this.http, {
accessToken: session.accessToken,
sessionReferenceNumber: session.referenceNumber,
ksefNumber: params.ksefReferenceNumber,
}), this.retryOpts);
return { xml, status: 'confirmed' };
}
catch (error) {
// KSeF returns 400 with code 21178 when UPO is not yet available
if (error instanceof KsefApiError && error.detailCode === '21178') {
return { xml: '', status: 'pending' };
}
throw error;
}
}
}
//# sourceMappingURL=client.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}

@@ -18,4 +18,6 @@ export declare const ENDPOINTS: {

readonly invoiceByKsefNumber: (ksefNumber: string) => string;
readonly invoiceStatus: (sessionRef: string, invoiceRef: string) => string;
readonly invoiceUpoByKsefNumber: (sessionRef: string, ksefNumber: string) => string;
readonly publicKeyCertificates: "/security/public-key-certificates";
};
//# sourceMappingURL=endpoints.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../src/endpoints.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;CAIZ,CAAA;AAEV,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,SAAS,CAAA;AAapD,eAAO,MAAM,KAAK;;;2CAGc,MAAM,KAAG,MAAM;;;;;mDAMP,MAAM,KAAG,MAAM;;+CAGnB,MAAM,KAAG,MAAM;;CAGzC,CAAA"}
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../src/endpoints.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;CAIZ,CAAA;AAEV,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,SAAS,CAAA;AAapD,eAAO,MAAM,KAAK;;;2CAGc,MAAM,KAAG,MAAM;;;;;mDAMP,MAAM,KAAG,MAAM;;+CAGnB,MAAM,KAAG,MAAM;yCAErB,MAAM,cAAc,MAAM,KAAG,MAAM;kDAE1B,MAAM,cAAc,MAAM,KAAG,MAAM;;CAGhE,CAAA"}

@@ -24,4 +24,6 @@ export const ENDPOINTS = {

invoiceByKsefNumber: (ksefNumber) => `/invoices/ksef/${assertSafeReference(ksefNumber, 'ksefNumber')}`,
invoiceStatus: (sessionRef, invoiceRef) => `/sessions/${assertSafeReference(sessionRef, 'sessionReferenceNumber')}/invoices/${assertSafeReference(invoiceRef, 'invoiceReferenceNumber')}`,
invoiceUpoByKsefNumber: (sessionRef, ksefNumber) => `/sessions/${assertSafeReference(sessionRef, 'sessionReferenceNumber')}/invoices/ksef/${assertSafeReference(ksefNumber, 'ksefNumber')}/upo`,
publicKeyCertificates: '/security/public-key-certificates',
};
//# sourceMappingURL=endpoints.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../src/endpoints.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU,EAAE,+BAA+B;IAC3C,IAAI,EAAE,oCAAoC;IAC1C,IAAI,EAAE,oCAAoC;CAClC,CAAA;AAIV,MAAM,WAAW,GAAG,wBAAwB,CAAA;AAE5C,SAAS,mBAAmB,CAAC,KAAa,EAAE,KAAa;IACvD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,WAAW,KAAK,gBAAgB,WAAW,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CACzF,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,aAAa,EAAE,iBAAiB;IAChC,aAAa,EAAE,kBAAkB;IACjC,UAAU,EAAE,CAAC,eAAuB,EAAU,EAAE,CAC9C,SAAS,mBAAmB,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE;IACpE,UAAU,EAAE,oBAAoB;IAChC,WAAW,EAAE,qBAAqB;IAClC,YAAY,EAAE,gBAAgB;IAC9B,oBAAoB,EAAE,wBAAwB;IAC9C,kBAAkB,EAAE,CAAC,eAAuB,EAAU,EAAE,CACtD,kBAAkB,mBAAmB,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE;IAC7E,aAAa,EAAE,0BAA0B;IACzC,mBAAmB,EAAE,CAAC,UAAkB,EAAU,EAAE,CAClD,kBAAkB,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE;IACnE,qBAAqB,EAAE,mCAAmC;CAClD,CAAA"}
{"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../src/endpoints.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU,EAAE,+BAA+B;IAC3C,IAAI,EAAE,oCAAoC;IAC1C,IAAI,EAAE,oCAAoC;CAClC,CAAA;AAIV,MAAM,WAAW,GAAG,wBAAwB,CAAA;AAE5C,SAAS,mBAAmB,CAAC,KAAa,EAAE,KAAa;IACvD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,WAAW,KAAK,gBAAgB,WAAW,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CACzF,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,aAAa,EAAE,iBAAiB;IAChC,aAAa,EAAE,kBAAkB;IACjC,UAAU,EAAE,CAAC,eAAuB,EAAU,EAAE,CAC9C,SAAS,mBAAmB,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE;IACpE,UAAU,EAAE,oBAAoB;IAChC,WAAW,EAAE,qBAAqB;IAClC,YAAY,EAAE,gBAAgB;IAC9B,oBAAoB,EAAE,wBAAwB;IAC9C,kBAAkB,EAAE,CAAC,eAAuB,EAAU,EAAE,CACtD,kBAAkB,mBAAmB,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE;IAC7E,aAAa,EAAE,0BAA0B;IACzC,mBAAmB,EAAE,CAAC,UAAkB,EAAU,EAAE,CAClD,kBAAkB,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE;IACnE,aAAa,EAAE,CAAC,UAAkB,EAAE,UAAkB,EAAU,EAAE,CAChE,aAAa,mBAAmB,CAAC,UAAU,EAAE,wBAAwB,CAAC,aAAa,mBAAmB,CAAC,UAAU,EAAE,wBAAwB,CAAC,EAAE;IAChJ,sBAAsB,EAAE,CAAC,UAAkB,EAAE,UAAkB,EAAU,EAAE,CACzE,aAAa,mBAAmB,CAAC,UAAU,EAAE,wBAAwB,CAAC,kBAAkB,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,MAAM;IAC7I,qBAAqB,EAAE,mCAAmC;CAClD,CAAA"}

@@ -7,3 +7,5 @@ export { KsefHttpClient, type KsefHttpClientOptions } from './client.js';

export { withHttpRetry, type HttpRetryOptions } from './retry.js';
export { fetchUpoXml, fetchInvoiceStatus, upoStatusFromCode } from './upo.js';
export type { FetchUpoParams, InvoiceStatusResult } from './upo.js';
export type { KsefRawInvoiceExt } from './types.js';
//# sourceMappingURL=index.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACjE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC7E,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACnE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA"}

@@ -7,2 +7,3 @@ export { KsefHttpClient } from './client.js';

export { withHttpRetry } from './retry.js';
export { fetchUpoXml, fetchInvoiceStatus, upoStatusFromCode } from './upo.js';
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA8B,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAA8B,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,EAAE,SAAS,EAAwB,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,eAAe,EAA4B,MAAM,UAAU,CAAA;AACpE,OAAO,EAAE,aAAa,EAAyB,MAAM,YAAY,CAAA"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA8B,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAA8B,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,EAAE,SAAS,EAAwB,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,eAAe,EAA4B,MAAM,UAAU,CAAA;AACpE,OAAO,EAAE,aAAa,EAAyB,MAAM,YAAY,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA"}
{
"name": "@ksefnik/http",
"version": "0.0.1",
"version": "0.1.0",
"description": "KSeF HTTP adapter — authentication, challenge, sessions, invoice fetch (Polish e-Invoice API v2)",

@@ -13,7 +13,44 @@ "license": "MIT",

},
"keywords": ["ksef", "ksefnik", "http", "adapter", "einvoice", "poland", "api"],
"keywords": [
"ksef",
"ksefnik",
"ksef-api",
"ksef-client",
"ksef-http",
"ksef-sdk",
"ksef-2",
"ksef-node",
"e-invoice",
"einvoice",
"e-faktura",
"faktura",
"poland",
"polish",
"krajowy-system-e-faktur",
"ministry-of-finance",
"mf",
"invoice",
"invoice-api",
"typescript",
"nodejs",
"sdk",
"http-client",
"api-client",
"rsa-oaep",
"authentication",
"fa2",
"fa3",
"xml",
"fintech"
],
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"files": ["dist", "!dist/**/__tests__", "!dist/**/*.test.*", "README.md", "LICENSE"],
"files": [
"dist",
"!dist/**/__tests__",
"!dist/**/*.test.*",
"README.md",
"LICENSE"
],
"publishConfig": {

@@ -28,14 +65,6 @@ "access": "public"

},
"scripts": {
"build": "tsc --build",
"dev": "tsc --build --watch",
"test": "vitest run",
"typecheck": "tsc --noEmit",
"smoke": "node --env-file=../../.env scripts/smoke-test.mjs",
"generate": "openapi-typescript https://api.ksef.mf.gov.pl/docs/v2/openapi.json -o src/generated/ksef-api.ts --alphabetize --export-type"
},
"dependencies": {
"@ksefnik/shared": "workspace:^",
"@ksefnik/core": "workspace:^",
"fast-xml-parser": "^4.5.0"
"fast-xml-parser": "^4.5.0",
"@ksefnik/shared": "^0.1.0",
"@ksefnik/core": "^0.1.0"
},

@@ -48,3 +77,11 @@ "devDependencies": {

"openapi-typescript": "^7.4.4"
},
"scripts": {
"build": "tsc --build",
"dev": "tsc --build --watch",
"test": "vitest run",
"typecheck": "tsc --noEmit",
"smoke": "node --env-file=../../.env scripts/smoke-test.mjs",
"generate": "openapi-typescript https://api.ksef.mf.gov.pl/docs/v2/openapi.json -o src/generated/ksef-api.ts --alphabetize --export-type"
}
}
}
+68
-53

@@ -1,10 +0,10 @@

# @ksefnik/http
# @ksefnik/http — KSeF 2.0 API client dla TypeScript / Node.js
Production HTTP client for **KSeF 2.0** (Krajowy System e-Faktur, Polish national e-invoicing system, live from 2026-02-01).
**Produkcyjny klient HTTP do Krajowego Systemu e-Faktur (KSeF 2.0)** — pełen flow uwierzytelnienia z challenge + **RSA-OAEP SHA-256**, pobieranie metadanych faktur, parsowanie XML **FA(2)/FA(3)**, retry z honorowaniem `Retry-After`, mapowanie błędów na typowane wyjątki. Część [Ksefnika](https://ksefnik.pl/) — otwartego **KSeF SDK dla Node.js**, znanego też jako *KSeF API client*, *Polish e-Invoice API*, *National e-Invoice System HTTP client* albo *KSeF 2.0 TypeScript client*.
Implements the `KsefClient` interface from `@ksefnik/core` against the real `api.ksef.mf.gov.pl` endpoints. Plug it into the `Ksefnik` facade via `createHttpAdapter(...)` and you get end-to-end invoice retrieval, reconciliation, and MCP-mediated automation with zero additional code in consumers.
Implementuje interfejs `KsefClient` z `@ksefnik/core` i gada bezpośrednio z `api.ksef.mf.gov.pl` (KSeF 2.0, obowiązkowe od 2026-02-01). Podpinasz go do fasady `Ksefnik` przez `createHttpAdapter(...)` i masz produkcyjną integrację — bez pisania warstwy HTTP od zera, bez walki z kryptografią Ministerstwa Finansów, bez ręcznego parsera XML. Jeżeli szukasz gotowego **klienta HTTP do polskiej e-faktury**, który przeżyje audyt bezpieczeństwa i nie ciągnie 40 zależności trzecich — to jest właśnie on.
> **Research source of truth**: [CIRFMF/ksef-docs](https://github.com/CIRFMF/ksef-docs) — see [NOTES.md](./NOTES.md) for a summary of the auth flow, endpoint map, and rate limits used by this package.
> **Źródło prawdy**: [CIRFMF/ksef-docs](https://github.com/CIRFMF/ksef-docs). Szczegóły flow, mapa endpointów i limity — w [NOTES.md](./NOTES.md).
## Install
## Instalacja

@@ -15,3 +15,3 @@ ```bash

## Usage
## Użycie

@@ -27,3 +27,3 @@ ```ts

environment: 'production',
publicKeyPem: readFileSync('./ksef-public-key.pem', 'utf8'),
publicKeyPem: readFileSync('./mf-public.pem', 'utf8'),
})

@@ -41,5 +41,5 @@

## Environments
## Środowiska
| Environment | Base URL |
| Environment | Bazowy URL |
|---|---|

@@ -50,15 +50,19 @@ | `production` | `https://api.ksef.mf.gov.pl/v2` |

## Authentication flow (KSeF 2.0)
## Flow uwierzytelnienia (KSeF 2.0)
1. `POST /auth/challenge` — server returns `{ challenge, timestamp }`.
2. Client encrypts `"{ksefToken}|{timestamp}"` with RSA-OAEP SHA-256 using the MF public key.
3. `POST /auth/ksef-token` — server returns `{ authenticationToken, referenceNumber }` (temporary JWT).
4. `POST /auth/token/redeem` (`Authorization: Bearer <authenticationToken>`) — returns `{ accessToken, refreshToken }`.
5. All subsequent calls use `Authorization: Bearer <accessToken>`.
6. Before expiry the client transparently calls `POST /auth/token/refresh` with the refresh token.
> Szczegolowy opis flow auth: [docs.ksefnik.pl/http/autentykacja](https://docs.ksefnik.pl/http/autentykacja/)
Crypto: **RSA-OAEP SHA-256 only**, implemented via `node:crypto` `webcrypto.subtle`. Zero external dependencies.
1. `POST /auth/challenge` — serwer zwraca `{ challenge, timestamp }`.
2. Klient szyfruje `"{ksefToken}|{timestamp}"` algorytmem **RSA-OAEP SHA-256** przy użyciu klucza publicznego MF.
3. `POST /auth/ksef-token` — serwer zwraca `{ authenticationToken, referenceNumber }` (tymczasowy JWT).
4. `POST /auth/token/redeem` z `Authorization: Bearer <authenticationToken>` — serwer zwraca `{ accessToken, refreshToken }`.
5. Kolejne wywołania używają `Authorization: Bearer <accessToken>`.
6. Przed wygaśnięciem accessToken klient sam odpala `POST /auth/token/refresh` z refresh tokenem.
## Error handling
Kryptografia: **wyłącznie RSA-OAEP SHA-256**, zaimplementowana przez `node:crypto` `webcrypto.subtle`. Zero zewnętrznych zależności kryptograficznych — nie musisz ufać `jose`, `crypto-js` ani żadnemu innemu pakietowi trzeciemu w sprawach podpisywania.
## Obsługa błędów
> Retry, backoff i mapowanie bledow: [docs.ksefnik.pl/http/retry-i-bledy](https://docs.ksefnik.pl/http/retry-i-bledy/)
```ts

@@ -68,10 +72,10 @@ import { KsefApiError, KsefAuthError, KsefRateLimitError } from '@ksefnik/http'

try {
await ksef.invoices.fetch(...)
await ksef.invoices.fetch(/* ... */)
} catch (error) {
if (error instanceof KsefAuthError) {
// 401/403 — refresh token expired, re-issue KSeF token in the portal
// 401/403 — refresh token wygasł, przewygeneruj token KSeF w portalu MF
} else if (error instanceof KsefRateLimitError) {
// 429 — honour error.retryAfter (seconds) and retry
// 429 — honoruj error.retryAfter (sekundy) i retry
} else if (error instanceof KsefApiError) {
// 4xx/5xx with error.statusCode and error.detailCode
// Inne 4xx/5xx — szczegóły w error.statusCode i error.detailCode
}

@@ -81,8 +85,10 @@ }

The underlying `withRetry` from `@ksefnik/core` automatically retries `KsefRateLimitError` and `5xx` responses with exponential backoff.
`withRetry` z `@ksefnik/core` automatycznie retry'uje `KsefRateLimitError` i odpowiedzi `5xx` z exponential backoff — więc w praktyce kod powyżej ratuje Cię przed przypadkami, których retry sensownie nie rozwiąże.
## Rate limits
## Limity ratelimit
Per [limity-api.md](https://github.com/CIRFMF/ksef-docs/blob/main/limity/limity-api.md):
> Jak Ksefnik obsluguje rate limiting i retry: [docs.ksefnik.pl/http/retry-i-bledy](https://docs.ksefnik.pl/http/retry-i-bledy/)
Zgodnie z [limity-api.md](https://github.com/CIRFMF/ksef-docs/blob/main/limity/limity-api.md):
| Endpoint | req/s | req/min | req/h |

@@ -94,12 +100,14 @@ |---|---|---|---|

`fetchInvoices` uses `mapWithConcurrency(5)` by default to stay well within the bursting envelope.
`fetchInvoices` domyślnie używa `mapWithConcurrency(5)`, żeby zmieścić się z buforem w tym oknie. Jeżeli masz własne potrzeby (np. chcesz łagodniej dociążać produkcję MF, bo wiesz, że Twój NIP ma wąski limit h/req) — konfigurujesz adapter.
## Not implemented in MVP
## MVP — co jeszcze nie jest zrobione
- `sendInvoice` — stub throws "not implemented".
- `getUpo` — stub throws "not implemented".
- Async export flow (`POST /invoices/exports` + polling) — v2.
- `sendInvoice` — stub, rzuca `"not implemented"`
- `getUpo` — stub, rzuca `"not implemented"`
- Asynchroniczny eksport (`POST /invoices/exports` + polling) — planowany w v0.1
## Smoke test
**Co działa w MVP**: pełny auth flow, pobieranie faktur kosztowych i sprzedażowych, parsowanie FA(2)/FA(3), ekstrakcja kwot brutto, refresh tokenów, retry.
## Smoke test na środowisku testowym MF
```bash

@@ -112,7 +120,7 @@ KSEF_TEST_NIP=... \

The smoke script talks to `api-test.ksef.mf.gov.pl` for manual end-to-end verification. It is **not** run in CI.
Skrypt rozmawia z `api-test.ksef.mf.gov.pl` dla ręcznej weryfikacji end-to-end. **Nie jest uruchamiany w CI** — do CI używaj [`@ksefnik/simulator`](../simulator).
## Type generation from OpenAPI
## Generowanie typów z OpenAPI
Types for every KSeF 2.0 request/response in `src/session.ts`, `src/invoices.ts`, and `src/public-key.ts` are **generated** from the live production contract via [openapi-typescript](https://github.com/openapi-ts/openapi-typescript). The hand-written runtime (HTTP layer, retry, error mapping, session orchestration) is kept, but the shapes themselves are single-source-of-truth from MF.
Typy wszystkich request/response'ów KSeF 2.0 w `src/session.ts`, `src/invoices.ts` i `src/public-key.ts` są **generowane** z żywego kontraktu produkcyjnego MF przez [openapi-typescript](https://github.com/openapi-ts/openapi-typescript). Runtime (warstwa HTTP, retry, mapowanie błędów, orkiestracja sesji) jest ręcznie pisany, ale kształty danych są jednoźródłowe z MF.

@@ -123,28 +131,35 @@ ```bash

This fetches `https://api.ksef.mf.gov.pl/docs/v2/openapi.json` and writes `src/generated/ksef-api.ts` (≈10k lines, 253 schemas, 59 paths). The generated file is committed to git so the package builds without network access, but should be refreshed whenever MF publishes a spec change.
Polecenie pobiera `https://api.ksef.mf.gov.pl/docs/v2/openapi.json` i zapisuje `src/generated/ksef-api.ts` (≈10k linii, 253 schematy, 59 endpointów). Wygenerowany plik jest zacommitowany do git — pakiet buduje się bez dostępu do sieci, ale powinien być odświeżany przy każdej zmianie specyfikacji MF.
### Workflow for contract changes
### Workflow przy zmianie kontraktu
1. `pnpm --filter @ksefnik/http generate` — pulls the latest contract
2. `pnpm --filter @ksefnik/http build` — TypeScript flags any breaking changes at compile time (missing fields, renamed enums, nullability changes, etc.)
3. Fix the callsites in `session.ts`/`invoices.ts`/`public-key.ts` until the build is green
4. `pnpm --filter @ksefnik/http test` — unit + integration tests must stay green
5. `KSEF_ENV=production pnpm --filter @ksefnik/http smoke` — live verification against the real API
1. `pnpm --filter @ksefnik/http generate` — pulluje najnowszy kontrakt
2. `pnpm --filter @ksefnik/http build` — TypeScript od razu pokazuje, co się zmieniło breaking (brakujące pola, przemianowane enumy, zmiana nullability)
3. Fixy w callsite'ach w `session.ts` / `invoices.ts` / `public-key.ts`, aż build jest zielony
4. `pnpm --filter @ksefnik/http test` — unit + integration testy muszą przejść
5. `KSEF_ENV=production pnpm --filter @ksefnik/http smoke` — weryfikacja na żywym API
### What is generated vs hand-written
### Co generowane vs ręcznie pisane
| Layer | Source |
| Warstwa | Źródło |
|---|---|
| Request/response shapes (challenge, ksef-token, redeem, refresh, auth status, query metadata, public-key certs) | **generated** — `src/generated/ksef-api.ts` re-exported via `src/generated/index.ts` |
| Runtime HTTP client (`src/http.ts`) | hand-written — fetch, AbortSignal timeout, User-Agent, response parsing |
| Error mapping to `KsefAuthError`/`KsefRateLimitError`/`KsefApiError` | hand-written — `src/errors.ts` + `src/http.ts` |
| Retry with `Retry-After` honoring | hand-written — `src/retry.ts` |
| Auth flow orchestration (challenge → ksef-token → polling → redeem → refresh) | hand-written — `src/session.ts` |
| Pagination + `isTruncated` guard + concurrency | hand-written — `src/invoices.ts` |
| `KsefHttpClient` facade implementing `@ksefnik/core` `KsefClient` interface | hand-written — `src/client.ts` |
| Kształty request/response (challenge, ksef-token, redeem, refresh, auth status, query metadata, public key) | **generowane** — `src/generated/ksef-api.ts` |
| Runtime HTTP client (`src/http.ts`) | ręczny — fetch, AbortSignal timeout, User-Agent, parsowanie odpowiedzi |
| Mapowanie błędów na `KsefAuthError` / `KsefRateLimitError` / `KsefApiError` | ręczny — `src/errors.ts` + `src/http.ts` |
| Retry z honorowaniem `Retry-After` | ręczny — `src/retry.ts` |
| Orkiestracja flow auth (challenge → ksef-token → polling → redeem → refresh) | ręczny — `src/session.ts` |
| Paginacja, guard na `isTruncated`, concurrency | ręczny — `src/invoices.ts` |
| Fasada `KsefHttpClient` implementująca `KsefClient` z `@ksefnik/core` | ręczny — `src/client.ts` |
The generated file adds ~600KB to source control but adds **zero runtime cost** (pure `.d.ts`-style type exports — TSC erases them at build time).
Wygenerowany plik dodaje ≈600KB do source control i ma **zero runtime cost** — to czyste typy (`.d.ts`-style), TSC usuwa je na etapie kompilacji.
## License
## Powiązane pakiety
MIT. Part of the [ksefnik](../../README.md) monorepo.
- [`@ksefnik/core`](../core) — silnik reconcyliacji, który woła adapter
- [`@ksefnik/shared`](../shared) — kontrakt `KsefAdapter`
- [`@ksefnik/simulator`](../simulator) — offline mock do testów (zamiast tego pakietu w CI)
- [`@ksefnik/cli`](../cli) — CLI, które domyślnie używa tego adaptera
## Licencja
MIT. Część monorepo [ksefnik](../../README.md). Rozwijane przez [CodeFormers.it](https://codeformers.it/) — specjalizujemy się w integracjach z polskimi systemami państwowymi (KSeF, e-Doręczenia, KRS, CEIDG, ePUAP) i budujemy dedykowane wdrożenia KSeF dla firm, które potrzebują czegoś więcej niż gotowy plugin do ERP. [Porozmawiajmy](https://codeformers.it/).