lupislabs 1.0.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.
@@ -0,0 +1,517 @@
1
+ import * as api from '@opentelemetry/api';
2
+ import { createRequire } from 'module';
3
+ const requireFunc = createRequire(import.meta.url);
4
+ export class HttpInterceptor {
5
+ constructor(tracer, provider, projectId) {
6
+ this.isIntercepting = false;
7
+ this.tracer = tracer;
8
+ this.provider = provider;
9
+ this.projectId = projectId;
10
+ }
11
+ startIntercepting() {
12
+ if (this.isIntercepting) {
13
+ return;
14
+ }
15
+ this.isIntercepting = true;
16
+ this.patchFetch();
17
+ this.patchNodeHttp();
18
+ }
19
+ stopIntercepting() {
20
+ if (!this.isIntercepting)
21
+ return;
22
+ this.isIntercepting = false;
23
+ if (this.originalFetch && typeof globalThis.fetch === 'function') {
24
+ globalThis.fetch = this.originalFetch;
25
+ }
26
+ try {
27
+ const http = requireFunc('http');
28
+ const https = requireFunc('https');
29
+ if (this.originalHttpRequest) {
30
+ http.request = this.originalHttpRequest;
31
+ }
32
+ if (this.originalHttpsRequest) {
33
+ https.request = this.originalHttpsRequest;
34
+ }
35
+ }
36
+ catch (e) {
37
+ }
38
+ }
39
+ patchFetch() {
40
+ try {
41
+ if (typeof globalThis.fetch !== 'function') {
42
+ return;
43
+ }
44
+ this.originalFetch = globalThis.fetch;
45
+ const self = this;
46
+ globalThis.fetch = async function (input, init) {
47
+ const startTime = Date.now();
48
+ const url = typeof input === 'string' ? input : input.toString();
49
+ const method = init?.method || 'GET';
50
+ const provider = self.detectProvider(url);
51
+ const handler = self.resolveHandler(provider);
52
+ if (url.includes('/v1/traces')) {
53
+ return self.originalFetch(input, init);
54
+ }
55
+ const span = self.tracer.startSpan(`HTTP ${method}`, {
56
+ kind: api.SpanKind.CLIENT,
57
+ attributes: {
58
+ 'http.method': method,
59
+ 'http.url': url,
60
+ 'url.full': url,
61
+ 'http.provider': provider,
62
+ 'lupis.project.id': self.projectId,
63
+ 'lupis.complete': 'true',
64
+ },
65
+ });
66
+ if (init?.body) {
67
+ const requestBody = typeof init.body === 'string' ? init.body : JSON.stringify(init.body);
68
+ span.setAttribute('http.request.body', requestBody);
69
+ }
70
+ if (init?.headers) {
71
+ const headers = {};
72
+ if (init.headers instanceof Headers) {
73
+ init.headers.forEach((value, key) => {
74
+ headers[key] = value;
75
+ });
76
+ }
77
+ else if (Array.isArray(init.headers)) {
78
+ init.headers.forEach(([key, value]) => {
79
+ headers[key] = value;
80
+ });
81
+ }
82
+ else {
83
+ Object.assign(headers, init.headers);
84
+ }
85
+ span.setAttribute('http.request.headers', JSON.stringify(headers));
86
+ }
87
+ try {
88
+ const response = await self.originalFetch(input, init);
89
+ const duration = Date.now() - startTime;
90
+ span.setAttribute('http.status_code', response.status);
91
+ span.setAttribute('http.response.status_code', response.status);
92
+ span.setAttribute('http.response.status', response.status);
93
+ const responseHeaders = Object.fromEntries(response.headers.entries());
94
+ span.setAttribute('http.response.headers', JSON.stringify(responseHeaders));
95
+ // Try tee() first - if it works, we have a true streaming response
96
+ if (response.body && typeof response.body.tee === 'function') {
97
+ const bodyStream = response.body;
98
+ const [clientStream, traceStream] = bodyStream.tee();
99
+ const decoder = new TextDecoder();
100
+ const chunks = [];
101
+ let providerState = undefined;
102
+ const trackStream = async () => {
103
+ const reader = traceStream.getReader();
104
+ try {
105
+ while (true) {
106
+ const { done, value } = await reader.read();
107
+ if (done) {
108
+ const remaining = decoder.decode();
109
+ if (remaining) {
110
+ chunks.push(remaining);
111
+ }
112
+ break;
113
+ }
114
+ if (value) {
115
+ const chunkText = decoder.decode(value, { stream: true });
116
+ if (chunkText) {
117
+ chunks.push(chunkText);
118
+ if (handler && handler.isStreamingChunk(chunkText)) {
119
+ const { state, result } = handler.accumulateChunk(providerState, chunkText);
120
+ providerState = state;
121
+ if (result) {
122
+ // no-op for now; we only send final aggregated trace to minimize noise
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ // Send only final aggregated trace
129
+ let bodyText = chunks.join('');
130
+ let normalized = bodyText;
131
+ try {
132
+ if (handler) {
133
+ if (providerState && Array.isArray(providerState.__rawChunks)) {
134
+ const data = providerState.__rawChunks;
135
+ const aggregatedText = providerState.__aggregatedText;
136
+ const toolCalls = providerState.__toolCalls;
137
+ const usage = providerState.__usage;
138
+ normalized = {
139
+ type: 'streaming_response',
140
+ provider,
141
+ aggregatedText,
142
+ data,
143
+ toolCalls,
144
+ usage,
145
+ contentType: response.headers.get('content-type') || undefined,
146
+ totalChunks: data.length,
147
+ totalLength: data.reduce((n, s) => n + s.length, 0),
148
+ isComplete: true,
149
+ };
150
+ span.setAttribute('http.response.body', JSON.stringify(normalized));
151
+ }
152
+ else {
153
+ normalized = handler.normalizeFinal(bodyText);
154
+ span.setAttribute('http.response.body', typeof normalized === 'string' ? normalized : JSON.stringify(normalized));
155
+ }
156
+ }
157
+ else {
158
+ span.setAttribute('http.response.body', bodyText);
159
+ }
160
+ }
161
+ catch (e) {
162
+ span.setAttribute('http.response.body', bodyText);
163
+ }
164
+ span.setStatus({ code: response.ok ? api.SpanStatusCode.OK : api.SpanStatusCode.ERROR });
165
+ span.end();
166
+ }
167
+ catch (error) {
168
+ span.recordException(error);
169
+ span.setStatus({
170
+ code: api.SpanStatusCode.ERROR,
171
+ message: error.message
172
+ });
173
+ span.end();
174
+ }
175
+ };
176
+ trackStream().catch(console.warn);
177
+ return new Response(clientStream, {
178
+ headers: response.headers,
179
+ status: response.status,
180
+ statusText: response.statusText,
181
+ });
182
+ }
183
+ // For non-streaming responses or when tee() isn't available, handle as regular response
184
+ if (response.body && typeof response.body.getReader === 'function') {
185
+ const clone = response.clone();
186
+ const responseText = await self.getRawResponseText(clone);
187
+ let normalizedBody = responseText;
188
+ try {
189
+ if (handler) {
190
+ normalizedBody = handler.normalizeFinal(responseText);
191
+ }
192
+ }
193
+ catch (e) {
194
+ normalizedBody = responseText;
195
+ }
196
+ span.setAttribute('http.response.body', typeof normalizedBody === 'string' ? normalizedBody : JSON.stringify(normalizedBody));
197
+ span.setStatus({ code: response.ok ? api.SpanStatusCode.OK : api.SpanStatusCode.ERROR });
198
+ span.end();
199
+ return response;
200
+ }
201
+ span.setAttribute('http.response.body', '');
202
+ span.setStatus({ code: response.ok ? api.SpanStatusCode.OK : api.SpanStatusCode.ERROR });
203
+ span.end();
204
+ return response;
205
+ }
206
+ catch (error) {
207
+ span.recordException(error);
208
+ span.setStatus({
209
+ code: api.SpanStatusCode.ERROR,
210
+ message: error.message
211
+ });
212
+ span.end();
213
+ throw error;
214
+ }
215
+ };
216
+ }
217
+ catch (e) {
218
+ console.warn('[Lupis SDK] Failed to patch fetch:', e);
219
+ }
220
+ }
221
+ patchNodeHttp() {
222
+ try {
223
+ const http = requireFunc('http');
224
+ const https = requireFunc('https');
225
+ const zlib = requireFunc('zlib');
226
+ this.zlib = zlib;
227
+ this.originalHttpRequest = http.request;
228
+ this.originalHttpsRequest = https.request;
229
+ const self = this;
230
+ const createPatchedRequest = (original, protocol) => {
231
+ return function (options, callback) {
232
+ const url = typeof options === 'string' ? options :
233
+ `${protocol}://${options.hostname || options.host || 'localhost'}${options.port ? ':' + options.port : ''}${options.path || '/'}`;
234
+ const method = options.method || 'GET';
235
+ const provider = self.detectProvider(url);
236
+ const span = self.tracer.startSpan(`HTTP ${method}`, {
237
+ kind: api.SpanKind.CLIENT,
238
+ attributes: {
239
+ 'http.method': method,
240
+ 'http.url': url,
241
+ 'url.full': url,
242
+ 'http.provider': provider,
243
+ 'lupis.project.id': self.projectId,
244
+ 'lupis.complete': 'true',
245
+ },
246
+ });
247
+ const startTime = Date.now();
248
+ let requestBody = '';
249
+ const req = original.call(this, options, (res) => {
250
+ const duration = Date.now() - startTime;
251
+ span.setAttribute('http.status_code', res.statusCode);
252
+ span.setAttribute('http.response.status_code', res.statusCode);
253
+ span.setAttribute('http.response.status', res.statusCode);
254
+ const responseHeaders = {};
255
+ Object.keys(res.headers || {}).forEach(key => {
256
+ responseHeaders[key] = res.headers[key];
257
+ });
258
+ span.setAttribute('http.response.headers', JSON.stringify(responseHeaders));
259
+ const responseChunks = [];
260
+ const originalOn = res.on.bind(res);
261
+ const providerHandler = self.resolveHandler(provider);
262
+ const contentType = res.headers['content-type'] || '';
263
+ const isStreaming = contentType.includes('text/event-stream');
264
+ let streamState = undefined;
265
+ res.on = function (event, handler) {
266
+ if (event === 'data') {
267
+ return originalOn(event, (chunk) => {
268
+ responseChunks.push(Buffer.from(chunk));
269
+ if (isStreaming && providerHandler) {
270
+ const chunkText = chunk.toString('utf8');
271
+ if (providerHandler.isStreamingChunk(chunkText)) {
272
+ const { state } = providerHandler.accumulateChunk(streamState, chunkText);
273
+ streamState = state;
274
+ }
275
+ }
276
+ return handler(chunk);
277
+ });
278
+ }
279
+ if (event === 'end') {
280
+ return originalOn(event, () => {
281
+ if (responseChunks.length > 0) {
282
+ try {
283
+ const buffer = Buffer.concat(responseChunks);
284
+ const contentEncoding = res.headers['content-encoding'];
285
+ const decompressed = self.decompressIfNeeded(buffer, contentEncoding);
286
+ const limitedText = decompressed.length > 1000000
287
+ ? decompressed.substring(0, 1000000) + '...[truncated]'
288
+ : decompressed;
289
+ let normalizedBody = limitedText;
290
+ if (providerHandler) {
291
+ if (isStreaming && streamState && Array.isArray(streamState.__rawChunks)) {
292
+ normalizedBody = {
293
+ type: 'streaming_response',
294
+ provider,
295
+ aggregatedText: streamState.__aggregatedText,
296
+ data: streamState.__rawChunks,
297
+ toolCalls: streamState.__toolCalls,
298
+ usage: streamState.__usage,
299
+ contentType,
300
+ totalChunks: streamState.__rawChunks.length,
301
+ totalLength: streamState.__rawChunks.reduce((n, s) => n + s.length, 0),
302
+ isComplete: true,
303
+ };
304
+ }
305
+ else {
306
+ normalizedBody = providerHandler.normalizeFinal(limitedText);
307
+ }
308
+ }
309
+ span.setAttribute('http.response.body', typeof normalizedBody === 'string' ? normalizedBody : JSON.stringify(normalizedBody));
310
+ }
311
+ catch (e) {
312
+ span.setAttribute('http.response.body', `[Unable to process response: ${e instanceof Error ? e.message : String(e)}]`);
313
+ }
314
+ }
315
+ span.setStatus({
316
+ code: res.statusCode >= 200 && res.statusCode < 400 ?
317
+ api.SpanStatusCode.OK : api.SpanStatusCode.ERROR
318
+ });
319
+ span.end();
320
+ return handler();
321
+ });
322
+ }
323
+ return originalOn(event, handler);
324
+ };
325
+ if (callback) {
326
+ callback(res);
327
+ }
328
+ });
329
+ const originalWrite = req.write.bind(req);
330
+ req.write = function (chunk, encoding, callback) {
331
+ if (chunk) {
332
+ requestBody += chunk.toString();
333
+ }
334
+ return originalWrite(chunk, encoding, callback);
335
+ };
336
+ const originalEnd = req.end.bind(req);
337
+ req.end = function (chunk, encoding, callback) {
338
+ if (chunk) {
339
+ requestBody += chunk.toString();
340
+ }
341
+ if (requestBody) {
342
+ span.setAttribute('http.request.body', requestBody);
343
+ }
344
+ if (options.headers) {
345
+ span.setAttribute('http.request.headers', JSON.stringify(options.headers));
346
+ }
347
+ return originalEnd(chunk, encoding, callback);
348
+ };
349
+ req.on('error', (error) => {
350
+ span.recordException(error);
351
+ span.setStatus({
352
+ code: api.SpanStatusCode.ERROR,
353
+ message: error.message
354
+ });
355
+ span.end();
356
+ });
357
+ return req;
358
+ };
359
+ };
360
+ http.request = createPatchedRequest(this.originalHttpRequest, 'http');
361
+ https.request = createPatchedRequest(this.originalHttpsRequest, 'https');
362
+ }
363
+ catch (e) {
364
+ console.warn('[Lupis SDK] Failed to patch Node.js http/https:', e);
365
+ }
366
+ }
367
+ detectProvider(url) {
368
+ if (url.includes('api.openai.com'))
369
+ return 'openai';
370
+ if (url.includes('api.anthropic.com'))
371
+ return 'claude';
372
+ if (url.includes('api.cohere.ai'))
373
+ return 'cohere';
374
+ if (url.includes('api.huggingface.co'))
375
+ return 'huggingface';
376
+ if (url.includes('api.google.com'))
377
+ return 'google';
378
+ return 'unknown';
379
+ }
380
+ resolveHandler(provider) {
381
+ const p = provider;
382
+ switch (p) {
383
+ case 'openai':
384
+ return OpenAIHandler;
385
+ case 'claude':
386
+ return AnthropicHandler;
387
+ default:
388
+ return undefined;
389
+ }
390
+ }
391
+ async getRawResponseText(response) {
392
+ try {
393
+ const text = await response.text();
394
+ return text.length > 1000000 ? text.substring(0, 1000000) + '...' : text;
395
+ }
396
+ catch (error) {
397
+ return `[Unable to read response body: ${error instanceof Error ? error.message : String(error)}]`;
398
+ }
399
+ }
400
+ decompressIfNeeded(buffer, encoding) {
401
+ try {
402
+ if (!encoding) {
403
+ return buffer.toString('utf8');
404
+ }
405
+ if (!this.zlib) {
406
+ console.warn('[Lupis SDK] zlib not available, cannot decompress');
407
+ return buffer.toString('utf8');
408
+ }
409
+ if (encoding === 'gzip') {
410
+ const decompressed = this.zlib.gunzipSync(buffer);
411
+ return decompressed.toString('utf8');
412
+ }
413
+ else if (encoding === 'deflate') {
414
+ const decompressed = this.zlib.inflateSync(buffer);
415
+ return decompressed.toString('utf8');
416
+ }
417
+ else if (encoding === 'br') {
418
+ const decompressed = this.zlib.brotliDecompressSync(buffer);
419
+ return decompressed.toString('utf8');
420
+ }
421
+ return buffer.toString('utf8');
422
+ }
423
+ catch (error) {
424
+ console.warn('[Lupis SDK] Failed to decompress response:', error);
425
+ return buffer.toString('utf8');
426
+ }
427
+ }
428
+ }
429
+ const OpenAIHandler = {
430
+ provider: 'openai',
431
+ detect: (url) => url.includes('api.openai.com'),
432
+ isStreamingChunk: (textChunk) => textChunk.includes('\ndata: '),
433
+ accumulateChunk: (state, textChunk) => {
434
+ const next = state || { __rawChunks: [], __aggregatedText: '', __toolCalls: [], __usage: null };
435
+ next.__rawChunks.push(textChunk);
436
+ const lines = textChunk.split('\n');
437
+ for (const line of lines) {
438
+ if (!line.startsWith('data: '))
439
+ continue;
440
+ const payload = line.substring(6).trim();
441
+ if (payload === '[DONE]')
442
+ continue;
443
+ try {
444
+ const json = JSON.parse(payload);
445
+ if (Array.isArray(json.choices)) {
446
+ for (const choice of json.choices) {
447
+ if (choice.delta?.content)
448
+ next.__aggregatedText += choice.delta.content;
449
+ if (Array.isArray(choice.delta?.tool_calls))
450
+ next.__toolCalls.push(...choice.delta.tool_calls);
451
+ }
452
+ }
453
+ if (json?.usage) {
454
+ next.__usage = json.usage;
455
+ }
456
+ }
457
+ catch { }
458
+ }
459
+ return { state: next };
460
+ },
461
+ normalizeFinal: (rawBodyText) => {
462
+ try {
463
+ const parsed = JSON.parse(rawBodyText);
464
+ const aggregatedText = parsed.choices?.[0]?.message?.content || '';
465
+ return { ...parsed, aggregatedText };
466
+ }
467
+ catch {
468
+ return rawBodyText;
469
+ }
470
+ },
471
+ };
472
+ const AnthropicHandler = {
473
+ provider: 'claude',
474
+ detect: (url) => url.includes('api.anthropic.com'),
475
+ isStreamingChunk: (textChunk) => textChunk.includes('\nevent: ') || textChunk.includes('\ndata: '),
476
+ accumulateChunk: (state, textChunk) => {
477
+ const next = state || { __rawChunks: [], __aggregatedText: '', __toolCalls: [], __usage: null };
478
+ next.__rawChunks.push(textChunk);
479
+ const lines = textChunk.split('\n');
480
+ for (const line of lines) {
481
+ if (!line.startsWith('data: '))
482
+ continue;
483
+ try {
484
+ const json = JSON.parse(line.substring(6));
485
+ if (json?.delta?.text)
486
+ next.__aggregatedText += json.delta.text;
487
+ if (json?.type === 'tool_use') {
488
+ next.__toolCalls.push({
489
+ id: json.id,
490
+ name: json.name,
491
+ type: 'function',
492
+ function: { name: json.name, arguments: JSON.stringify(json.input || {}) },
493
+ });
494
+ }
495
+ if (json?.usage) {
496
+ next.__usage = json.usage;
497
+ }
498
+ if (json?.type === 'message_delta' && json?.usage) {
499
+ next.__usage = json.usage;
500
+ }
501
+ }
502
+ catch { }
503
+ }
504
+ return { state: next };
505
+ },
506
+ normalizeFinal: (rawBodyText) => {
507
+ try {
508
+ const parsed = JSON.parse(rawBodyText);
509
+ const aggregatedText = parsed.content?.[0]?.text || '';
510
+ return { ...parsed, aggregatedText };
511
+ }
512
+ catch {
513
+ return rawBodyText;
514
+ }
515
+ },
516
+ };
517
+ //# sourceMappingURL=http-interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-interceptor.js","sourceRoot":"","sources":["../src/http-interceptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export type ProviderName = 'openai' | 'claude' | 'cohere' | 'huggingface' | 'google' | 'unknown';
2
+ export interface NormalizedStreamingResult {
3
+ type: 'streaming_response';
4
+ provider: ProviderName;
5
+ model?: string;
6
+ aggregatedText?: string;
7
+ data?: string[];
8
+ toolCalls?: any[];
9
+ usage?: any;
10
+ contentType?: string;
11
+ totalChunks?: number;
12
+ totalLength?: number;
13
+ isComplete?: boolean;
14
+ }
15
+ export interface ProviderHandler {
16
+ provider: ProviderName;
17
+ detect: (url: string) => boolean;
18
+ isStreamingChunk: (textChunk: string) => boolean;
19
+ accumulateChunk: (state: any, textChunk: string) => {
20
+ state: any;
21
+ result?: NormalizedStreamingResult;
22
+ };
23
+ normalizeFinal: (rawBodyText: string) => any;
24
+ }
25
+ //# sourceMappingURL=http-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-types.d.ts","sourceRoot":"","sources":["../src/http-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjG,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACjC,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACjD,eAAe,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,KAAK;QAAE,KAAK,EAAE,GAAG,CAAC;QAAC,MAAM,CAAC,EAAE,yBAAyB,CAAA;KAAE,CAAC;IACvG,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,GAAG,CAAC;CAC9C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=http-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-types.js","sourceRoot":"","sources":["../src/http-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import * as api from '@opentelemetry/api';
2
+ import { LupisConfig, LupisBlockOptions } from './types.js';
3
+ export declare class LupisSDK {
4
+ private tracer;
5
+ constructor(config: LupisConfig);
6
+ setChatId(chatId: string): void;
7
+ clearChatId(): void;
8
+ run<T>(fn: () => Promise<T> | T, options?: LupisBlockOptions): Promise<T>;
9
+ getTracer(): api.Tracer;
10
+ createSpan(name: string, attributes?: api.Attributes, spanKind?: api.SpanKind): api.Span;
11
+ shutdown(): Promise<void>;
12
+ }
13
+ export { LupisTracer } from './tracer.js';
14
+ export { LupisConfig, LupisBlockOptions } from './types.js';
15
+ export * as otel from '@opentelemetry/api';
16
+ export default LupisSDK;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5D,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,WAAW;IAI/B,SAAS,CAAC,MAAM,EAAE,MAAM;IAIxB,WAAW;IAIL,GAAG,CAAC,CAAC,EACT,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACxB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,CAAC,CAAC;IAeb,SAAS,IAAI,GAAG,CAAC,MAAM;IAIvB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI;IAIlF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAC3C,eAAe,QAAQ,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,39 @@
1
+ import { LupisTracer } from './tracer.js';
2
+ export class LupisSDK {
3
+ constructor(config) {
4
+ this.tracer = new LupisTracer(config);
5
+ }
6
+ setChatId(chatId) {
7
+ this.tracer.setChatId(chatId);
8
+ }
9
+ clearChatId() {
10
+ this.tracer.clearChatId();
11
+ }
12
+ async run(fn, options = {}) {
13
+ if (options.chatId) {
14
+ this.setChatId(options.chatId);
15
+ }
16
+ try {
17
+ const result = await fn();
18
+ return result;
19
+ }
20
+ finally {
21
+ if (options.chatId) {
22
+ this.clearChatId();
23
+ }
24
+ }
25
+ }
26
+ getTracer() {
27
+ return this.tracer.getTracer();
28
+ }
29
+ createSpan(name, attributes, spanKind) {
30
+ return this.tracer.createSpan(name, attributes, spanKind);
31
+ }
32
+ async shutdown() {
33
+ await this.tracer.shutdown();
34
+ }
35
+ }
36
+ export { LupisTracer } from './tracer.js';
37
+ export * as otel from '@opentelemetry/api';
38
+ export default LupisSDK;
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,OAAO,QAAQ;IAGnB,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,WAAW;QACT,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,GAAG,CACP,EAAwB,EACxB,UAA6B,EAAE;QAE/B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IACjC,CAAC;IAED,UAAU,CAAC,IAAY,EAAE,UAA2B,EAAE,QAAuB;QAC3E,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;CACF;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAC3C,eAAe,QAAQ,CAAC"}