@fin.cx/opendata 3.6.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/.smartconfig.json +23 -20
  2. package/dist_ts/00_commitinfo_data.js +3 -3
  3. package/dist_ts/handelsregister/classes.handelsregisterclient.d.ts +64 -0
  4. package/dist_ts/handelsregister/classes.handelsregisterclient.js +397 -0
  5. package/dist_ts/handelsregister/classes.handelsregistererror.d.ts +56 -0
  6. package/dist_ts/handelsregister/classes.handelsregistererror.js +37 -0
  7. package/dist_ts/handelsregister/classes.portalsession.d.ts +46 -0
  8. package/dist_ts/handelsregister/classes.portalsession.js +160 -0
  9. package/dist_ts/handelsregister/classes.slidingwindowgate.d.ts +32 -0
  10. package/dist_ts/handelsregister/classes.slidingwindowgate.js +55 -0
  11. package/dist_ts/handelsregister/constants.d.ts +13 -0
  12. package/dist_ts/handelsregister/constants.js +19 -0
  13. package/dist_ts/handelsregister/data.codelists.d.ts +29 -0
  14. package/dist_ts/handelsregister/data.codelists.js +616 -0
  15. package/dist_ts/handelsregister/forms.d.ts +27 -0
  16. package/dist_ts/handelsregister/forms.js +77 -0
  17. package/dist_ts/handelsregister/html.d.ts +26 -0
  18. package/dist_ts/handelsregister/html.js +82 -0
  19. package/dist_ts/handelsregister/index.d.ts +9 -0
  20. package/dist_ts/handelsregister/index.js +10 -0
  21. package/dist_ts/handelsregister/interfaces.d.ts +240 -0
  22. package/dist_ts/handelsregister/interfaces.js +2 -0
  23. package/dist_ts/handelsregister/parse.searchresults.d.ts +35 -0
  24. package/dist_ts/handelsregister/parse.searchresults.js +175 -0
  25. package/dist_ts/handelsregister/parse.structuredcontent.d.ts +6 -0
  26. package/dist_ts/handelsregister/parse.structuredcontent.js +306 -0
  27. package/dist_ts/handelsregister/plugins.d.ts +4 -0
  28. package/dist_ts/handelsregister/plugins.js +8 -0
  29. package/dist_ts/handelsregister/references.d.ts +38 -0
  30. package/dist_ts/handelsregister/references.js +146 -0
  31. package/dist_ts/holidays/calendar.d.ts +32 -0
  32. package/dist_ts/holidays/calendar.js +200 -0
  33. package/dist_ts/holidays/classes.holidaycalendarerror.d.ts +14 -0
  34. package/dist_ts/holidays/classes.holidaycalendarerror.js +10 -0
  35. package/dist_ts/holidays/data.holidays.d.ts +46 -0
  36. package/dist_ts/holidays/data.holidays.js +124 -0
  37. package/dist_ts/holidays/index.d.ts +4 -0
  38. package/dist_ts/holidays/index.js +7 -0
  39. package/dist_ts/holidays/interfaces.d.ts +42 -0
  40. package/dist_ts/holidays/interfaces.js +2 -0
  41. package/dist_ts/index.d.ts +0 -2
  42. package/dist_ts/index.js +1 -3
  43. package/dist_ts/plugins.d.ts +2 -20
  44. package/dist_ts/plugins.js +3 -22
  45. package/package.json +40 -37
  46. package/readme.md +250 -119
  47. package/ts/00_commitinfo_data.ts +2 -2
  48. package/ts/handelsregister/classes.handelsregisterclient.ts +474 -0
  49. package/ts/handelsregister/classes.handelsregistererror.ts +82 -0
  50. package/ts/handelsregister/classes.portalsession.ts +191 -0
  51. package/ts/handelsregister/classes.slidingwindowgate.ts +74 -0
  52. package/ts/handelsregister/constants.ts +30 -0
  53. package/ts/handelsregister/data.codelists.ts +640 -0
  54. package/ts/handelsregister/forms.ts +99 -0
  55. package/ts/handelsregister/html.ts +113 -0
  56. package/ts/handelsregister/index.ts +27 -0
  57. package/ts/handelsregister/interfaces.ts +272 -0
  58. package/ts/handelsregister/parse.searchresults.ts +241 -0
  59. package/ts/handelsregister/parse.structuredcontent.ts +338 -0
  60. package/ts/handelsregister/plugins.ts +15 -0
  61. package/ts/handelsregister/references.ts +189 -0
  62. package/ts/holidays/calendar.ts +261 -0
  63. package/ts/holidays/classes.holidaycalendarerror.ts +20 -0
  64. package/ts/holidays/data.holidays.ts +177 -0
  65. package/ts/holidays/index.ts +18 -0
  66. package/ts/holidays/interfaces.ts +87 -0
  67. package/ts/index.ts +0 -2
  68. package/ts/plugins.ts +0 -39
  69. package/dist_ts/classes.businessrecord.d.ts +0 -38
  70. package/dist_ts/classes.businessrecord.js +0 -90
  71. package/dist_ts/classes.handelsregister.d.ts +0 -134
  72. package/dist_ts/classes.handelsregister.js +0 -307
  73. package/dist_ts/classes.jsonldata.d.ts +0 -43
  74. package/dist_ts/classes.jsonldata.js +0 -68
  75. package/dist_ts/classes.main.opendata.d.ts +0 -25
  76. package/dist_ts/classes.main.opendata.js +0 -91
  77. package/dist_ts/laws/classes.lawrecord.d.ts +0 -24
  78. package/dist_ts/laws/classes.lawrecord.js +0 -181
  79. package/dist_ts/laws/classes.lawservice.d.ts +0 -52
  80. package/dist_ts/laws/classes.lawservice.js +0 -740
  81. package/dist_ts/laws/index.d.ts +0 -3
  82. package/dist_ts/laws/index.js +0 -4
  83. package/dist_ts/laws/interfaces.law.d.ts +0 -35
  84. package/dist_ts/laws/interfaces.law.js +0 -2
  85. package/readme.hints.md +0 -89
  86. package/ts/classes.businessrecord.ts +0 -67
  87. package/ts/classes.handelsregister.ts +0 -385
  88. package/ts/classes.jsonldata.ts +0 -114
  89. package/ts/classes.main.opendata.ts +0 -120
  90. package/ts/laws/classes.lawrecord.ts +0 -81
  91. package/ts/laws/classes.lawservice.ts +0 -1010
  92. package/ts/laws/index.ts +0 -3
  93. package/ts/laws/interfaces.law.ts +0 -48
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The typed error of the register client. Its message names the failure and never contains
3
+ * register data, so it can be logged.
4
+ */
5
+ export class HandelsregisterError extends Error {
6
+ code;
7
+ /** the HTTP status of a refusal */
8
+ status;
9
+ /** epoch ms of the next possible request (`rate_limited`) */
10
+ retryAt;
11
+ /** the step that failed */
12
+ step;
13
+ /**
14
+ * counted requests the call had sent before it failed. A request that was sent may have counted
15
+ * at the portal even when its answer did not arrive.
16
+ */
17
+ countedRequests;
18
+ /**
19
+ * the candidates of an `ambiguous` reference, and for `not_found` the entries with the same
20
+ * number whose location suffix differs
21
+ */
22
+ matches;
23
+ /** a message the portal showed instead of the expected page, German */
24
+ portalMessage;
25
+ constructor(codeArg, messageArg, detailsArg = {}) {
26
+ super(messageArg, detailsArg.cause === undefined ? undefined : { cause: detailsArg.cause });
27
+ this.name = 'HandelsregisterError';
28
+ this.code = codeArg;
29
+ this.status = detailsArg.status;
30
+ this.retryAt = detailsArg.retryAt;
31
+ this.step = detailsArg.step;
32
+ this.countedRequests = detailsArg.countedRequests;
33
+ this.matches = detailsArg.matches;
34
+ this.portalMessage = detailsArg.portalMessage;
35
+ }
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5oYW5kZWxzcmVnaXN0ZXJlcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2hhbmRlbHNyZWdpc3Rlci9jbGFzc2VzLmhhbmRlbHNyZWdpc3RlcmVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTZDQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsS0FBSztJQUM3QixJQUFJLENBQTRCO0lBQ2hELG1DQUFtQztJQUNuQixNQUFNLENBQVU7SUFDaEMsNkRBQTZEO0lBQzdDLE9BQU8sQ0FBVTtJQUNqQywyQkFBMkI7SUFDWCxJQUFJLENBQXdCO0lBQzVDOzs7T0FHRztJQUNhLGVBQWUsQ0FBVTtJQUN6Qzs7O09BR0c7SUFDYSxPQUFPLENBQW9CO0lBQzNDLHVFQUF1RTtJQUN2RCxhQUFhLENBQVU7SUFFdkMsWUFBWSxPQUFrQyxFQUFFLFVBQWtCLEVBQUUsYUFBMkMsRUFBRTtRQUMvRyxLQUFLLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDO1FBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUNsQyxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7SUFDaEQsQ0FBQztDQUNGIn0=
@@ -0,0 +1,46 @@
1
+ import { type THandelsregisterStep } from './classes.handelsregistererror.js';
2
+ export interface IPortalSessionSettings {
3
+ portalUrl: string;
4
+ userAgent: string;
5
+ requestTimeoutMs: number;
6
+ maxResponseBytes: number;
7
+ signal?: AbortSignal;
8
+ }
9
+ /** what the caller of a session learns about the progress of its call */
10
+ export interface ICallProgress {
11
+ step?: THandelsregisterStep;
12
+ /** counted requests sent so far */
13
+ countedRequests: number;
14
+ }
15
+ export interface IPortalResponse {
16
+ /** the URL that answered, after redirects */
17
+ url: string;
18
+ contentType: string;
19
+ body: Uint8Array;
20
+ }
21
+ /**
22
+ * One visit to the register portal: a cookie jar, the fixed language and a limit for every
23
+ * request. It lives for one call of the client and is dropped afterwards, so nothing is shared
24
+ * between calls or callers.
25
+ */
26
+ export declare class PortalSession {
27
+ private settings;
28
+ private progress;
29
+ private cookies;
30
+ private origin;
31
+ /** the signal of the request in flight */
32
+ private currentSignal?;
33
+ constructor(settings: IPortalSessionSettings, progress: ICallProgress);
34
+ /** resolves a path or a relative action against the portal or a page */
35
+ resolve(targetArg: string, baseArg?: string): string;
36
+ get(urlArg: string): Promise<IPortalResponse>;
37
+ /** submits a form as `application/x-www-form-urlencoded` */
38
+ post(urlArg: string, fieldsArg: Array<[string, string]>): Promise<IPortalResponse>;
39
+ private fail;
40
+ private request;
41
+ private send;
42
+ /** a signal for one request: the caller's signal and the request's own time limit */
43
+ private requestSignal;
44
+ private failureOf;
45
+ private readBody;
46
+ }
@@ -0,0 +1,160 @@
1
+ import { HandelsregisterError } from './classes.handelsregistererror.js';
2
+ const redirectStatuses = new Set([301, 302, 303]);
3
+ const maxRedirects = 3;
4
+ /**
5
+ * One visit to the register portal: a cookie jar, the fixed language and a limit for every
6
+ * request. It lives for one call of the client and is dropped afterwards, so nothing is shared
7
+ * between calls or callers.
8
+ */
9
+ export class PortalSession {
10
+ settings;
11
+ progress;
12
+ cookies = new Map();
13
+ origin;
14
+ /** the signal of the request in flight */
15
+ currentSignal;
16
+ constructor(settings, progress) {
17
+ this.settings = settings;
18
+ this.progress = progress;
19
+ this.origin = new URL(settings.portalUrl).origin;
20
+ }
21
+ /** resolves a path or a relative action against the portal or a page */
22
+ resolve(targetArg, baseArg = this.origin) {
23
+ return new URL(targetArg, baseArg).toString();
24
+ }
25
+ async get(urlArg) {
26
+ return this.request('GET', urlArg);
27
+ }
28
+ /** submits a form as `application/x-www-form-urlencoded` */
29
+ async post(urlArg, fieldsArg) {
30
+ return this.request('POST', urlArg, new URLSearchParams(fieldsArg).toString());
31
+ }
32
+ fail(codeArg, messageArg, extraArg = {}) {
33
+ return new HandelsregisterError(codeArg, messageArg, {
34
+ ...extraArg,
35
+ step: this.progress.step,
36
+ countedRequests: this.progress.countedRequests,
37
+ });
38
+ }
39
+ async request(methodArg, urlArg, bodyArg) {
40
+ let method = methodArg;
41
+ let url = urlArg;
42
+ let body = bodyArg;
43
+ for (let redirects = 0;; redirects++) {
44
+ if (new URL(url).origin !== this.origin) {
45
+ throw this.fail('unexpected_response', 'The portal pointed to another site.');
46
+ }
47
+ const response = await this.send(method, url, body);
48
+ if (redirectStatuses.has(response.status)) {
49
+ const location = response.headers.get('location');
50
+ await response.body?.cancel();
51
+ if (!location || redirects >= maxRedirects) {
52
+ throw this.fail('unexpected_response', 'The portal redirected in a way this version does not follow.');
53
+ }
54
+ url = new URL(location, url).toString();
55
+ method = 'GET';
56
+ body = undefined;
57
+ continue;
58
+ }
59
+ if (response.status !== 200) {
60
+ await response.body?.cancel();
61
+ throw this.fail('refused', `The register portal answered with HTTP status ${response.status}.`, {
62
+ status: response.status,
63
+ });
64
+ }
65
+ return {
66
+ url,
67
+ contentType: response.headers.get('content-type') ?? '',
68
+ body: await this.readBody(response),
69
+ };
70
+ }
71
+ }
72
+ async send(methodArg, urlArg, bodyArg) {
73
+ if (this.settings.signal?.aborted) {
74
+ throw this.fail('aborted', 'The call was aborted.', { cause: this.settings.signal.reason });
75
+ }
76
+ const headers = {
77
+ 'User-Agent': this.settings.userAgent,
78
+ Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
79
+ 'Accept-Language': 'de-DE,de;q=0.9',
80
+ };
81
+ if (this.cookies.size > 0) {
82
+ headers.Cookie = [...this.cookies].map(([name, value]) => `${name}=${value}`).join('; ');
83
+ }
84
+ if (bodyArg !== undefined) {
85
+ headers['Content-Type'] = 'application/x-www-form-urlencoded';
86
+ }
87
+ let response;
88
+ try {
89
+ response = await fetch(urlArg, {
90
+ method: methodArg,
91
+ headers,
92
+ body: bodyArg,
93
+ redirect: 'manual',
94
+ signal: this.requestSignal(),
95
+ });
96
+ }
97
+ catch (error) {
98
+ throw this.failureOf(error);
99
+ }
100
+ for (const cookie of response.headers.getSetCookie()) {
101
+ const pair = cookie.split(';', 1)[0];
102
+ const separator = pair.indexOf('=');
103
+ if (separator > 0) {
104
+ this.cookies.set(pair.slice(0, separator).trim(), pair.slice(separator + 1).trim());
105
+ }
106
+ }
107
+ return response;
108
+ }
109
+ /** a signal for one request: the caller's signal and the request's own time limit */
110
+ requestSignal() {
111
+ const timeout = AbortSignal.timeout(this.settings.requestTimeoutMs);
112
+ this.currentSignal = this.settings.signal ? AbortSignal.any([this.settings.signal, timeout]) : timeout;
113
+ return this.currentSignal;
114
+ }
115
+ failureOf(errorArg) {
116
+ if (errorArg instanceof HandelsregisterError) {
117
+ return errorArg;
118
+ }
119
+ if (this.settings.signal?.aborted) {
120
+ return this.fail('aborted', 'The call was aborted.', { cause: this.settings.signal.reason });
121
+ }
122
+ if (this.currentSignal?.aborted) {
123
+ return this.fail('timeout', 'The register portal did not answer in time.', { cause: errorArg });
124
+ }
125
+ return this.fail('unreachable', 'The register portal could not be reached.', { cause: errorArg });
126
+ }
127
+ async readBody(responseArg) {
128
+ if (!responseArg.body) {
129
+ return new Uint8Array(0);
130
+ }
131
+ const reader = responseArg.body.getReader();
132
+ const chunks = [];
133
+ let total = 0;
134
+ try {
135
+ for (;;) {
136
+ const chunk = await reader.read();
137
+ if (chunk.done) {
138
+ break;
139
+ }
140
+ total += chunk.value.byteLength;
141
+ if (total > this.settings.maxResponseBytes) {
142
+ await reader.cancel();
143
+ throw this.fail('too_large', 'An answer of the register portal exceeded the size limit.');
144
+ }
145
+ chunks.push(chunk.value);
146
+ }
147
+ }
148
+ catch (error) {
149
+ throw this.failureOf(error);
150
+ }
151
+ const body = new Uint8Array(total);
152
+ let offset = 0;
153
+ for (const chunk of chunks) {
154
+ body.set(chunk, offset);
155
+ offset += chunk.byteLength;
156
+ }
157
+ return body;
158
+ }
159
+ }
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wb3J0YWxzZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvaGFuZGVsc3JlZ2lzdGVyL2NsYXNzZXMucG9ydGFsc2Vzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQTZCLE1BQU0sbUNBQW1DLENBQUM7QUF3QnBHLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRXZCOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQU1KO0lBQTBDO0lBTHRELE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUNwQyxNQUFNLENBQVM7SUFDdkIsMENBQTBDO0lBQ2xDLGFBQWEsQ0FBZTtJQUVwQyxZQUFvQixRQUFnQyxFQUFVLFFBQXVCO1FBQWpFLGFBQVEsR0FBUixRQUFRLENBQXdCO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUNuRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDbkQsQ0FBQztJQUVELHdFQUF3RTtJQUNqRSxPQUFPLENBQUMsU0FBaUIsRUFBRSxVQUFrQixJQUFJLENBQUMsTUFBTTtRQUM3RCxPQUFPLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFjO1FBQzdCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELDREQUE0RDtJQUNyRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQWMsRUFBRSxTQUFrQztRQUNsRSxP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
@@ -0,0 +1,32 @@
1
+ import type { IRegisterCountedRequest, IRegisterRequestGate } from './interfaces.js';
2
+ export interface ISlidingWindowGateOptions {
3
+ /** requests allowed within one window; default 60, the portal's limit */
4
+ limit?: number;
5
+ /** length of the window; default one hour */
6
+ windowMs?: number;
7
+ /** clock; default `Date.now` */
8
+ now?: () => number;
9
+ }
10
+ /**
11
+ * Holds the portal's limit of 60 searches and retrievals per hour over a sliding window: a request
12
+ * is allowed when fewer than `limit` requests were allowed in the `windowMs` before it. A refusal is
13
+ * a `HandelsregisterError` with the code `rate_limited` and `retryAt`, the moment the oldest request
14
+ * leaves the window.
15
+ *
16
+ * The window lives in this object, so it counts for one process. Share one gate between every
17
+ * client of the installation that reaches the portal from the same address.
18
+ */
19
+ export declare class SlidingWindowGate implements IRegisterRequestGate {
20
+ readonly limit: number;
21
+ readonly windowMs: number;
22
+ private now;
23
+ /** epoch ms of the allowed requests still inside the window, oldest first */
24
+ private allowed;
25
+ constructor(optionsArg?: ISlidingWindowGateOptions);
26
+ private prune;
27
+ acquire(_requestArg: IRegisterCountedRequest): Promise<void>;
28
+ /** requests still allowed now */
29
+ remaining(): number;
30
+ /** epoch ms from which the next request is allowed; now, when one is allowed already */
31
+ nextAllowedAt(): number;
32
+ }
@@ -0,0 +1,55 @@
1
+ import { HandelsregisterError } from './classes.handelsregistererror.js';
2
+ import { portalRequestsPerHour } from './constants.js';
3
+ /**
4
+ * Holds the portal's limit of 60 searches and retrievals per hour over a sliding window: a request
5
+ * is allowed when fewer than `limit` requests were allowed in the `windowMs` before it. A refusal is
6
+ * a `HandelsregisterError` with the code `rate_limited` and `retryAt`, the moment the oldest request
7
+ * leaves the window.
8
+ *
9
+ * The window lives in this object, so it counts for one process. Share one gate between every
10
+ * client of the installation that reaches the portal from the same address.
11
+ */
12
+ export class SlidingWindowGate {
13
+ limit;
14
+ windowMs;
15
+ now;
16
+ /** epoch ms of the allowed requests still inside the window, oldest first */
17
+ allowed = [];
18
+ constructor(optionsArg = {}) {
19
+ this.limit = optionsArg.limit ?? portalRequestsPerHour;
20
+ this.windowMs = optionsArg.windowMs ?? 60 * 60 * 1000;
21
+ this.now = optionsArg.now ?? Date.now;
22
+ if (!Number.isInteger(this.limit) || this.limit < 1) {
23
+ throw new RangeError('limit must be a positive integer');
24
+ }
25
+ if (!Number.isFinite(this.windowMs) || this.windowMs <= 0) {
26
+ throw new RangeError('windowMs must be positive');
27
+ }
28
+ }
29
+ prune(nowArg) {
30
+ while (this.allowed.length > 0 && this.allowed[0] <= nowArg - this.windowMs) {
31
+ this.allowed.shift();
32
+ }
33
+ }
34
+ async acquire(_requestArg) {
35
+ const now = this.now();
36
+ this.prune(now);
37
+ if (this.allowed.length >= this.limit) {
38
+ const retryAt = this.allowed[0] + this.windowMs;
39
+ throw new HandelsregisterError('rate_limited', `The limit of ${this.limit} register requests per window is used up.`, { retryAt });
40
+ }
41
+ this.allowed.push(now);
42
+ }
43
+ /** requests still allowed now */
44
+ remaining() {
45
+ this.prune(this.now());
46
+ return this.limit - this.allowed.length;
47
+ }
48
+ /** epoch ms from which the next request is allowed; now, when one is allowed already */
49
+ nextAllowedAt() {
50
+ const now = this.now();
51
+ this.prune(now);
52
+ return this.allowed.length < this.limit ? now : this.allowed[this.allowed.length - this.limit] + this.windowMs;
53
+ }
54
+ }
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbGlkaW5nd2luZG93Z2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2hhbmRlbHNyZWdpc3Rlci9jbGFzc2VzLnNsaWRpbmd3aW5kb3dnYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBWXZEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUNaLEtBQUssQ0FBUztJQUNkLFFBQVEsQ0FBUztJQUN6QixHQUFHLENBQWU7SUFDMUIsNkVBQTZFO0lBQ3JFLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFFL0IsWUFBWSxhQUF3QyxFQUFFO1FBQ3BELElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssSUFBSSxxQkFBcUIsQ0FBQztRQUN2RCxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDdEQsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEQsTUFBTSxJQUFJLFVBQVUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMxRCxNQUFNLElBQUksVUFBVSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsTUFBYztRQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBb0M7UUFDdkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ2hELE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsY0FBYyxFQUNkLGdCQUFnQixJQUFJLENBQUMsS0FBSywyQ0FBMkMsRUFDckUsRUFBRSxPQUFPLEVBQUUsQ0FDWixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxpQ0FBaUM7SUFDMUIsU0FBUztRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzFDLENBQUM7SUFFRCx3RkFBd0Y7SUFDakYsYUFBYTtRQUNsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNqSCxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,13 @@
1
+ import type { IStructuredContentNotice, TRegisterDocument, TRegisterType } from './interfaces.js';
2
+ export declare const registerTypes: readonly TRegisterType[];
3
+ export declare const registerDocuments: readonly TRegisterDocument[];
4
+ /** the portal's note on its structured register content, from its start page (2026-09-23) */
5
+ export declare const structuredContentNotice: IStructuredContentNotice;
6
+ /** the portal's maximum number of hits for one search */
7
+ export declare const portalMaximumHits = 100;
8
+ export declare const defaultPortalUrl = "https://www.handelsregister.de";
9
+ export declare const defaultUserAgent = "@fin.cx/opendata (+https://code.foss.global/fin.cx/opendata)";
10
+ export declare const defaultRequestTimeoutMs = 20000;
11
+ export declare const defaultMaxResponseBytes: number;
12
+ /** the portal's terms: at most 60 searches or retrievals of entities per hour */
13
+ export declare const portalRequestsPerHour = 60;
@@ -0,0 +1,19 @@
1
+ export const registerTypes = ['HRA', 'HRB', 'GnR', 'PR', 'VR', 'GsR'];
2
+ export const registerDocuments = ['AD', 'CD', 'HD', 'DK', 'UT', 'VÖ', 'SI'];
3
+ /** the portal's note on its structured register content, from its start page (2026-09-23) */
4
+ export const structuredContentNotice = {
5
+ de: 'Soweit in den Ländern strukturierte Informationen zum Abruf zur Verfügung gestellt werden, handelt es sich ' +
6
+ 'um einen unverbindlichen Service. Der Inhalt kann in speziellen Fällen vom Inhalt des aktuellen Abdrucks ' +
7
+ 'abweichen und diesen ggf. nicht vollständig wiedergeben.',
8
+ en: 'Where the federal states provide structured information for retrieval, this is a non-binding service. In ' +
9
+ 'special cases its content can differ from the current printout and may not reproduce it completely.',
10
+ };
11
+ /** the portal's maximum number of hits for one search */
12
+ export const portalMaximumHits = 100;
13
+ export const defaultPortalUrl = 'https://www.handelsregister.de';
14
+ export const defaultUserAgent = '@fin.cx/opendata (+https://code.foss.global/fin.cx/opendata)';
15
+ export const defaultRequestTimeoutMs = 20_000;
16
+ export const defaultMaxResponseBytes = 5 * 1024 * 1024;
17
+ /** the portal's terms: at most 60 searches or retrievals of entities per hour */
18
+ export const portalRequestsPerHour = 60;
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvaGFuZGVsc3JlZ2lzdGVyL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQTZCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUVoRyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUUxRyw2RkFBNkY7QUFDN0YsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQTZCO0lBQy9ELEVBQUUsRUFDQSw2R0FBNkc7UUFDN0csMkdBQTJHO1FBQzNHLDBEQUEwRDtJQUM1RCxFQUFFLEVBQ0EsMkdBQTJHO1FBQzNHLHFHQUFxRztDQUN4RyxDQUFDO0FBRUYseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztBQUVyQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxnQ0FBZ0MsQ0FBQztBQUVqRSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyw4REFBOEQsQ0FBQztBQUUvRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUM7QUFFOUMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFdkQsaUZBQWlGO0FBQ2pGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQyJ9
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Code tables for reading the register portal's structured register content (SI, XJustiz).
3
+ *
4
+ * Taken on 2026-09-23 from the code lists published on XRepository (https://www.xrepository.de):
5
+ * - urn:xoev-de:xunternehmen:codeliste:rechtsformen_2.4, the codes the justice registers can carry;
6
+ * - urn:xoev-de:xjustiz:codeliste:gds.rollenbezeichnung_3.6, the roles that occur in register content;
7
+ * - urn:xoev-de:xjustiz:codeliste:reg.status-rechtstraeger_2.0;
8
+ * - urn:xoev-de:bund:bfj:codeliste:bfj.staat_7.0, reduced to key and ISO 3166-1 alpha-2 code.
9
+ *
10
+ * The register courts are the options of the portal's search form of the same day; their codes
11
+ * are those of urn:xoev-de:xjustiz:codeliste:gds.gerichte.
12
+ */
13
+ import type { IRegisterCourt } from './interfaces.js';
14
+ export interface ILegalFormLabel {
15
+ /** short designation, for example `GmbH` */
16
+ short?: string;
17
+ /** full designation, for example `Gesellschaft mit beschränkter Haftung` */
18
+ long: string;
19
+ }
20
+ /** XUnternehmen legal form code → designation */
21
+ export declare const legalFormLabels: Readonly<Record<string, ILegalFormLabel>>;
22
+ /** XJustiz role code → designation */
23
+ export declare const roleLabels: Readonly<Record<string, string>>;
24
+ /** XJustiz status code of the legal entity → designation */
25
+ export declare const entityStatusLabels: Readonly<Record<string, string>>;
26
+ /** BfJ state key → ISO 3166-1 alpha-2 */
27
+ export declare const stateKeyToIso: Readonly<Record<string, string>>;
28
+ /** the register courts of the portal, as its search form names them */
29
+ export declare const registerCourts: readonly IRegisterCourt[];