@fin.cx/opendata 1.5.3 → 1.6.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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@fin.cx/opendata',
6
- version: '1.5.3',
7
- description: 'A comprehensive TypeScript library that manages open business data for German companies by integrating MongoDB, processing JSONL bulk data, and automating browser interactions for Handelsregister data retrieval.'
6
+ version: '1.6.0',
7
+ description: 'A comprehensive TypeScript library for accessing business data and real-time financial information. Features include German company data management with MongoDB integration, JSONL bulk processing, automated Handelsregister interactions, and real-time stock market data from multiple providers.'
8
8
  };
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHFOQUFxTjtDQUNuTyxDQUFBIn0=
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHVTQUF1UztDQUNyVCxDQUFBIn0=
@@ -1 +1,2 @@
1
1
  export * from './classes.main.opendata.js';
2
+ export * from './stocks/index.js';
package/dist_ts/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from './classes.main.opendata.js';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDRCQUE0QixDQUFDIn0=
2
+ export * from './stocks/index.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsbUJBQW1CLENBQUMifQ==
@@ -8,12 +8,13 @@ import * as smartbrowser from '@push.rocks/smartbrowser';
8
8
  import * as smartdata from '@push.rocks/smartdata';
9
9
  import * as smartdelay from '@push.rocks/smartdelay';
10
10
  import * as smartfile from '@push.rocks/smartfile';
11
+ import * as smartlog from '@push.rocks/smartlog';
11
12
  import * as smartpath from '@push.rocks/smartpath';
12
13
  import * as smartpromise from '@push.rocks/smartpromise';
13
14
  import * as smartrequest from '@push.rocks/smartrequest';
14
15
  import * as smartstream from '@push.rocks/smartstream';
15
16
  import * as smartunique from '@push.rocks/smartunique';
16
17
  import * as smartxml from '@push.rocks/smartxml';
17
- export { lik, qenv, smartarchive, smartarray, smartbrowser, smartdata, smartdelay, smartfile, smartpath, smartpromise, smartrequest, smartstream, smartunique, smartxml, };
18
+ export { lik, qenv, smartarchive, smartarray, smartbrowser, smartdata, smartdelay, smartfile, smartlog, smartpath, smartpromise, smartrequest, smartstream, smartunique, smartxml, };
18
19
  import * as tsclass from '@tsclass/tsclass';
19
20
  export { tsclass, };
@@ -10,14 +10,15 @@ import * as smartbrowser from '@push.rocks/smartbrowser';
10
10
  import * as smartdata from '@push.rocks/smartdata';
11
11
  import * as smartdelay from '@push.rocks/smartdelay';
12
12
  import * as smartfile from '@push.rocks/smartfile';
13
+ import * as smartlog from '@push.rocks/smartlog';
13
14
  import * as smartpath from '@push.rocks/smartpath';
14
15
  import * as smartpromise from '@push.rocks/smartpromise';
15
16
  import * as smartrequest from '@push.rocks/smartrequest';
16
17
  import * as smartstream from '@push.rocks/smartstream';
17
18
  import * as smartunique from '@push.rocks/smartunique';
18
19
  import * as smartxml from '@push.rocks/smartxml';
19
- export { lik, qenv, smartarchive, smartarray, smartbrowser, smartdata, smartdelay, smartfile, smartpath, smartpromise, smartrequest, smartstream, smartunique, smartxml, };
20
+ export { lik, qenv, smartarchive, smartarray, smartbrowser, smartdata, smartdelay, smartfile, smartlog, smartpath, smartpromise, smartrequest, smartstream, smartunique, smartxml, };
20
21
  // @tsclass scope
21
22
  import * as tsclass from '@tsclass/tsclass';
22
23
  export { tsclass, };
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFDTCxJQUFJLEdBQ0wsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssR0FBRyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxJQUFJLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUNMLEdBQUcsRUFDSCxJQUFJLEVBQ0osWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDVixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLFdBQVcsRUFDWCxRQUFRLEdBQ1QsQ0FBQTtBQUVELGlCQUFpQjtBQUNqQixPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sRUFDTCxPQUFPLEdBQ1IsQ0FBQSJ9
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFDTCxJQUFJLEdBQ0wsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssR0FBRyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxJQUFJLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQ0wsR0FBRyxFQUNILElBQUksRUFDSixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsRUFDVCxRQUFRLEVBQ1IsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLFdBQVcsRUFDWCxRQUFRLEdBQ1QsQ0FBQTtBQUVELGlCQUFpQjtBQUNqQixPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sRUFDTCxPQUFPLEdBQ1IsQ0FBQSJ9
@@ -0,0 +1,32 @@
1
+ import type { IStockProvider, IProviderConfig, IProviderRegistry } from './interfaces/provider.js';
2
+ import type { IStockPrice, IStockQuoteRequest, IStockBatchQuoteRequest } from './interfaces/stockprice.js';
3
+ export declare class StockPriceService implements IProviderRegistry {
4
+ private providers;
5
+ private cache;
6
+ private logger;
7
+ private cacheConfig;
8
+ constructor(cacheConfig?: {
9
+ ttl?: number;
10
+ maxEntries?: number;
11
+ });
12
+ register(provider: IStockProvider, config?: IProviderConfig): void;
13
+ unregister(providerName: string): void;
14
+ getProvider(name: string): IStockProvider | undefined;
15
+ getAllProviders(): IStockProvider[];
16
+ getEnabledProviders(): IStockProvider[];
17
+ getPrice(request: IStockQuoteRequest): Promise<IStockPrice>;
18
+ getPrices(request: IStockBatchQuoteRequest): Promise<IStockPrice[]>;
19
+ checkProvidersHealth(): Promise<Map<string, boolean>>;
20
+ getProviderStats(): Map<string, {
21
+ successCount: number;
22
+ errorCount: number;
23
+ lastError?: string;
24
+ lastErrorTime?: Date;
25
+ }>;
26
+ clearCache(): void;
27
+ setCacheTTL(ttl: number): void;
28
+ private fetchWithRetry;
29
+ private getCacheKey;
30
+ private getFromCache;
31
+ private addToCache;
32
+ }
@@ -0,0 +1,221 @@
1
+ import * as plugins from '../plugins.js';
2
+ export class StockPriceService {
3
+ constructor(cacheConfig) {
4
+ this.providers = new Map();
5
+ this.cache = new Map();
6
+ this.logger = console;
7
+ this.cacheConfig = {
8
+ ttl: 60000, // 60 seconds default
9
+ maxEntries: 1000
10
+ };
11
+ if (cacheConfig) {
12
+ this.cacheConfig = { ...this.cacheConfig, ...cacheConfig };
13
+ }
14
+ }
15
+ register(provider, config) {
16
+ const defaultConfig = {
17
+ enabled: true,
18
+ priority: provider.priority,
19
+ timeout: 10000,
20
+ retryAttempts: 2,
21
+ retryDelay: 1000
22
+ };
23
+ const mergedConfig = { ...defaultConfig, ...config };
24
+ this.providers.set(provider.name, {
25
+ provider,
26
+ config: mergedConfig,
27
+ successCount: 0,
28
+ errorCount: 0
29
+ });
30
+ console.log(`Registered provider: ${provider.name}`);
31
+ }
32
+ unregister(providerName) {
33
+ this.providers.delete(providerName);
34
+ console.log(`Unregistered provider: ${providerName}`);
35
+ }
36
+ getProvider(name) {
37
+ return this.providers.get(name)?.provider;
38
+ }
39
+ getAllProviders() {
40
+ return Array.from(this.providers.values()).map(entry => entry.provider);
41
+ }
42
+ getEnabledProviders() {
43
+ return Array.from(this.providers.values())
44
+ .filter(entry => entry.config.enabled)
45
+ .sort((a, b) => (b.config.priority || 0) - (a.config.priority || 0))
46
+ .map(entry => entry.provider);
47
+ }
48
+ async getPrice(request) {
49
+ const cacheKey = this.getCacheKey(request);
50
+ const cached = this.getFromCache(cacheKey);
51
+ if (cached) {
52
+ console.log(`Cache hit for ${request.ticker}`);
53
+ return cached;
54
+ }
55
+ const providers = this.getEnabledProviders();
56
+ if (providers.length === 0) {
57
+ throw new Error('No stock price providers available');
58
+ }
59
+ let lastError;
60
+ for (const provider of providers) {
61
+ const entry = this.providers.get(provider.name);
62
+ try {
63
+ const price = await this.fetchWithRetry(() => provider.fetchPrice(request), entry.config);
64
+ entry.successCount++;
65
+ this.addToCache(cacheKey, price);
66
+ console.log(`Successfully fetched ${request.ticker} from ${provider.name}`);
67
+ return price;
68
+ }
69
+ catch (error) {
70
+ entry.errorCount++;
71
+ entry.lastError = error;
72
+ entry.lastErrorTime = new Date();
73
+ lastError = error;
74
+ console.warn(`Provider ${provider.name} failed for ${request.ticker}: ${error.message}`);
75
+ }
76
+ }
77
+ throw new Error(`Failed to fetch price for ${request.ticker} from all providers. Last error: ${lastError?.message}`);
78
+ }
79
+ async getPrices(request) {
80
+ const cachedPrices = [];
81
+ const tickersToFetch = [];
82
+ // Check cache for each ticker
83
+ for (const ticker of request.tickers) {
84
+ const cacheKey = this.getCacheKey({ ticker, includeExtendedHours: request.includeExtendedHours });
85
+ const cached = this.getFromCache(cacheKey);
86
+ if (cached) {
87
+ cachedPrices.push(cached);
88
+ }
89
+ else {
90
+ tickersToFetch.push(ticker);
91
+ }
92
+ }
93
+ if (tickersToFetch.length === 0) {
94
+ console.log(`All ${request.tickers.length} tickers served from cache`);
95
+ return cachedPrices;
96
+ }
97
+ const providers = this.getEnabledProviders();
98
+ if (providers.length === 0) {
99
+ throw new Error('No stock price providers available');
100
+ }
101
+ let lastError;
102
+ let fetchedPrices = [];
103
+ for (const provider of providers) {
104
+ const entry = this.providers.get(provider.name);
105
+ try {
106
+ fetchedPrices = await this.fetchWithRetry(() => provider.fetchPrices({
107
+ tickers: tickersToFetch,
108
+ includeExtendedHours: request.includeExtendedHours
109
+ }), entry.config);
110
+ entry.successCount++;
111
+ // Cache the fetched prices
112
+ for (const price of fetchedPrices) {
113
+ const cacheKey = this.getCacheKey({
114
+ ticker: price.ticker,
115
+ includeExtendedHours: request.includeExtendedHours
116
+ });
117
+ this.addToCache(cacheKey, price);
118
+ }
119
+ console.log(`Successfully fetched ${fetchedPrices.length} prices from ${provider.name}`);
120
+ break;
121
+ }
122
+ catch (error) {
123
+ entry.errorCount++;
124
+ entry.lastError = error;
125
+ entry.lastErrorTime = new Date();
126
+ lastError = error;
127
+ console.warn(`Provider ${provider.name} failed for batch request: ${error.message}`);
128
+ }
129
+ }
130
+ if (fetchedPrices.length === 0 && lastError) {
131
+ throw new Error(`Failed to fetch prices from all providers. Last error: ${lastError.message}`);
132
+ }
133
+ return [...cachedPrices, ...fetchedPrices];
134
+ }
135
+ async checkProvidersHealth() {
136
+ const health = new Map();
137
+ for (const [name, entry] of this.providers) {
138
+ if (!entry.config.enabled) {
139
+ health.set(name, false);
140
+ continue;
141
+ }
142
+ try {
143
+ const isAvailable = await entry.provider.isAvailable();
144
+ health.set(name, isAvailable);
145
+ }
146
+ catch (error) {
147
+ health.set(name, false);
148
+ console.error(`Health check failed for ${name}:`, error);
149
+ }
150
+ }
151
+ return health;
152
+ }
153
+ getProviderStats() {
154
+ const stats = new Map();
155
+ for (const [name, entry] of this.providers) {
156
+ stats.set(name, {
157
+ successCount: entry.successCount,
158
+ errorCount: entry.errorCount,
159
+ lastError: entry.lastError?.message,
160
+ lastErrorTime: entry.lastErrorTime
161
+ });
162
+ }
163
+ return stats;
164
+ }
165
+ clearCache() {
166
+ this.cache.clear();
167
+ console.log('Cache cleared');
168
+ }
169
+ setCacheTTL(ttl) {
170
+ this.cacheConfig.ttl = ttl;
171
+ console.log(`Cache TTL set to ${ttl}ms`);
172
+ }
173
+ async fetchWithRetry(fetchFn, config) {
174
+ const maxAttempts = config.retryAttempts || 1;
175
+ let lastError;
176
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
177
+ try {
178
+ return await fetchFn();
179
+ }
180
+ catch (error) {
181
+ lastError = error;
182
+ if (attempt < maxAttempts) {
183
+ const delay = (config.retryDelay || 1000) * attempt;
184
+ console.log(`Retry attempt ${attempt} after ${delay}ms`);
185
+ await plugins.smartdelay.delayFor(delay);
186
+ }
187
+ }
188
+ }
189
+ throw lastError || new Error('Unknown error during fetch');
190
+ }
191
+ getCacheKey(request) {
192
+ return `${request.ticker}:${request.includeExtendedHours || false}`;
193
+ }
194
+ getFromCache(key) {
195
+ const entry = this.cache.get(key);
196
+ if (!entry) {
197
+ return null;
198
+ }
199
+ const age = Date.now() - entry.timestamp.getTime();
200
+ if (age > this.cacheConfig.ttl) {
201
+ this.cache.delete(key);
202
+ return null;
203
+ }
204
+ return entry.price;
205
+ }
206
+ addToCache(key, price) {
207
+ // Enforce max entries limit
208
+ if (this.cache.size >= this.cacheConfig.maxEntries) {
209
+ // Remove oldest entry
210
+ const oldestKey = this.cache.keys().next().value;
211
+ if (oldestKey) {
212
+ this.cache.delete(oldestKey);
213
+ }
214
+ }
215
+ this.cache.set(key, {
216
+ price,
217
+ timestamp: new Date()
218
+ });
219
+ }
220
+ }
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdG9ja3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9zdG9ja3MvY2xhc3Nlcy5zdG9ja3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFrQnpDLE1BQU0sT0FBTyxpQkFBaUI7SUFVNUIsWUFBWSxXQUFtRDtRQVR2RCxjQUFTLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7UUFDOUMsVUFBSyxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBQ3ZDLFdBQU0sR0FBRyxPQUFPLENBQUM7UUFFakIsZ0JBQVcsR0FBRztZQUNwQixHQUFHLEVBQUUsS0FBSyxFQUFFLHFCQUFxQjtZQUNqQyxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDO1FBR0EsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDN0QsQ0FBQztJQUNILENBQUM7SUFFTSxRQUFRLENBQUMsUUFBd0IsRUFBRSxNQUF3QjtRQUNoRSxNQUFNLGFBQWEsR0FBb0I7WUFDckMsT0FBTyxFQUFFLElBQUk7WUFDYixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7WUFDM0IsT0FBTyxFQUFFLEtBQUs7WUFDZCxhQUFhLEVBQUUsQ0FBQztZQUNoQixVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDO1FBRUYsTUFBTSxZQUFZLEdBQUcsRUFBRSxHQUFHLGFBQWEsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBRXJELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDaEMsUUFBUTtZQUNSLE1BQU0sRUFBRSxZQUFZO1lBQ3BCLFlBQVksRUFBRSxDQUFDO1lBQ2YsVUFBVSxFQUFFLENBQUM7U0FDZCxDQUFDLENBQUM7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
@@ -0,0 +1,4 @@
1
+ export * from './interfaces/stockprice.js';
2
+ export * from './interfaces/provider.js';
3
+ export * from './classes.stockservice.js';
4
+ export * from './providers/provider.yahoo.js';
@@ -0,0 +1,8 @@
1
+ // Export all interfaces
2
+ export * from './interfaces/stockprice.js';
3
+ export * from './interfaces/provider.js';
4
+ // Export main service
5
+ export * from './classes.stockservice.js';
6
+ // Export providers
7
+ export * from './providers/provider.yahoo.js';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9zdG9ja3MvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0JBQXdCO0FBQ3hCLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYywwQkFBMEIsQ0FBQztBQUV6QyxzQkFBc0I7QUFDdEIsY0FBYywyQkFBMkIsQ0FBQztBQUUxQyxtQkFBbUI7QUFDbkIsY0FBYywrQkFBK0IsQ0FBQyJ9
@@ -0,0 +1,30 @@
1
+ import type { IStockPrice, IStockQuoteRequest, IStockBatchQuoteRequest } from './stockprice.js';
2
+ export interface IStockProvider {
3
+ name: string;
4
+ priority: number;
5
+ fetchPrice(request: IStockQuoteRequest): Promise<IStockPrice>;
6
+ fetchPrices(request: IStockBatchQuoteRequest): Promise<IStockPrice[]>;
7
+ isAvailable(): Promise<boolean>;
8
+ supportsMarket?(market: string): boolean;
9
+ supportsTicker?(ticker: string): boolean;
10
+ readonly requiresAuth: boolean;
11
+ readonly rateLimit?: {
12
+ requestsPerMinute: number;
13
+ requestsPerDay?: number;
14
+ };
15
+ }
16
+ export interface IProviderConfig {
17
+ enabled: boolean;
18
+ priority?: number;
19
+ apiKey?: string;
20
+ timeout?: number;
21
+ retryAttempts?: number;
22
+ retryDelay?: number;
23
+ }
24
+ export interface IProviderRegistry {
25
+ register(provider: IStockProvider, config?: IProviderConfig): void;
26
+ unregister(providerName: string): void;
27
+ getProvider(name: string): IStockProvider | undefined;
28
+ getAllProviders(): IStockProvider[];
29
+ getEnabledProviders(): IStockProvider[];
30
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zdG9ja3MvaW50ZXJmYWNlcy9wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,27 @@
1
+ export interface IStockPrice {
2
+ ticker: string;
3
+ price: number;
4
+ currency: string;
5
+ change: number;
6
+ changePercent: number;
7
+ previousClose: number;
8
+ timestamp: Date;
9
+ provider: string;
10
+ marketState: 'PRE' | 'REGULAR' | 'POST' | 'CLOSED';
11
+ exchange?: string;
12
+ exchangeName?: string;
13
+ }
14
+ export interface IStockPriceError {
15
+ ticker: string;
16
+ error: string;
17
+ provider: string;
18
+ timestamp: Date;
19
+ }
20
+ export interface IStockQuoteRequest {
21
+ ticker: string;
22
+ includeExtendedHours?: boolean;
23
+ }
24
+ export interface IStockBatchQuoteRequest {
25
+ tickers: string[];
26
+ includeExtendedHours?: boolean;
27
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2twcmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3N0b2Nrcy9pbnRlcmZhY2VzL3N0b2NrcHJpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,22 @@
1
+ import type { IStockProvider, IProviderConfig } from '../interfaces/provider.js';
2
+ import type { IStockPrice, IStockQuoteRequest, IStockBatchQuoteRequest } from '../interfaces/stockprice.js';
3
+ export declare class YahooFinanceProvider implements IStockProvider {
4
+ private config?;
5
+ name: string;
6
+ priority: number;
7
+ readonly requiresAuth = false;
8
+ readonly rateLimit: {
9
+ requestsPerMinute: number;
10
+ requestsPerDay: any;
11
+ };
12
+ private logger;
13
+ private baseUrl;
14
+ private userAgent;
15
+ constructor(config?: IProviderConfig);
16
+ fetchPrice(request: IStockQuoteRequest): Promise<IStockPrice>;
17
+ fetchPrices(request: IStockBatchQuoteRequest): Promise<IStockPrice[]>;
18
+ isAvailable(): Promise<boolean>;
19
+ supportsMarket(market: string): boolean;
20
+ supportsTicker(ticker: string): boolean;
21
+ private determineMarketState;
22
+ }
@@ -0,0 +1,139 @@
1
+ import * as plugins from '../../plugins.js';
2
+ export class YahooFinanceProvider {
3
+ constructor(config) {
4
+ this.config = config;
5
+ this.name = 'Yahoo Finance';
6
+ this.priority = 100;
7
+ this.requiresAuth = false;
8
+ this.rateLimit = {
9
+ requestsPerMinute: 100, // Conservative estimate
10
+ requestsPerDay: undefined
11
+ };
12
+ this.logger = console;
13
+ this.baseUrl = 'https://query1.finance.yahoo.com';
14
+ this.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';
15
+ }
16
+ async fetchPrice(request) {
17
+ try {
18
+ const url = `${this.baseUrl}/v8/finance/chart/${request.ticker}`;
19
+ const response = await plugins.smartrequest.getJson(url, {
20
+ headers: {
21
+ 'User-Agent': this.userAgent
22
+ },
23
+ timeout: this.config?.timeout || 10000
24
+ });
25
+ const responseData = response.body;
26
+ if (!responseData?.chart?.result?.[0]) {
27
+ throw new Error(`No data found for ticker ${request.ticker}`);
28
+ }
29
+ const data = responseData.chart.result[0];
30
+ const meta = data.meta;
31
+ if (!meta.regularMarketPrice) {
32
+ throw new Error(`No price data available for ${request.ticker}`);
33
+ }
34
+ const stockPrice = {
35
+ ticker: request.ticker.toUpperCase(),
36
+ price: meta.regularMarketPrice,
37
+ currency: meta.currency || 'USD',
38
+ change: meta.regularMarketPrice - meta.previousClose,
39
+ changePercent: ((meta.regularMarketPrice - meta.previousClose) / meta.previousClose) * 100,
40
+ previousClose: meta.previousClose,
41
+ timestamp: new Date(meta.regularMarketTime * 1000),
42
+ provider: this.name,
43
+ marketState: this.determineMarketState(meta),
44
+ exchange: meta.exchange,
45
+ exchangeName: meta.exchangeName
46
+ };
47
+ return stockPrice;
48
+ }
49
+ catch (error) {
50
+ console.error(`Failed to fetch price for ${request.ticker}:`, error);
51
+ throw new Error(`Yahoo Finance: Failed to fetch price for ${request.ticker}: ${error.message}`);
52
+ }
53
+ }
54
+ async fetchPrices(request) {
55
+ try {
56
+ const symbols = request.tickers.join(',');
57
+ const url = `${this.baseUrl}/v8/finance/spark?symbols=${symbols}&range=1d&interval=5m`;
58
+ const response = await plugins.smartrequest.getJson(url, {
59
+ headers: {
60
+ 'User-Agent': this.userAgent
61
+ },
62
+ timeout: this.config?.timeout || 15000
63
+ });
64
+ const responseData = response.body;
65
+ const prices = [];
66
+ for (const [ticker, data] of Object.entries(responseData)) {
67
+ if (!data || typeof data !== 'object')
68
+ continue;
69
+ const sparkData = data;
70
+ if (!sparkData.previousClose || !sparkData.close?.length) {
71
+ console.warn(`Incomplete data for ${ticker}, skipping`);
72
+ continue;
73
+ }
74
+ const currentPrice = sparkData.close[sparkData.close.length - 1];
75
+ const timestamp = sparkData.timestamp?.[sparkData.timestamp.length - 1];
76
+ prices.push({
77
+ ticker: ticker.toUpperCase(),
78
+ price: currentPrice,
79
+ currency: sparkData.currency || 'USD',
80
+ change: currentPrice - sparkData.previousClose,
81
+ changePercent: ((currentPrice - sparkData.previousClose) / sparkData.previousClose) * 100,
82
+ previousClose: sparkData.previousClose,
83
+ timestamp: timestamp ? new Date(timestamp * 1000) : new Date(),
84
+ provider: this.name,
85
+ marketState: sparkData.marketState || 'REGULAR',
86
+ exchange: sparkData.exchange,
87
+ exchangeName: sparkData.exchangeName
88
+ });
89
+ }
90
+ if (prices.length === 0) {
91
+ throw new Error('No valid price data received from batch request');
92
+ }
93
+ return prices;
94
+ }
95
+ catch (error) {
96
+ console.error(`Failed to fetch batch prices:`, error);
97
+ throw new Error(`Yahoo Finance: Failed to fetch batch prices: ${error.message}`);
98
+ }
99
+ }
100
+ async isAvailable() {
101
+ try {
102
+ // Test with a well-known ticker
103
+ await this.fetchPrice({ ticker: 'AAPL' });
104
+ return true;
105
+ }
106
+ catch (error) {
107
+ console.warn('Yahoo Finance provider is not available:', error);
108
+ return false;
109
+ }
110
+ }
111
+ supportsMarket(market) {
112
+ // Yahoo Finance supports most major markets
113
+ const supportedMarkets = ['US', 'UK', 'DE', 'FR', 'JP', 'CN', 'HK', 'AU', 'CA'];
114
+ return supportedMarkets.includes(market.toUpperCase());
115
+ }
116
+ supportsTicker(ticker) {
117
+ // Basic validation - Yahoo supports most tickers
118
+ return /^[A-Z0-9\.\-]{1,10}$/.test(ticker.toUpperCase());
119
+ }
120
+ determineMarketState(meta) {
121
+ const marketState = meta.marketState?.toUpperCase();
122
+ switch (marketState) {
123
+ case 'PRE':
124
+ return 'PRE';
125
+ case 'POST':
126
+ return 'POST';
127
+ case 'REGULAR':
128
+ return 'REGULAR';
129
+ default:
130
+ // Check if market is currently open based on timestamps
131
+ const now = Date.now() / 1000;
132
+ const regularMarketTime = meta.regularMarketTime;
133
+ const timeDiff = now - regularMarketTime;
134
+ // If last update was more than 1 hour ago, market is likely closed
135
+ return timeDiff > 3600 ? 'CLOSED' : 'REGULAR';
136
+ }
137
+ }
138
+ }
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIueWFob28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zdG9ja3MvcHJvdmlkZXJzL3Byb3ZpZGVyLnlhaG9vLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFJNUMsTUFBTSxPQUFPLG9CQUFvQjtJQWEvQixZQUFvQixNQUF3QjtRQUF4QixXQUFNLEdBQU4sTUFBTSxDQUFrQjtRQVpyQyxTQUFJLEdBQUcsZUFBZSxDQUFDO1FBQ3ZCLGFBQVEsR0FBRyxHQUFHLENBQUM7UUFDTixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixjQUFTLEdBQUc7WUFDMUIsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLHdCQUF3QjtZQUNoRCxjQUFjLEVBQUUsU0FBUztTQUMxQixDQUFDO1FBRU0sV0FBTSxHQUFHLE9BQU8sQ0FBQztRQUNqQixZQUFPLEdBQUcsa0NBQWtDLENBQUM7UUFDN0MsY0FBUyxHQUFHLGlIQUFpSCxDQUFDO0lBRXZGLENBQUM7SUFFekMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUEyQjtRQUNqRCxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLHFCQUFxQixPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakUsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZELE9BQU8sRUFBRTtvQkFDUCxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVM7aUJBQzdCO2dCQUNELE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxLQUFLO2FBQ3ZDLENBQUMsQ0FBQztZQUVILE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFXLENBQUM7WUFFMUMsSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FB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
package/package.json CHANGED
@@ -1,37 +1,37 @@
1
1
  {
2
2
  "name": "@fin.cx/opendata",
3
- "version": "1.5.3",
3
+ "version": "1.6.0",
4
4
  "private": false,
5
- "description": "A comprehensive TypeScript library that manages open business data for German companies by integrating MongoDB, processing JSONL bulk data, and automating browser interactions for Handelsregister data retrieval.",
5
+ "description": "A comprehensive TypeScript library for accessing business data and real-time financial information. Features include German company data management with MongoDB integration, JSONL bulk processing, automated Handelsregister interactions, and real-time stock market data from multiple providers.",
6
6
  "main": "dist_ts/index.js",
7
7
  "typings": "dist_ts/index.d.ts",
8
8
  "type": "module",
9
9
  "author": "Task Venture Capital GmbH",
10
10
  "license": "MIT",
11
11
  "devDependencies": {
12
- "@git.zone/tsbuild": "^2.3.2",
13
- "@git.zone/tsbundle": "^2.2.5",
12
+ "@git.zone/tsbuild": "^2.6.4",
13
+ "@git.zone/tsbundle": "^2.5.1",
14
14
  "@git.zone/tsrun": "^1.3.3",
15
- "@git.zone/tstest": "^1.0.96",
16
- "@push.rocks/tapbundle": "^5.6.2",
15
+ "@git.zone/tstest": "^2.3.1",
17
16
  "@types/node": "^22.14.0"
18
17
  },
19
18
  "dependencies": {
20
- "@push.rocks/lik": "^6.1.0",
19
+ "@push.rocks/lik": "^6.2.2",
21
20
  "@push.rocks/qenv": "^6.1.0",
22
21
  "@push.rocks/smartarchive": "^4.0.39",
23
22
  "@push.rocks/smartarray": "^1.1.0",
24
23
  "@push.rocks/smartbrowser": "^2.0.8",
25
- "@push.rocks/smartdata": "^5.2.12",
24
+ "@push.rocks/smartdata": "^5.15.1",
26
25
  "@push.rocks/smartdelay": "^3.0.5",
27
- "@push.rocks/smartfile": "^11.2.0",
26
+ "@push.rocks/smartfile": "^11.2.5",
27
+ "@push.rocks/smartlog": "^3.1.8",
28
28
  "@push.rocks/smartpath": "^5.0.18",
29
29
  "@push.rocks/smartpromise": "^4.2.3",
30
30
  "@push.rocks/smartrequest": "^2.1.0",
31
31
  "@push.rocks/smartstream": "^3.2.5",
32
32
  "@push.rocks/smartunique": "^3.0.9",
33
33
  "@push.rocks/smartxml": "^1.1.1",
34
- "@tsclass/tsclass": "^8.2.0"
34
+ "@tsclass/tsclass": "^9.2.0"
35
35
  },
36
36
  "repository": {
37
37
  "type": "git",
@@ -74,7 +74,7 @@
74
74
  "data retrieval"
75
75
  ],
76
76
  "scripts": {
77
- "test": "(tstest test/ --web)",
77
+ "test": "(tstest test/ --verbose)",
78
78
  "build": "(tsbuild --web --allowimplicitany)",
79
79
  "buildDocs": "(tsdoc)"
80
80
  }