@vampgg/utils 1.0.0-beta.2 → 1.0.0-beta.3
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.
- package/README.md +20 -1
- package/dist/channel-core.d.mts +139 -0
- package/dist/channel-core.mjs +411 -0
- package/dist/extension-channel.d.mts +14 -70
- package/dist/extension-channel.mjs +17 -327
- package/dist/extension-router.d.mts +5 -7
- package/dist/extension-router.mjs +35 -202
- package/dist/router-core.d.mts +121 -0
- package/dist/router-core.mjs +282 -0
- package/dist/worker-channel.d.mts +14 -70
- package/dist/worker-channel.mjs +18 -335
- package/dist/worker-router.d.mts +1 -7
- package/dist/worker-router.mjs +40 -216
- package/dist/ws-channel.d.mts +17 -48
- package/dist/ws-channel.mjs +24 -335
- package/dist/ws-router.d.mts +1 -6
- package/dist/ws-router.mjs +46 -204
- package/package.json +3 -9
- package/dist/debug-logger.d.mts +0 -43
- package/dist/debug-logger.mjs +0 -122
- package/dist/error.d.mts +0 -27
- package/dist/error.mjs +0 -49
- package/dist/memory-storage.d.mts +0 -12
- package/dist/memory-storage.mjs +0 -18
- package/dist/sync-storage.d.mts +0 -11
- package/dist/sync-storage.mjs +0 -18
package/dist/ws-router.mjs
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { Message } from "./bebop.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { BaseRouter, ServerContext, TempoRouterConfiguration } from "@tempojs/server";
|
|
2
|
+
import { RouterCore } from "./router-core.mjs";
|
|
3
|
+
import { Metadata, TempoError, TempoStatusCode } from "@tempojs/common";
|
|
4
|
+
import { BaseRouter, TempoRouterConfiguration } from "@tempojs/server";
|
|
6
5
|
//#region src/ws-router.ts
|
|
7
6
|
/**
|
|
8
7
|
* Client-metadata keys under which {@link TempoWsRouter.process} exposes the
|
|
@@ -30,66 +29,23 @@ function encodeServerStreamFrame(opts) {
|
|
|
30
29
|
})));
|
|
31
30
|
}
|
|
32
31
|
var TempoWsRouter = class extends BaseRouter {
|
|
33
|
-
|
|
34
|
-
clientStreams = /* @__PURE__ */ new Map();
|
|
32
|
+
core;
|
|
35
33
|
serverStreams = /* @__PURE__ */ new Map();
|
|
36
34
|
_streamEncodeCache = /* @__PURE__ */ new WeakMap();
|
|
37
35
|
constructor(logger, registry, configuration = new TempoRouterConfiguration(), authInterceptor) {
|
|
38
36
|
super(logger, registry, configuration, authInterceptor);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
await this.setAuthContext(request, context);
|
|
49
|
-
if (this.hooks !== void 0) await this.hooks.executeRequestHooks(context);
|
|
50
|
-
const requestData = request.data;
|
|
51
|
-
const record = this.deserializeRequest(requestData, method, contentType);
|
|
52
|
-
if (this.hooks !== void 0) await this.hooks.executeDecodeHooks(context, record);
|
|
53
|
-
return await method.invoke(record, context);
|
|
54
|
-
}
|
|
55
|
-
async invokeClientStreamMethod(request, context, method, contentType) {
|
|
56
|
-
await this.setAuthContext(request, context);
|
|
57
|
-
if (this.hooks !== void 0) await this.hooks.executeRequestHooks(context);
|
|
58
|
-
const messageId = request.messageId;
|
|
59
|
-
const stream = this.clientStreams.get(messageId);
|
|
60
|
-
if (stream) {
|
|
61
|
-
this.events.emit(messageId, request);
|
|
62
|
-
return await stream;
|
|
63
|
-
}
|
|
64
|
-
const generator = () => {
|
|
65
|
-
return createEventIterator(({ emit, cancel }) => {
|
|
66
|
-
const eventHandler = async (message) => {
|
|
67
|
-
if (this.hooks !== void 0) await this.hooks.executeRequestHooks(context);
|
|
68
|
-
if (message.status === TempoStatusCode.CANCELLED) {
|
|
69
|
-
cancel();
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
const requestData = message.data;
|
|
73
|
-
const record = this.deserializeRequest(requestData, method, contentType);
|
|
74
|
-
if (this.hooks !== void 0) await this.hooks.executeDecodeHooks(context, record);
|
|
75
|
-
emit(record);
|
|
76
|
-
};
|
|
77
|
-
this.events.on(messageId, eventHandler);
|
|
78
|
-
return () => {
|
|
79
|
-
this.events.off(messageId, eventHandler);
|
|
80
|
-
this.clientStreams.delete(messageId);
|
|
81
|
-
};
|
|
82
|
-
});
|
|
83
|
-
};
|
|
84
|
-
const invocation = method.invoke(generator, context);
|
|
85
|
-
this.clientStreams.set(messageId, invocation);
|
|
86
|
-
this.events.emit(messageId, request);
|
|
87
|
-
return await invocation.finally(() => {
|
|
88
|
-
this.clientStreams.delete(messageId);
|
|
37
|
+
this.core = new RouterCore({
|
|
38
|
+
logger,
|
|
39
|
+
maxRetryAttempts: this.maxRetryAttempts,
|
|
40
|
+
transmitInternalErrors: this.transmitInternalErrors,
|
|
41
|
+
authInterceptor,
|
|
42
|
+
getMethod: (methodId) => this.registry.getMethod(methodId),
|
|
43
|
+
getHooks: () => this.hooks,
|
|
44
|
+
deserializeRequest: (data, method, contentType) => this.deserializeRequest(data, method, contentType),
|
|
45
|
+
serializeResponse: (record, method, contentType) => this.serializeResponse(record, method, contentType)
|
|
89
46
|
});
|
|
90
47
|
}
|
|
91
|
-
async invokeServerStreamMethod(request, context, method
|
|
92
|
-
await this.setAuthContext(request, context);
|
|
48
|
+
async invokeServerStreamMethod(request, context, method) {
|
|
93
49
|
const messageId = request.messageId;
|
|
94
50
|
if (request.status === TempoStatusCode.CANCELLED) {
|
|
95
51
|
const existing = this.serverStreams.get(messageId);
|
|
@@ -101,174 +57,60 @@ var TempoWsRouter = class extends BaseRouter {
|
|
|
101
57
|
}
|
|
102
58
|
return (async function* () {})();
|
|
103
59
|
}
|
|
104
|
-
|
|
105
|
-
const requestData = request.data;
|
|
106
|
-
const record = this.deserializeRequest(requestData, method, contentType);
|
|
107
|
-
if (!TempoUtil.isAsyncGeneratorFunction(method.invoke.bind(method))) throw new TempoError(TempoStatusCode.INTERNAL, "service method incorrect: method must be async generator");
|
|
108
|
-
if (this.hooks !== void 0) await this.hooks.executeDecodeHooks(context, record);
|
|
109
|
-
const invocation = method.invoke(record, context);
|
|
60
|
+
const invocation = await this.core.invokeServerStreamMethod(request, context, method, "bebop");
|
|
110
61
|
this.serverStreams.set(messageId, invocation);
|
|
111
62
|
return invocation;
|
|
112
63
|
}
|
|
113
|
-
async invokeDuplexStreamMethod(request, context, method, contentType) {
|
|
114
|
-
await this.setAuthContext(request, context);
|
|
115
|
-
if (this.hooks !== void 0) await this.hooks.executeRequestHooks(context);
|
|
116
|
-
const messageId = request.messageId;
|
|
117
|
-
const stream = this.clientStreams.get(messageId);
|
|
118
|
-
if (stream) {
|
|
119
|
-
this.events.emit(messageId, request);
|
|
120
|
-
return stream;
|
|
121
|
-
}
|
|
122
|
-
if (!TempoUtil.isAsyncGeneratorFunction(method.invoke.bind(method))) throw new TempoError(TempoStatusCode.INTERNAL, "service method incorrect: method must be async generator");
|
|
123
|
-
const generator = () => {
|
|
124
|
-
return createEventIterator(({ emit, cancel }) => {
|
|
125
|
-
const eventHandler = async (message) => {
|
|
126
|
-
if (this.hooks !== void 0) await this.hooks.executeRequestHooks(context);
|
|
127
|
-
if (message.status === TempoStatusCode.CANCELLED) {
|
|
128
|
-
cancel();
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
const requestData = message.data;
|
|
132
|
-
const record = this.deserializeRequest(requestData, method, contentType);
|
|
133
|
-
if (this.hooks !== void 0) await this.hooks.executeDecodeHooks(context, record);
|
|
134
|
-
emit(record);
|
|
135
|
-
};
|
|
136
|
-
this.events.on(messageId, eventHandler);
|
|
137
|
-
this.events.emit(messageId, request);
|
|
138
|
-
return () => {
|
|
139
|
-
this.events.off(messageId, eventHandler);
|
|
140
|
-
this.clientStreams.delete(messageId);
|
|
141
|
-
};
|
|
142
|
-
});
|
|
143
|
-
};
|
|
144
|
-
const invocation = method.invoke(generator, context);
|
|
145
|
-
this.clientStreams.set(messageId, invocation);
|
|
146
|
-
return invocation;
|
|
147
|
-
}
|
|
148
64
|
/**
|
|
149
65
|
* Tear down all open streams for this connection (driven by the DO socket
|
|
150
66
|
* close/error lifecycle). Emits a synthetic CANCELLED to each in-flight
|
|
151
67
|
* client/duplex stream so its generator ends, then clears all listeners.
|
|
152
68
|
*/
|
|
153
69
|
async closeConnection() {
|
|
154
|
-
|
|
155
|
-
this.events.emit(id, Message({
|
|
156
|
-
messageId: id,
|
|
157
|
-
status: TempoStatusCode.CANCELLED,
|
|
158
|
-
data: new Uint8Array()
|
|
159
|
-
}));
|
|
160
|
-
this.clientStreams.delete(id);
|
|
161
|
-
}
|
|
70
|
+
this.core.cancelClientStreams();
|
|
162
71
|
for (const [id, gen] of [...this.serverStreams]) {
|
|
163
72
|
this.serverStreams.delete(id);
|
|
164
73
|
try {
|
|
165
74
|
await gen.return(void 0);
|
|
166
75
|
} catch {}
|
|
167
76
|
}
|
|
168
|
-
this.
|
|
77
|
+
this.core.removeAllListeners();
|
|
169
78
|
}
|
|
170
79
|
async process(req, response, env) {
|
|
171
80
|
if (req.byteLength > this.maxReceiveMessageSize) {
|
|
172
81
|
this.logger.error(`inbound frame ${req.byteLength}B exceeds maxReceiveMessageSize ${this.maxReceiveMessageSize}B; dropping`);
|
|
173
82
|
return;
|
|
174
83
|
}
|
|
175
|
-
|
|
84
|
+
const request = Message.decode(new Uint8Array(req));
|
|
176
85
|
const [, ws] = env;
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
break;
|
|
206
|
-
case MethodType.ClientStream:
|
|
207
|
-
record = await this.invokeClientStreamMethod(request, context, method, "bebop");
|
|
208
|
-
break;
|
|
209
|
-
case MethodType.ServerStream:
|
|
210
|
-
recordGenerator = await this.invokeServerStreamMethod(request, context, method, "bebop");
|
|
211
|
-
break;
|
|
212
|
-
case MethodType.DuplexStream:
|
|
213
|
-
recordGenerator = await this.invokeDuplexStreamMethod(request, context, method, "bebop");
|
|
214
|
-
break;
|
|
215
|
-
default: throw new TempoError(TempoStatusCode.INTERNAL, "service method incorrect: unknown method type");
|
|
216
|
-
}
|
|
217
|
-
const outgoingCredential = context.outgoingCredential;
|
|
218
|
-
if (outgoingCredential) response.credential = stringifyCredential(outgoingCredential);
|
|
219
|
-
response.methodId = request.methodId;
|
|
220
|
-
response.messageId = request.messageId;
|
|
221
|
-
response.status = TempoStatusCode.OK;
|
|
222
|
-
response.timestamp = /* @__PURE__ */ new Date();
|
|
223
|
-
if (this.hooks !== void 0) await this.hooks.executeResponseHooks(context);
|
|
224
|
-
outgoingMetadata.freeze();
|
|
225
|
-
if (outgoingMetadata.size() > 0) response.customMetadata = outgoingMetadata.data;
|
|
226
|
-
if (recordGenerator !== void 0) {
|
|
227
|
-
const writeFrames = async () => {
|
|
228
|
-
for await (const value of recordGenerator) {
|
|
229
|
-
let payload = this._streamEncodeCache.get(value);
|
|
230
|
-
if (payload === void 0) {
|
|
231
|
-
payload = new Uint8Array(this.serializeResponse(value, method, "bebop"));
|
|
232
|
-
this._streamEncodeCache.set(value, payload);
|
|
233
|
-
}
|
|
234
|
-
response.data = payload;
|
|
235
|
-
ws.send(new Uint8Array(Message.encode(response)));
|
|
236
|
-
}
|
|
237
|
-
this.serverStreams.delete(request.messageId);
|
|
238
|
-
response.data = new Uint8Array();
|
|
239
|
-
response.status = TempoStatusCode.CANCELLED;
|
|
240
|
-
ws.send(new Uint8Array(Message.encode(response)));
|
|
241
|
-
};
|
|
242
|
-
if (deadline) await deadline.executeWithinDeadline(writeFrames);
|
|
243
|
-
else await writeFrames();
|
|
244
|
-
} else {
|
|
245
|
-
if (record === void 0) throw new TempoError(TempoStatusCode.INTERNAL, "service method did not return a record");
|
|
246
|
-
const responseData = this.serializeResponse(record, method, "bebop");
|
|
247
|
-
response.data = new Uint8Array(responseData);
|
|
248
|
-
ws.send(new Uint8Array(Message.encode(response)));
|
|
249
|
-
}
|
|
250
|
-
};
|
|
251
|
-
if (deadline !== void 0) await deadline.executeWithinDeadline(handleRequest);
|
|
252
|
-
else await handleRequest();
|
|
253
|
-
} catch (e) {
|
|
254
|
-
let status = TempoStatusCode.UNKNOWN;
|
|
255
|
-
let message = "unknown error";
|
|
256
|
-
if (e instanceof TempoError) {
|
|
257
|
-
status = e.status;
|
|
258
|
-
message = e.message;
|
|
259
|
-
if (e.status === TempoStatusCode.INTERNAL && this.transmitInternalErrors !== true) message = "internal error";
|
|
260
|
-
if (e.status === TempoStatusCode.INTERNAL) this.logger.critical(e.message, void 0, e);
|
|
261
|
-
else this.logger.error(message, void 0, e);
|
|
262
|
-
} else if (e instanceof Error) {
|
|
263
|
-
message = e.message;
|
|
264
|
-
this.logger.error(message, void 0, e);
|
|
265
|
-
}
|
|
266
|
-
if (e instanceof Error && this.hooks !== void 0) await this.hooks.executeErrorHooks(void 0, e);
|
|
267
|
-
this.clientStreams.delete(request.messageId);
|
|
268
|
-
response.status = status;
|
|
269
|
-
response.msg = message;
|
|
270
|
-
ws.send(new Uint8Array(Message.encode(response)));
|
|
271
|
-
}
|
|
86
|
+
const send = (message) => {
|
|
87
|
+
ws.send(new Uint8Array(Message.encode(message)));
|
|
88
|
+
};
|
|
89
|
+
await this.core.processRequest(request, response, env, {
|
|
90
|
+
send,
|
|
91
|
+
buildIncomingMetadata: (message) => {
|
|
92
|
+
const incomingMetadata = new Metadata();
|
|
93
|
+
if (message.messageId !== void 0) incomingMetadata.set(STREAM_MESSAGE_ID_KEY, message.messageId);
|
|
94
|
+
if (message.methodId !== void 0) incomingMetadata.set(STREAM_METHOD_ID_KEY, String(message.methodId));
|
|
95
|
+
return incomingMetadata;
|
|
96
|
+
},
|
|
97
|
+
invokeServerStream: (message, context, method) => this.invokeServerStreamMethod(message, context, method),
|
|
98
|
+
writeStreamFrames: (generator, resp, method) => this.core.writeStreamFrames({
|
|
99
|
+
generator,
|
|
100
|
+
response: resp,
|
|
101
|
+
method,
|
|
102
|
+
send,
|
|
103
|
+
serializePayload: (value) => {
|
|
104
|
+
let payload = this._streamEncodeCache.get(value);
|
|
105
|
+
if (payload === void 0) {
|
|
106
|
+
payload = new Uint8Array(this.serializeResponse(value, method, "bebop"));
|
|
107
|
+
this._streamEncodeCache.set(value, payload);
|
|
108
|
+
}
|
|
109
|
+
return payload;
|
|
110
|
+
},
|
|
111
|
+
onEnd: () => this.serverStreams.delete(request.messageId)
|
|
112
|
+
})
|
|
113
|
+
});
|
|
272
114
|
}
|
|
273
115
|
handle(_request, _env) {
|
|
274
116
|
throw new TempoError(TempoStatusCode.UNIMPLEMENTED, "Method not implemented.");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vampgg/utils",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.3",
|
|
4
4
|
"description": "Tempo RPC, Bebop serialization, transports, and async primitives for @vampgg.",
|
|
5
5
|
"homepage": "https://github.com/sammccord/vamp/tree/main/packages/utils#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -21,16 +21,14 @@
|
|
|
21
21
|
"exports": {
|
|
22
22
|
"./async-queue": "./dist/async-queue.mjs",
|
|
23
23
|
"./bebop": "./dist/bebop.mjs",
|
|
24
|
+
"./channel-core": "./dist/channel-core.mjs",
|
|
24
25
|
"./context-logger": "./dist/context-logger.mjs",
|
|
25
26
|
"./create-duplex-iterator": "./dist/create-duplex-iterator.mjs",
|
|
26
27
|
"./create-event-iterator": "./dist/create-event-iterator.mjs",
|
|
27
|
-
"./debug-logger": "./dist/debug-logger.mjs",
|
|
28
|
-
"./error": "./dist/error.mjs",
|
|
29
28
|
"./extension-channel": "./dist/extension-channel.mjs",
|
|
30
29
|
"./extension-router": "./dist/extension-router.mjs",
|
|
31
|
-
"./memory-storage": "./dist/memory-storage.mjs",
|
|
32
30
|
"./pino-logger": "./dist/pino-logger.mjs",
|
|
33
|
-
"./
|
|
31
|
+
"./router-core": "./dist/router-core.mjs",
|
|
34
32
|
"./worker-channel": "./dist/worker-channel.mjs",
|
|
35
33
|
"./worker-router": "./dist/worker-router.mjs",
|
|
36
34
|
"./ws-channel": "./dist/ws-channel.mjs",
|
|
@@ -45,8 +43,6 @@
|
|
|
45
43
|
"@tempojs/common": "^0.0.12",
|
|
46
44
|
"@tempojs/server": "^0.0.12",
|
|
47
45
|
"bebop": "3.2.3",
|
|
48
|
-
"debug": "^4.4.3",
|
|
49
|
-
"lodash-es": "^4.17.23",
|
|
50
46
|
"pino": "^10.3.1",
|
|
51
47
|
"tseep": "^1.3.1",
|
|
52
48
|
"webextension-polyfill": "^0.12.0",
|
|
@@ -54,8 +50,6 @@
|
|
|
54
50
|
},
|
|
55
51
|
"devDependencies": {
|
|
56
52
|
"@types/bun": "^1.3.14",
|
|
57
|
-
"@types/debug": "^4.1.12",
|
|
58
|
-
"@types/lodash-es": "^4.17.12",
|
|
59
53
|
"@types/node": "^25.5.0",
|
|
60
54
|
"@types/webextension-polyfill": "^0.12.5",
|
|
61
55
|
"@typescript/native-preview": "7.0.0-dev.20260315.1",
|
package/dist/debug-logger.d.mts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { ContextLogger } from "./context-logger.mjs";
|
|
2
|
-
import { ConsoleLogger, TempoLogLevel, TempoLogger } from "@tempojs/common";
|
|
3
|
-
|
|
4
|
-
//#region src/debug-logger.d.ts
|
|
5
|
-
declare class DebugLogger extends ContextLogger implements ConsoleLogger {
|
|
6
|
-
bindings: Record<string, unknown>;
|
|
7
|
-
private debuggers;
|
|
8
|
-
sourceName: string;
|
|
9
|
-
logLevel: TempoLogLevel;
|
|
10
|
-
protected readonly children: Set<TempoLogger>;
|
|
11
|
-
constructor(sourceName: string, logLevel?: TempoLogLevel, parent?: TempoLogger, bindings?: Record<string, unknown>);
|
|
12
|
-
correlate<TLogger extends TempoLogger>(sourceName: string, correlationId: string, asOrphan?: boolean, bindings?: Record<string, unknown>): TLogger;
|
|
13
|
-
clone<TLogger extends TempoLogger>(sourceName: string, asOrphan?: boolean, bindings?: Record<string, unknown>): TLogger;
|
|
14
|
-
write(level: TempoLogLevel, message: string, data?: Record<string, unknown>, error?: Error): void;
|
|
15
|
-
/**
|
|
16
|
-
* @inheritDoc
|
|
17
|
-
*/
|
|
18
|
-
trace(message: string, data?: Record<string, unknown>, error?: Error): void;
|
|
19
|
-
/**
|
|
20
|
-
* @inheritDoc
|
|
21
|
-
*/
|
|
22
|
-
debug(message: string, data?: Record<string, unknown>, error?: Error): void;
|
|
23
|
-
/**
|
|
24
|
-
* @inheritDoc
|
|
25
|
-
*/
|
|
26
|
-
info(message: string, data?: Record<string, unknown>, error?: Error): void;
|
|
27
|
-
/**
|
|
28
|
-
* @inheritDoc
|
|
29
|
-
*/
|
|
30
|
-
warn(message: string, data?: Record<string, unknown>, error?: Error): void;
|
|
31
|
-
/**
|
|
32
|
-
* @inheritDoc
|
|
33
|
-
*/
|
|
34
|
-
error(message: string, data?: Record<string, unknown>, error?: Error): void;
|
|
35
|
-
/**
|
|
36
|
-
* @inheritDoc
|
|
37
|
-
*/
|
|
38
|
-
critical(message: string, data?: Record<string, unknown>, error?: Error): void;
|
|
39
|
-
setLogLevel(level: TempoLogLevel): void;
|
|
40
|
-
formatErrorMessage(error: Error, indentLevel?: number): string;
|
|
41
|
-
}
|
|
42
|
-
//#endregion
|
|
43
|
-
export { DebugLogger };
|
package/dist/debug-logger.mjs
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { ContextLogger } from "./context-logger.mjs";
|
|
2
|
-
import { TempoLogLevel } from "@tempojs/common";
|
|
3
|
-
import debug from "debug";
|
|
4
|
-
//#region src/debug-logger.ts
|
|
5
|
-
var DebugLogger = class DebugLogger extends ContextLogger {
|
|
6
|
-
bindings = {};
|
|
7
|
-
debuggers;
|
|
8
|
-
sourceName;
|
|
9
|
-
logLevel;
|
|
10
|
-
children = /* @__PURE__ */ new Set();
|
|
11
|
-
constructor(sourceName, logLevel = TempoLogLevel.Info, parent, bindings = {}) {
|
|
12
|
-
super(sourceName, logLevel, parent, bindings);
|
|
13
|
-
this.sourceName = sourceName;
|
|
14
|
-
this.logLevel = logLevel;
|
|
15
|
-
this.debuggers = {
|
|
16
|
-
trace: debug(`${sourceName}:trace`),
|
|
17
|
-
debug: debug(`${sourceName}:debug`),
|
|
18
|
-
info: debug(`${sourceName}:info`),
|
|
19
|
-
warn: debug(`${sourceName}:warn`),
|
|
20
|
-
error: debug(`${sourceName}:error`),
|
|
21
|
-
critical: debug(`${sourceName}:critical`)
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
correlate(sourceName, correlationId, asOrphan, bindings) {
|
|
25
|
-
return this.clone(sourceName, asOrphan, {
|
|
26
|
-
...bindings,
|
|
27
|
-
correlationId
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
clone(sourceName, asOrphan, bindings) {
|
|
31
|
-
const logger = new DebugLogger(asOrphan ? sourceName : `${this.sourceName}:${sourceName}`, this.logLevel, asOrphan !== true ? this : void 0, {
|
|
32
|
-
...this.bindings,
|
|
33
|
-
...bindings
|
|
34
|
-
});
|
|
35
|
-
if (asOrphan !== true) this.children.add(logger);
|
|
36
|
-
return logger;
|
|
37
|
-
}
|
|
38
|
-
write(level, message, data = {}, error) {
|
|
39
|
-
if (level < this.logLevel) return;
|
|
40
|
-
let logError = "";
|
|
41
|
-
if (error) {
|
|
42
|
-
logError = `\n${this.formatErrorMessage(error)}`;
|
|
43
|
-
data.error = logError;
|
|
44
|
-
}
|
|
45
|
-
const fullMessage = `${message}${` ${JSON.stringify({
|
|
46
|
-
...this.bindings,
|
|
47
|
-
...data
|
|
48
|
-
}, null, 2)}`}`;
|
|
49
|
-
switch (level) {
|
|
50
|
-
case TempoLogLevel.Trace:
|
|
51
|
-
this.debuggers.trace(fullMessage);
|
|
52
|
-
break;
|
|
53
|
-
case TempoLogLevel.Debug:
|
|
54
|
-
this.debuggers.debug(fullMessage);
|
|
55
|
-
break;
|
|
56
|
-
case TempoLogLevel.Info:
|
|
57
|
-
this.debuggers.info(fullMessage);
|
|
58
|
-
break;
|
|
59
|
-
case TempoLogLevel.Warn:
|
|
60
|
-
this.debuggers.warn(fullMessage);
|
|
61
|
-
break;
|
|
62
|
-
case TempoLogLevel.Error:
|
|
63
|
-
this.debuggers.error(fullMessage);
|
|
64
|
-
break;
|
|
65
|
-
case TempoLogLevel.Critical:
|
|
66
|
-
this.debuggers.critical(fullMessage);
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* @inheritDoc
|
|
72
|
-
*/
|
|
73
|
-
trace(message, data, error) {
|
|
74
|
-
this.write(TempoLogLevel.Trace, message, data, error);
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* @inheritDoc
|
|
78
|
-
*/
|
|
79
|
-
debug(message, data, error) {
|
|
80
|
-
this.write(TempoLogLevel.Debug, message, data, error);
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* @inheritDoc
|
|
84
|
-
*/
|
|
85
|
-
info(message, data, error) {
|
|
86
|
-
this.write(TempoLogLevel.Info, message, data, error);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* @inheritDoc
|
|
90
|
-
*/
|
|
91
|
-
warn(message, data, error) {
|
|
92
|
-
this.write(TempoLogLevel.Warn, message, data, error);
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* @inheritDoc
|
|
96
|
-
*/
|
|
97
|
-
error(message, data, error) {
|
|
98
|
-
this.write(TempoLogLevel.Error, message, data, error);
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* @inheritDoc
|
|
102
|
-
*/
|
|
103
|
-
critical(message, data, error) {
|
|
104
|
-
this.write(TempoLogLevel.Critical, message, data, error);
|
|
105
|
-
}
|
|
106
|
-
setLogLevel(level) {
|
|
107
|
-
this.logLevel = level;
|
|
108
|
-
}
|
|
109
|
-
formatErrorMessage(error, indentLevel = 0) {
|
|
110
|
-
const indent = " ".repeat(indentLevel);
|
|
111
|
-
const message = error.message || "Unknown error";
|
|
112
|
-
const indentedStack = (error.stack || "Stack unavailable").split("\n").map((line) => `${indent}${line}`).join("\n");
|
|
113
|
-
let cause = "";
|
|
114
|
-
if ("cause" in error) cause = error?.cause instanceof Error ? this.formatErrorMessage(error.cause, indentLevel + 1) : "";
|
|
115
|
-
return `
|
|
116
|
-
${indent}Error message: ${message}
|
|
117
|
-
${indentedStack}
|
|
118
|
-
${indent}${cause ? `Cause: ${cause}` : ""}`.trimEnd();
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
//#endregion
|
|
122
|
-
export { DebugLogger };
|
package/dist/error.d.mts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Error } from "./bebop.mjs";
|
|
2
|
-
import { TempoError } from "@tempojs/common";
|
|
3
|
-
|
|
4
|
-
//#region src/error.d.ts
|
|
5
|
-
declare class SystemError<Tag extends string> extends TempoError {
|
|
6
|
-
readonly _tag: Tag;
|
|
7
|
-
readonly cause: Error;
|
|
8
|
-
constructor(tag: Tag, error?: Partial<Omit<Error, "tag">>);
|
|
9
|
-
static generic(err: unknown, tag?: ErrorTags, opts?: Partial<Omit<Error, "tag">>): SystemError<ErrorTags>;
|
|
10
|
-
}
|
|
11
|
-
declare enum ErrorTags {
|
|
12
|
-
PgOutage = "PgOutage",
|
|
13
|
-
RedisOutage = "RedisOutage",
|
|
14
|
-
Unknown = "Unknown",
|
|
15
|
-
NeedPermissions = "NeedPermissions",
|
|
16
|
-
Validation = "Validation",
|
|
17
|
-
Authorization = "Authorization",
|
|
18
|
-
GameStateGeneration = "GameStateGeneration",
|
|
19
|
-
InvalidPrompt = "InvalidPrompt",
|
|
20
|
-
UnknownAIProvider = "UnknownAIProvider",
|
|
21
|
-
FailedToStart = "FailedToStart",
|
|
22
|
-
Unimplemented = "Unimplemented",
|
|
23
|
-
IncompatibleVersion = "IncompatibleVersion",
|
|
24
|
-
PingUnacceptable = "PingUnacceptable"
|
|
25
|
-
}
|
|
26
|
-
//#endregion
|
|
27
|
-
export { ErrorTags, SystemError };
|
package/dist/error.mjs
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { TempoError, TempoStatusCode } from "@tempojs/common";
|
|
2
|
-
import defaults from "lodash-es/defaults";
|
|
3
|
-
//#region src/error.ts
|
|
4
|
-
var SystemError = class SystemError extends TempoError {
|
|
5
|
-
_tag;
|
|
6
|
-
cause;
|
|
7
|
-
constructor(tag, error) {
|
|
8
|
-
const err = defaults({ ...error }, {
|
|
9
|
-
code: TempoStatusCode.UNKNOWN,
|
|
10
|
-
stack: "",
|
|
11
|
-
msg: "Unknown error occured",
|
|
12
|
-
details: /* @__PURE__ */ new Map()
|
|
13
|
-
});
|
|
14
|
-
const cause = {
|
|
15
|
-
...err,
|
|
16
|
-
tag
|
|
17
|
-
};
|
|
18
|
-
super(err.code, err.msg, cause);
|
|
19
|
-
this._tag = tag;
|
|
20
|
-
this.cause = cause;
|
|
21
|
-
}
|
|
22
|
-
static generic(err, tag, opts) {
|
|
23
|
-
return new SystemError(tag || "Unknown", {
|
|
24
|
-
msg: err instanceof Error ? err.message : "Unknown error occured",
|
|
25
|
-
code: err instanceof TempoError ? err.status : TempoStatusCode.INTERNAL,
|
|
26
|
-
details: err instanceof Error ? err.cause instanceof Map ? err.cause : /* @__PURE__ */ new Map() : new Map([["cause", JSON.stringify(err?.cause || "")]]),
|
|
27
|
-
stack: err?.stack || "",
|
|
28
|
-
...opts
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
let ErrorTags = /* @__PURE__ */ function(ErrorTags) {
|
|
33
|
-
ErrorTags["PgOutage"] = "PgOutage";
|
|
34
|
-
ErrorTags["RedisOutage"] = "RedisOutage";
|
|
35
|
-
ErrorTags["Unknown"] = "Unknown";
|
|
36
|
-
ErrorTags["NeedPermissions"] = "NeedPermissions";
|
|
37
|
-
ErrorTags["Validation"] = "Validation";
|
|
38
|
-
ErrorTags["Authorization"] = "Authorization";
|
|
39
|
-
ErrorTags["GameStateGeneration"] = "GameStateGeneration";
|
|
40
|
-
ErrorTags["InvalidPrompt"] = "InvalidPrompt";
|
|
41
|
-
ErrorTags["UnknownAIProvider"] = "UnknownAIProvider";
|
|
42
|
-
ErrorTags["FailedToStart"] = "FailedToStart";
|
|
43
|
-
ErrorTags["Unimplemented"] = "Unimplemented";
|
|
44
|
-
ErrorTags["IncompatibleVersion"] = "IncompatibleVersion";
|
|
45
|
-
ErrorTags["PingUnacceptable"] = "PingUnacceptable";
|
|
46
|
-
return ErrorTags;
|
|
47
|
-
}({});
|
|
48
|
-
//#endregion
|
|
49
|
-
export { ErrorTags, SystemError };
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Credential } from "@tempojs/common";
|
|
2
|
-
import { CredentialStorage } from "@tempojs/client";
|
|
3
|
-
|
|
4
|
-
//#region src/memory-storage.d.ts
|
|
5
|
-
declare class MemoryStorageStrategy implements CredentialStorage {
|
|
6
|
-
storage: Map<string, string>;
|
|
7
|
-
getCredential(key: string): Promise<Credential | undefined>;
|
|
8
|
-
storeCredential(key: string, _credential: Credential): Promise<void>;
|
|
9
|
-
removeCredential(key: string): Promise<void>;
|
|
10
|
-
}
|
|
11
|
-
//#endregion
|
|
12
|
-
export { MemoryStorageStrategy };
|
package/dist/memory-storage.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { parseCredential, stringifyCredential } from "@tempojs/common";
|
|
2
|
-
//#region src/memory-storage.ts
|
|
3
|
-
var MemoryStorageStrategy = class {
|
|
4
|
-
storage = /* @__PURE__ */ new Map();
|
|
5
|
-
async getCredential(key) {
|
|
6
|
-
let credentials = this.storage.get(key);
|
|
7
|
-
if (!credentials) return void 0;
|
|
8
|
-
return parseCredential(credentials);
|
|
9
|
-
}
|
|
10
|
-
async storeCredential(key, _credential) {
|
|
11
|
-
this.storage.set(key, stringifyCredential(_credential));
|
|
12
|
-
}
|
|
13
|
-
async removeCredential(key) {
|
|
14
|
-
this.storage.delete(key);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
//#endregion
|
|
18
|
-
export { MemoryStorageStrategy };
|
package/dist/sync-storage.d.mts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Credential } from "@tempojs/common";
|
|
2
|
-
import { CredentialStorage } from "@tempojs/client";
|
|
3
|
-
|
|
4
|
-
//#region src/sync-storage.d.ts
|
|
5
|
-
declare class SyncStorageStrategy implements CredentialStorage {
|
|
6
|
-
getCredential(key: string): Promise<Credential | undefined>;
|
|
7
|
-
storeCredential(key: string, _credential: Credential): Promise<void>;
|
|
8
|
-
removeCredential(key: string): Promise<void>;
|
|
9
|
-
}
|
|
10
|
-
//#endregion
|
|
11
|
-
export { SyncStorageStrategy };
|
package/dist/sync-storage.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { parseCredential, stringifyCredential } from "@tempojs/common";
|
|
2
|
-
import { storage } from "webextension-polyfill";
|
|
3
|
-
//#region src/sync-storage.ts
|
|
4
|
-
var SyncStorageStrategy = class {
|
|
5
|
-
async getCredential(key) {
|
|
6
|
-
let credentials = await storage.sync.get(key);
|
|
7
|
-
if (!credentials[key]) return void 0;
|
|
8
|
-
return parseCredential(credentials[key]);
|
|
9
|
-
}
|
|
10
|
-
async storeCredential(key, _credential) {
|
|
11
|
-
await storage.sync.set({ [key]: stringifyCredential(_credential) });
|
|
12
|
-
}
|
|
13
|
-
async removeCredential(key) {
|
|
14
|
-
await storage.sync.remove(key);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
//#endregion
|
|
18
|
-
export { SyncStorageStrategy };
|