@mastra/loggers 1.2.0-alpha.0 → 1.3.0-alpha.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.
@@ -1,218 +1,181 @@
1
- 'use strict';
2
-
3
- var logger = require('@mastra/core/logger');
4
-
5
- // src/upstash/index.ts
6
- var UpstashTransport = class extends logger.LoggerTransport {
7
- upstashUrl;
8
- upstashToken;
9
- listName;
10
- maxListLength;
11
- batchSize;
12
- flushInterval;
13
- logBuffer;
14
- lastFlush;
15
- flushIntervalId;
16
- constructor(opts) {
17
- super({ objectMode: true });
18
- if (!opts.upstashUrl || !opts.upstashToken) {
19
- throw new Error("Upstash URL and token are required");
20
- }
21
- this.upstashUrl = opts.upstashUrl;
22
- this.upstashToken = opts.upstashToken;
23
- this.listName = opts.listName || "application-logs";
24
- this.maxListLength = opts.maxListLength || 1e4;
25
- this.batchSize = opts.batchSize || 100;
26
- this.flushInterval = opts.flushInterval || 1e4;
27
- this.logBuffer = [];
28
- this.lastFlush = Date.now();
29
- this.flushIntervalId = setInterval(() => {
30
- this._flush().catch((err) => {
31
- console.error("Error flushing logs to Upstash:", err);
32
- });
33
- }, this.flushInterval);
34
- }
35
- async executeUpstashCommand(command) {
36
- const response = await fetch(`${this.upstashUrl}/pipeline`, {
37
- method: "POST",
38
- headers: {
39
- Authorization: `Bearer ${this.upstashToken}`,
40
- "Content-Type": "application/json"
41
- },
42
- body: JSON.stringify([command])
43
- });
44
- if (!response.ok) {
45
- throw new Error(`Failed to execute Upstash command: ${response.statusText}`);
46
- }
47
- return response.json();
48
- }
49
- async _flush() {
50
- if (this.logBuffer.length === 0) {
51
- return;
52
- }
53
- const now = Date.now();
54
- const logs = this.logBuffer.splice(0, this.batchSize);
55
- try {
56
- const command = ["LPUSH", this.listName, ...logs.map((log) => JSON.stringify(log))];
57
- if (this.maxListLength > 0) {
58
- command.push("LTRIM", this.listName, 0, this.maxListLength - 1);
59
- }
60
- await this.executeUpstashCommand(command);
61
- this.lastFlush = now;
62
- } catch (error) {
63
- this.logBuffer.unshift(...logs);
64
- throw error;
65
- }
66
- }
67
- _write(chunk, encoding, callback) {
68
- if (typeof callback === "function") {
69
- this._transform(chunk, encoding || "utf8", callback);
70
- return true;
71
- }
72
- this._transform(chunk, encoding || "utf8", (error) => {
73
- if (error) console.error("Transform error in write:", error);
74
- });
75
- return true;
76
- }
77
- _transform(chunk, _enc, cb) {
78
- try {
79
- const log = typeof chunk === "string" ? JSON.parse(chunk) : chunk;
80
- if (!log.time) {
81
- log.time = Date.now();
82
- }
83
- this.logBuffer.push(log);
84
- if (this.logBuffer.length >= this.batchSize) {
85
- this._flush().catch((err) => {
86
- console.error("Error flushing logs to Upstash:", err);
87
- });
88
- }
89
- cb(null, chunk);
90
- } catch (error) {
91
- cb(error);
92
- }
93
- }
94
- _destroy(err, cb) {
95
- clearInterval(this.flushIntervalId);
96
- if (this.logBuffer.length > 0) {
97
- this._flush().then(() => cb(err)).catch((flushErr) => {
98
- console.error("Error in final flush:", flushErr);
99
- cb(err || flushErr);
100
- });
101
- } else {
102
- cb(err);
103
- }
104
- }
105
- async listLogs(params) {
106
- try {
107
- const command = ["LRANGE", this.listName, 0, -1];
108
- const response = await this.executeUpstashCommand(command);
109
- const logs = response?.[0]?.result?.map((log) => {
110
- try {
111
- return JSON.parse(log);
112
- } catch {
113
- return {};
114
- }
115
- }) || [];
116
- let filteredLogs = logs.filter((record) => record !== null && typeof record === "object");
117
- const {
118
- fromDate,
119
- toDate,
120
- logLevel,
121
- filters,
122
- returnPaginationResults: returnPaginationResultsInput,
123
- page: pageInput,
124
- perPage: perPageInput
125
- } = params || {};
126
- const page = pageInput === 0 ? 1 : pageInput ?? 1;
127
- const perPage = perPageInput ?? 100;
128
- const returnPaginationResults = returnPaginationResultsInput ?? true;
129
- if (filters) {
130
- filteredLogs = filteredLogs.filter(
131
- (log) => Object.entries(filters || {}).every(([key, value]) => log[key] === value)
132
- );
133
- }
134
- if (logLevel) {
135
- filteredLogs = filteredLogs.filter((log) => log.level === logLevel);
136
- }
137
- if (fromDate) {
138
- filteredLogs = filteredLogs.filter((log) => new Date(log.time)?.getTime() >= fromDate.getTime());
139
- }
140
- if (toDate) {
141
- filteredLogs = filteredLogs.filter((log) => new Date(log.time)?.getTime() <= toDate.getTime());
142
- }
143
- if (!returnPaginationResults) {
144
- return {
145
- logs: filteredLogs,
146
- total: filteredLogs.length,
147
- page,
148
- perPage: filteredLogs.length,
149
- hasMore: false
150
- };
151
- }
152
- const total = filteredLogs.length;
153
- const resolvedPerPage = perPage || 100;
154
- const start = (page - 1) * resolvedPerPage;
155
- const end = start + resolvedPerPage;
156
- const paginatedLogs = filteredLogs.slice(start, end);
157
- const hasMore = end < total;
158
- return {
159
- logs: paginatedLogs,
160
- total,
161
- page,
162
- perPage: resolvedPerPage,
163
- hasMore
164
- };
165
- } catch (error) {
166
- console.error("Error getting logs from Upstash:", error);
167
- return {
168
- logs: [],
169
- total: 0,
170
- page: params?.page ?? 1,
171
- perPage: params?.perPage ?? 100,
172
- hasMore: false
173
- };
174
- }
175
- }
176
- async listLogsByRunId({
177
- runId,
178
- fromDate,
179
- toDate,
180
- logLevel,
181
- filters,
182
- page: pageInput,
183
- perPage: perPageInput
184
- }) {
185
- try {
186
- const page = pageInput === 0 ? 1 : pageInput ?? 1;
187
- const perPage = perPageInput ?? 100;
188
- const allLogs = await this.listLogs({ fromDate, toDate, logLevel, filters, returnPaginationResults: false });
189
- const logs = allLogs?.logs?.filter((log) => log.runId === runId) || [];
190
- const total = logs.length;
191
- const resolvedPerPage = perPage || 100;
192
- const start = (page - 1) * resolvedPerPage;
193
- const end = start + resolvedPerPage;
194
- const paginatedLogs = logs.slice(start, end);
195
- const hasMore = end < total;
196
- return {
197
- logs: paginatedLogs,
198
- total,
199
- page,
200
- perPage: resolvedPerPage,
201
- hasMore
202
- };
203
- } catch (error) {
204
- console.error("Error getting logs by runId from Upstash:", error);
205
- return {
206
- logs: [],
207
- total: 0,
208
- page: pageInput ?? 1,
209
- perPage: perPageInput ?? 100,
210
- hasMore: false
211
- };
212
- }
213
- }
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let _mastra_core_logger = require("@mastra/core/logger");
3
+ //#region src/upstash/index.ts
4
+ var UpstashTransport = class extends _mastra_core_logger.LoggerTransport {
5
+ upstashUrl;
6
+ upstashToken;
7
+ listName;
8
+ maxListLength;
9
+ batchSize;
10
+ flushInterval;
11
+ logBuffer;
12
+ lastFlush;
13
+ flushIntervalId;
14
+ constructor(opts) {
15
+ super({ objectMode: true });
16
+ if (!opts.upstashUrl || !opts.upstashToken) throw new Error("Upstash URL and token are required");
17
+ this.upstashUrl = opts.upstashUrl;
18
+ this.upstashToken = opts.upstashToken;
19
+ this.listName = opts.listName || "application-logs";
20
+ this.maxListLength = opts.maxListLength || 1e4;
21
+ this.batchSize = opts.batchSize || 100;
22
+ this.flushInterval = opts.flushInterval || 1e4;
23
+ this.logBuffer = [];
24
+ this.lastFlush = Date.now();
25
+ this.flushIntervalId = setInterval(() => {
26
+ this._flush().catch((err) => {
27
+ console.error("Error flushing logs to Upstash:", err);
28
+ });
29
+ }, this.flushInterval);
30
+ }
31
+ async executeUpstashCommand(command) {
32
+ const response = await fetch(`${this.upstashUrl}/pipeline`, {
33
+ method: "POST",
34
+ headers: {
35
+ Authorization: `Bearer ${this.upstashToken}`,
36
+ "Content-Type": "application/json"
37
+ },
38
+ body: JSON.stringify([command])
39
+ });
40
+ if (!response.ok) throw new Error(`Failed to execute Upstash command: ${response.statusText}`);
41
+ return response.json();
42
+ }
43
+ async _flush() {
44
+ if (this.logBuffer.length === 0) return;
45
+ const now = Date.now();
46
+ const logs = this.logBuffer.splice(0, this.batchSize);
47
+ try {
48
+ const command = [
49
+ "LPUSH",
50
+ this.listName,
51
+ ...logs.map((log) => JSON.stringify(log))
52
+ ];
53
+ if (this.maxListLength > 0) command.push("LTRIM", this.listName, 0, this.maxListLength - 1);
54
+ await this.executeUpstashCommand(command);
55
+ this.lastFlush = now;
56
+ } catch (error) {
57
+ this.logBuffer.unshift(...logs);
58
+ throw error;
59
+ }
60
+ }
61
+ _write(chunk, encoding, callback) {
62
+ if (typeof callback === "function") {
63
+ this._transform(chunk, encoding || "utf8", callback);
64
+ return true;
65
+ }
66
+ this._transform(chunk, encoding || "utf8", (error) => {
67
+ if (error) console.error("Transform error in write:", error);
68
+ });
69
+ return true;
70
+ }
71
+ _transform(chunk, _enc, cb) {
72
+ try {
73
+ const log = typeof chunk === "string" ? JSON.parse(chunk) : chunk;
74
+ if (!log.time) log.time = Date.now();
75
+ this.logBuffer.push(log);
76
+ if (this.logBuffer.length >= this.batchSize) this._flush().catch((err) => {
77
+ console.error("Error flushing logs to Upstash:", err);
78
+ });
79
+ cb(null, chunk);
80
+ } catch (error) {
81
+ cb(error);
82
+ }
83
+ }
84
+ _destroy(err, cb) {
85
+ clearInterval(this.flushIntervalId);
86
+ if (this.logBuffer.length > 0) this._flush().then(() => cb(err)).catch((flushErr) => {
87
+ console.error("Error in final flush:", flushErr);
88
+ cb(err || flushErr);
89
+ });
90
+ else cb(err);
91
+ }
92
+ async listLogs(params) {
93
+ try {
94
+ const command = [
95
+ "LRANGE",
96
+ this.listName,
97
+ 0,
98
+ -1
99
+ ];
100
+ let filteredLogs = ((await this.executeUpstashCommand(command))?.[0]?.result?.map((log) => {
101
+ try {
102
+ return JSON.parse(log);
103
+ } catch {
104
+ return {};
105
+ }
106
+ }) || []).filter((record) => record !== null && typeof record === "object");
107
+ const { fromDate, toDate, logLevel, filters, returnPaginationResults: returnPaginationResultsInput, page: pageInput, perPage: perPageInput } = params || {};
108
+ const page = pageInput === 0 ? 1 : pageInput ?? 1;
109
+ const perPage = perPageInput ?? 100;
110
+ const returnPaginationResults = returnPaginationResultsInput ?? true;
111
+ if (filters) filteredLogs = filteredLogs.filter((log) => Object.entries(filters || {}).every(([key, value]) => log[key] === value));
112
+ if (logLevel) filteredLogs = filteredLogs.filter((log) => log.level === logLevel);
113
+ if (fromDate) filteredLogs = filteredLogs.filter((log) => new Date(log.time).getTime() >= fromDate.getTime());
114
+ if (toDate) filteredLogs = filteredLogs.filter((log) => new Date(log.time).getTime() <= toDate.getTime());
115
+ if (!returnPaginationResults) return {
116
+ logs: filteredLogs,
117
+ total: filteredLogs.length,
118
+ page,
119
+ perPage: filteredLogs.length,
120
+ hasMore: false
121
+ };
122
+ const total = filteredLogs.length;
123
+ const resolvedPerPage = perPage || 100;
124
+ const start = (page - 1) * resolvedPerPage;
125
+ const end = start + resolvedPerPage;
126
+ return {
127
+ logs: filteredLogs.slice(start, end),
128
+ total,
129
+ page,
130
+ perPage: resolvedPerPage,
131
+ hasMore: end < total
132
+ };
133
+ } catch (error) {
134
+ console.error("Error getting logs from Upstash:", error);
135
+ return {
136
+ logs: [],
137
+ total: 0,
138
+ page: params?.page ?? 1,
139
+ perPage: params?.perPage ?? 100,
140
+ hasMore: false
141
+ };
142
+ }
143
+ }
144
+ async listLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page: pageInput, perPage: perPageInput }) {
145
+ try {
146
+ const page = pageInput === 0 ? 1 : pageInput ?? 1;
147
+ const perPage = perPageInput ?? 100;
148
+ const logs = (await this.listLogs({
149
+ fromDate,
150
+ toDate,
151
+ logLevel,
152
+ filters,
153
+ returnPaginationResults: false
154
+ }))?.logs?.filter((log) => log.runId === runId) || [];
155
+ const total = logs.length;
156
+ const resolvedPerPage = perPage || 100;
157
+ const start = (page - 1) * resolvedPerPage;
158
+ const end = start + resolvedPerPage;
159
+ return {
160
+ logs: logs.slice(start, end),
161
+ total,
162
+ page,
163
+ perPage: resolvedPerPage,
164
+ hasMore: end < total
165
+ };
166
+ } catch (error) {
167
+ console.error("Error getting logs by runId from Upstash:", error);
168
+ return {
169
+ logs: [],
170
+ total: 0,
171
+ page: pageInput ?? 1,
172
+ perPage: perPageInput ?? 100,
173
+ hasMore: false
174
+ };
175
+ }
176
+ }
214
177
  };
215
-
178
+ //#endregion
216
179
  exports.UpstashTransport = UpstashTransport;
217
- //# sourceMappingURL=index.cjs.map
180
+
218
181
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/upstash/index.ts"],"names":["LoggerTransport"],"mappings":";;;;;AAGO,IAAM,gBAAA,GAAN,cAA+BA,sBAAA,CAAgB;AAAA,EACpD,UAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EAEA,YAAY,IAAA,EAOT;AACD,IAAA,KAAA,CAAM,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AAE1B,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,KAAK,YAAA,EAAc;AAC1C,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD;AAEA,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AACvB,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AACzB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,IAAY,kBAAA;AACjC,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,aAAA,IAAiB,GAAA;AAC3C,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AACnC,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,aAAA,IAAiB,GAAA;AAE3C,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAG1B,IAAA,IAAA,CAAK,eAAA,GAAkB,YAAY,MAAM;AACvC,MAAA,IAAA,CAAK,MAAA,EAAO,CAAE,KAAA,CAAM,CAAA,GAAA,KAAO;AACzB,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,GAAG,CAAA;AAAA,MACtD,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,KAAK,aAAa,CAAA;AAAA,EACvB;AAAA,EAEA,MAAc,sBAAsB,OAAA,EAA8B;AAChE,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,SAAA,CAAA,EAAa;AAAA,MAC1D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,YAAY,CAAA,CAAA;AAAA,QAC1C,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,CAAC,OAAO,CAAC;AAAA,KAC/B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAC7E;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA,EAEA,MAAM,MAAA,GAAS;AACb,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,CAAA,EAAG,KAAK,SAAS,CAAA;AAEpD,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,GAAU,CAAC,OAAA,EAAS,IAAA,CAAK,QAAA,EAAU,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAC,CAAA;AAGhF,MAAA,IAAI,IAAA,CAAK,gBAAgB,CAAA,EAAG;AAC1B,QAAA,OAAA,CAAQ,KAAK,OAAA,EAAS,IAAA,CAAK,UAAU,CAAA,EAAW,IAAA,CAAK,gBAAgB,CAAS,CAAA;AAAA,MAChF;AAGA,MAAA,MAAM,IAAA,CAAK,sBAAsB,OAAO,CAAA;AACxC,MAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AAEd,MAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,GAAG,IAAI,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAA,CAAO,KAAA,EAAY,QAAA,EAAmB,QAAA,EAAoD;AACxF,IAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,MAAA,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,QAAA,IAAY,MAAA,EAAQ,QAAQ,CAAA;AACnD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,QAAA,IAAY,MAAA,EAAQ,CAAC,KAAA,KAAwB;AAClE,MAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,2BAAA,EAA6B,KAAK,CAAA;AAAA,IAC7D,CAAC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,KAAA,EAAe,IAAA,EAAc,EAAA,EAAc;AACpD,IAAA,IAAI;AAEF,MAAA,MAAM,MAAM,OAAO,KAAA,KAAU,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,GAAI,KAAA;AAG5D,MAAA,IAAI,CAAC,IAAI,IAAA,EAAM;AACb,QAAA,GAAA,CAAI,IAAA,GAAO,KAAK,GAAA,EAAI;AAAA,MACtB;AAGA,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,GAAG,CAAA;AAGvB,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,IAAU,IAAA,CAAK,SAAA,EAAW;AAC3C,QAAA,IAAA,CAAK,MAAA,EAAO,CAAE,KAAA,CAAM,CAAA,GAAA,KAAO;AACzB,UAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,GAAG,CAAA;AAAA,QACtD,CAAC,CAAA;AAAA,MACH;AAGA,MAAA,EAAA,CAAG,MAAM,KAAK,CAAA;AAAA,IAChB,SAAS,KAAA,EAAO;AACd,MAAA,EAAA,CAAG,KAAK,CAAA;AAAA,IACV;AAAA,EACF;AAAA,EAEA,QAAA,CAAS,KAAY,EAAA,EAAc;AACjC,IAAA,aAAA,CAAc,KAAK,eAAe,CAAA;AAGlC,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,MAAA,GACF,IAAA,CAAK,MAAM,GAAG,GAAG,CAAC,CAAA,CAClB,KAAA,CAAM,CAAA,QAAA,KAAY;AACjB,QAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,QAAQ,CAAA;AAC/C,QAAA,EAAA,CAAG,OAAO,QAAQ,CAAA;AAAA,MACpB,CAAC,CAAA;AAAA,IACL,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,GAAG,CAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,MAAA,EAcZ;AACD,IAAA,IAAI;AAEF,MAAA,MAAM,UAAU,CAAC,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,GAAG,EAAE,CAAA;AAC/C,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,CAAsB,OAAO,CAAA;AAEzD,MAAA,MAAM,OACH,QAAA,GAAW,CAAC,GAAG,MAAA,EAAQ,GAAA,CAAI,CAAC,GAAA,KAAgB;AAC3C,QAAA,IAAI;AAEF,UAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,QACvB,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF,CAAC,KAA0B,EAAC;AAE9B,MAAA,IAAI,YAAA,GAAe,KAAK,MAAA,CAAO,CAAA,MAAA,KAAU,WAAW,IAAA,IAAQ,OAAO,WAAW,QAAQ,CAAA;AAEtF,MAAA,MAAM;AAAA,QACJ,QAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,uBAAA,EAAyB,4BAAA;AAAA,QACzB,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX,GAAI,UAAU,EAAC;AAEf,MAAA,MAAM,IAAA,GAAO,SAAA,KAAc,CAAA,GAAI,CAAA,GAAK,SAAA,IAAa,CAAA;AACjD,MAAA,MAAM,UAAU,YAAA,IAAgB,GAAA;AAChC,MAAA,MAAM,0BAA0B,4BAAA,IAAgC,IAAA;AAEhE,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,YAAA,GAAe,YAAA,CAAa,MAAA;AAAA,UAAO,SACjC,MAAA,CAAO,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,KAAK,KAAK,CAAA,KAAM,GAAA,CAAI,GAA2B,MAAM,KAAK;AAAA,SAClG;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,YAAA,GAAe,YAAA,CAAa,MAAA,CAAO,CAAA,GAAA,KAAO,GAAA,CAAI,UAAU,QAAQ,CAAA;AAAA,MAClE;AAEA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,YAAA,GAAe,YAAA,CAAa,MAAA,CAAO,CAAA,GAAA,KAAO,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,OAAA,EAAQ,IAAK,QAAA,CAAU,OAAA,EAAS,CAAA;AAAA,MAChG;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,YAAA,GAAe,YAAA,CAAa,MAAA,CAAO,CAAA,GAAA,KAAO,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,OAAA,EAAQ,IAAK,MAAA,CAAQ,OAAA,EAAS,CAAA;AAAA,MAC9F;AAEA,MAAA,IAAI,CAAC,uBAAA,EAAyB;AAC5B,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,YAAA;AAAA,UACN,OAAO,YAAA,CAAa,MAAA;AAAA,UACpB,IAAA;AAAA,UACA,SAAS,YAAA,CAAa,MAAA;AAAA,UACtB,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,MAAM,QAAQ,YAAA,CAAa,MAAA;AAC3B,MAAA,MAAM,kBAAkB,OAAA,IAAW,GAAA;AACnC,MAAA,MAAM,KAAA,GAAA,CAAS,OAAO,CAAA,IAAK,eAAA;AAC3B,MAAA,MAAM,MAAM,KAAA,GAAQ,eAAA;AACpB,MAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AACnD,MAAA,MAAM,UAAU,GAAA,GAAM,KAAA;AAEtB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,aAAA;AAAA,QACN,KAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA,EAAS,eAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,MAAA,OAAO;AAAA,QACL,MAAM,EAAC;AAAA,QACP,KAAA,EAAO,CAAA;AAAA,QACP,IAAA,EAAM,QAAQ,IAAA,IAAQ,CAAA;AAAA,QACtB,OAAA,EAAS,QAAQ,OAAA,IAAW,GAAA;AAAA,QAC5B,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,CAAgB;AAAA,IACpB,KAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA,EAAM,SAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX,EAcG;AACD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,SAAA,KAAc,CAAA,GAAI,CAAA,GAAK,SAAA,IAAa,CAAA;AACjD,MAAA,MAAM,UAAU,YAAA,IAAgB,GAAA;AAChC,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,uBAAA,EAAyB,KAAA,EAAO,CAAA;AAC3G,MAAA,MAAM,IAAA,GAAQ,OAAA,EAAS,IAAA,EAAM,MAAA,CAAO,CAAC,QAAa,GAAA,CAAI,KAAA,KAAU,KAAK,CAAA,IAAK,EAAC;AAC3E,MAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,MAAA,MAAM,kBAAkB,OAAA,IAAW,GAAA;AACnC,MAAA,MAAM,KAAA,GAAA,CAAS,OAAO,CAAA,IAAK,eAAA;AAC3B,MAAA,MAAM,MAAM,KAAA,GAAQ,eAAA;AACpB,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAC3C,MAAA,MAAM,UAAU,GAAA,GAAM,KAAA;AAEtB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,aAAA;AAAA,QACN,KAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA,EAAS,eAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAChE,MAAA,OAAO;AAAA,QACL,MAAM,EAAC;AAAA,QACP,KAAA,EAAO,CAAA;AAAA,QACP,MAAM,SAAA,IAAa,CAAA;AAAA,QACnB,SAAS,YAAA,IAAgB,GAAA;AAAA,QACzB,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAAA,EACF;AACF","file":"index.cjs","sourcesContent":["import { LoggerTransport } from '@mastra/core/logger';\nimport type { BaseLogMessage, LogLevel } from '@mastra/core/logger';\n\nexport class UpstashTransport extends LoggerTransport {\n upstashUrl: string;\n upstashToken: string;\n listName: string;\n maxListLength: number;\n batchSize: number;\n flushInterval: number;\n logBuffer: any[];\n lastFlush: number;\n flushIntervalId: NodeJS.Timeout;\n\n constructor(opts: {\n listName?: string;\n maxListLength?: number;\n batchSize?: number;\n upstashUrl: string;\n flushInterval?: number;\n upstashToken: string;\n }) {\n super({ objectMode: true });\n\n if (!opts.upstashUrl || !opts.upstashToken) {\n throw new Error('Upstash URL and token are required');\n }\n\n this.upstashUrl = opts.upstashUrl;\n this.upstashToken = opts.upstashToken;\n this.listName = opts.listName || 'application-logs';\n this.maxListLength = opts.maxListLength || 10000;\n this.batchSize = opts.batchSize || 100;\n this.flushInterval = opts.flushInterval || 10000;\n\n this.logBuffer = [];\n this.lastFlush = Date.now();\n\n // Start flush interval\n this.flushIntervalId = setInterval(() => {\n this._flush().catch(err => {\n console.error('Error flushing logs to Upstash:', err);\n });\n }, this.flushInterval);\n }\n\n private async executeUpstashCommand(command: any[]): Promise<any> {\n const response = await fetch(`${this.upstashUrl}/pipeline`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.upstashToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify([command]),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to execute Upstash command: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async _flush() {\n if (this.logBuffer.length === 0) {\n return;\n }\n\n const now = Date.now();\n const logs = this.logBuffer.splice(0, this.batchSize);\n\n try {\n // Prepare the Upstash Redis command\n const command = ['LPUSH', this.listName, ...logs.map(log => JSON.stringify(log))];\n\n // Trim the list if it exceeds maxListLength\n if (this.maxListLength > 0) {\n command.push('LTRIM', this.listName, 0 as any, (this.maxListLength - 1) as any);\n }\n\n // Send logs to Upstash Redis\n await this.executeUpstashCommand(command);\n this.lastFlush = now;\n } catch (error) {\n // On error, put logs back in the buffer\n this.logBuffer.unshift(...logs);\n throw error;\n }\n }\n\n _write(chunk: any, encoding?: string, callback?: (error?: Error | null) => void): boolean {\n if (typeof callback === 'function') {\n this._transform(chunk, encoding || 'utf8', callback);\n return true;\n }\n\n this._transform(chunk, encoding || 'utf8', (error: Error | null) => {\n if (error) console.error('Transform error in write:', error);\n });\n return true;\n }\n\n _transform(chunk: string, _enc: string, cb: Function) {\n try {\n // Parse the log line if it's a string\n const log = typeof chunk === 'string' ? JSON.parse(chunk) : chunk;\n\n // Add timestamp if not present\n if (!log.time) {\n log.time = Date.now();\n }\n\n // Add to buffer\n this.logBuffer.push(log);\n\n // Flush if buffer reaches batch size\n if (this.logBuffer.length >= this.batchSize) {\n this._flush().catch(err => {\n console.error('Error flushing logs to Upstash:', err);\n });\n }\n\n // Pass through the log\n cb(null, chunk);\n } catch (error) {\n cb(error);\n }\n }\n\n _destroy(err: Error, cb: Function) {\n clearInterval(this.flushIntervalId);\n\n // Final flush\n if (this.logBuffer.length > 0) {\n this._flush()\n .then(() => cb(err))\n .catch(flushErr => {\n console.error('Error in final flush:', flushErr);\n cb(err || flushErr);\n });\n } else {\n cb(err);\n }\n }\n\n async listLogs(params?: {\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n returnPaginationResults?: boolean; // default true\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n try {\n // Get all logs from the list\n const command = ['LRANGE', this.listName, 0, -1];\n const response = await this.executeUpstashCommand(command);\n\n const logs =\n (response?.[0]?.result?.map((log: string) => {\n try {\n // Parse the logs from JSON strings back to objects\n return JSON.parse(log);\n } catch {\n return {};\n }\n }) as BaseLogMessage[]) || [];\n\n let filteredLogs = logs.filter(record => record !== null && typeof record === 'object');\n\n const {\n fromDate,\n toDate,\n logLevel,\n filters,\n returnPaginationResults: returnPaginationResultsInput,\n page: pageInput,\n perPage: perPageInput,\n } = params || {};\n\n const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = perPageInput ?? 100;\n const returnPaginationResults = returnPaginationResultsInput ?? true;\n\n if (filters) {\n filteredLogs = filteredLogs.filter(log =>\n Object.entries(filters || {}).every(([key, value]) => log[key as keyof BaseLogMessage] === value),\n );\n }\n\n if (logLevel) {\n filteredLogs = filteredLogs.filter(log => log.level === logLevel);\n }\n\n if (fromDate) {\n filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() >= fromDate!.getTime());\n }\n\n if (toDate) {\n filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() <= toDate!.getTime());\n }\n\n if (!returnPaginationResults) {\n return {\n logs: filteredLogs,\n total: filteredLogs.length,\n page,\n perPage: filteredLogs.length,\n hasMore: false,\n };\n }\n\n const total = filteredLogs.length;\n const resolvedPerPage = perPage || 100;\n const start = (page - 1) * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedLogs = filteredLogs.slice(start, end);\n const hasMore = end < total;\n\n return {\n logs: paginatedLogs,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n console.error('Error getting logs from Upstash:', error);\n return {\n logs: [],\n total: 0,\n page: params?.page ?? 1,\n perPage: params?.perPage ?? 100,\n hasMore: false,\n };\n }\n }\n\n async listLogsByRunId({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\n page: pageInput,\n perPage: perPageInput,\n }: {\n runId: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n try {\n const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = perPageInput ?? 100;\n const allLogs = await this.listLogs({ fromDate, toDate, logLevel, filters, returnPaginationResults: false });\n const logs = (allLogs?.logs?.filter((log: any) => log.runId === runId) || []) as BaseLogMessage[];\n const total = logs.length;\n const resolvedPerPage = perPage || 100;\n const start = (page - 1) * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedLogs = logs.slice(start, end);\n const hasMore = end < total;\n\n return {\n logs: paginatedLogs,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n console.error('Error getting logs by runId from Upstash:', error);\n return {\n logs: [],\n total: 0,\n page: pageInput ?? 1,\n perPage: perPageInput ?? 100,\n hasMore: false,\n };\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.cjs","names":["LoggerTransport"],"sources":["../../src/upstash/index.ts"],"sourcesContent":["import { LoggerTransport } from '@mastra/core/logger';\nimport type { BaseLogMessage, LogLevel } from '@mastra/core/logger';\n\nexport class UpstashTransport extends LoggerTransport {\n upstashUrl: string;\n upstashToken: string;\n listName: string;\n maxListLength: number;\n batchSize: number;\n flushInterval: number;\n logBuffer: any[];\n lastFlush: number;\n flushIntervalId: NodeJS.Timeout;\n\n constructor(opts: {\n listName?: string;\n maxListLength?: number;\n batchSize?: number;\n upstashUrl: string;\n flushInterval?: number;\n upstashToken: string;\n }) {\n super({ objectMode: true });\n\n if (!opts.upstashUrl || !opts.upstashToken) {\n throw new Error('Upstash URL and token are required');\n }\n\n this.upstashUrl = opts.upstashUrl;\n this.upstashToken = opts.upstashToken;\n this.listName = opts.listName || 'application-logs';\n this.maxListLength = opts.maxListLength || 10000;\n this.batchSize = opts.batchSize || 100;\n this.flushInterval = opts.flushInterval || 10000;\n\n this.logBuffer = [];\n this.lastFlush = Date.now();\n\n // Start flush interval\n this.flushIntervalId = setInterval(() => {\n this._flush().catch(err => {\n console.error('Error flushing logs to Upstash:', err);\n });\n }, this.flushInterval);\n }\n\n private async executeUpstashCommand(command: any[]): Promise<any> {\n const response = await fetch(`${this.upstashUrl}/pipeline`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.upstashToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify([command]),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to execute Upstash command: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n async _flush() {\n if (this.logBuffer.length === 0) {\n return;\n }\n\n const now = Date.now();\n const logs = this.logBuffer.splice(0, this.batchSize);\n\n try {\n // Prepare the Upstash Redis command\n const command = ['LPUSH', this.listName, ...logs.map(log => JSON.stringify(log))];\n\n // Trim the list if it exceeds maxListLength\n if (this.maxListLength > 0) {\n command.push('LTRIM', this.listName, 0 as any, (this.maxListLength - 1) as any);\n }\n\n // Send logs to Upstash Redis\n await this.executeUpstashCommand(command);\n this.lastFlush = now;\n } catch (error) {\n // On error, put logs back in the buffer\n this.logBuffer.unshift(...logs);\n throw error;\n }\n }\n\n _write(chunk: any, encoding?: string, callback?: (error?: Error | null) => void): boolean {\n if (typeof callback === 'function') {\n this._transform(chunk, encoding || 'utf8', callback);\n return true;\n }\n\n this._transform(chunk, encoding || 'utf8', (error: Error | null) => {\n if (error) console.error('Transform error in write:', error);\n });\n return true;\n }\n\n _transform(chunk: string, _enc: string, cb: Function) {\n try {\n // Parse the log line if it's a string\n const log = typeof chunk === 'string' ? JSON.parse(chunk) : chunk;\n\n // Add timestamp if not present\n if (!log.time) {\n log.time = Date.now();\n }\n\n // Add to buffer\n this.logBuffer.push(log);\n\n // Flush if buffer reaches batch size\n if (this.logBuffer.length >= this.batchSize) {\n this._flush().catch(err => {\n console.error('Error flushing logs to Upstash:', err);\n });\n }\n\n // Pass through the log\n cb(null, chunk);\n } catch (error) {\n cb(error);\n }\n }\n\n _destroy(err: Error, cb: Function) {\n clearInterval(this.flushIntervalId);\n\n // Final flush\n if (this.logBuffer.length > 0) {\n this._flush()\n .then(() => cb(err))\n .catch(flushErr => {\n console.error('Error in final flush:', flushErr);\n cb(err || flushErr);\n });\n } else {\n cb(err);\n }\n }\n\n async listLogs(params?: {\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n returnPaginationResults?: boolean; // default true\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n try {\n // Get all logs from the list\n const command = ['LRANGE', this.listName, 0, -1];\n const response = await this.executeUpstashCommand(command);\n\n const logs =\n (response?.[0]?.result?.map((log: string) => {\n try {\n // Parse the logs from JSON strings back to objects\n return JSON.parse(log);\n } catch {\n return {};\n }\n }) as BaseLogMessage[]) || [];\n\n let filteredLogs = logs.filter(record => record !== null && typeof record === 'object');\n\n const {\n fromDate,\n toDate,\n logLevel,\n filters,\n returnPaginationResults: returnPaginationResultsInput,\n page: pageInput,\n perPage: perPageInput,\n } = params || {};\n\n const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = perPageInput ?? 100;\n const returnPaginationResults = returnPaginationResultsInput ?? true;\n\n if (filters) {\n filteredLogs = filteredLogs.filter(log =>\n Object.entries(filters || {}).every(([key, value]) => log[key as keyof BaseLogMessage] === value),\n );\n }\n\n if (logLevel) {\n filteredLogs = filteredLogs.filter(log => log.level === logLevel);\n }\n\n if (fromDate) {\n filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() >= fromDate!.getTime());\n }\n\n if (toDate) {\n filteredLogs = filteredLogs.filter(log => new Date(log.time)?.getTime() <= toDate!.getTime());\n }\n\n if (!returnPaginationResults) {\n return {\n logs: filteredLogs,\n total: filteredLogs.length,\n page,\n perPage: filteredLogs.length,\n hasMore: false,\n };\n }\n\n const total = filteredLogs.length;\n const resolvedPerPage = perPage || 100;\n const start = (page - 1) * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedLogs = filteredLogs.slice(start, end);\n const hasMore = end < total;\n\n return {\n logs: paginatedLogs,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n console.error('Error getting logs from Upstash:', error);\n return {\n logs: [],\n total: 0,\n page: params?.page ?? 1,\n perPage: params?.perPage ?? 100,\n hasMore: false,\n };\n }\n }\n\n async listLogsByRunId({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\n page: pageInput,\n perPage: perPageInput,\n }: {\n runId: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n try {\n const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = perPageInput ?? 100;\n const allLogs = await this.listLogs({ fromDate, toDate, logLevel, filters, returnPaginationResults: false });\n const logs = (allLogs?.logs?.filter((log: any) => log.runId === runId) || []) as BaseLogMessage[];\n const total = logs.length;\n const resolvedPerPage = perPage || 100;\n const start = (page - 1) * resolvedPerPage;\n const end = start + resolvedPerPage;\n const paginatedLogs = logs.slice(start, end);\n const hasMore = end < total;\n\n return {\n logs: paginatedLogs,\n total,\n page,\n perPage: resolvedPerPage,\n hasMore,\n };\n } catch (error) {\n console.error('Error getting logs by runId from Upstash:', error);\n return {\n logs: [],\n total: 0,\n page: pageInput ?? 1,\n perPage: perPageInput ?? 100,\n hasMore: false,\n };\n }\n }\n}\n"],"mappings":"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"}