@vibes.diy/vibe-runtime 12.1.1 → 12.1.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/vibe-log.js ADDED
@@ -0,0 +1,234 @@
1
+ import { exception2Result } from "@adviser/cement";
2
+ import { safeLocalStorage } from "./safe-local-storage.js";
3
+ const LOG_BODY_MAX_CHARS = 4096;
4
+ const BUFFER_MAX_EVENTS = 200;
5
+ const SESSION_MAX_EVENTS = 1000;
6
+ const FLUSH_INTERVAL_MS = 10_000;
7
+ const BATCH_MAX_EVENTS = 64;
8
+ const REQUEST_MAX_BYTES = 64 * 1024;
9
+ const LOG_ROUTE_PATH = "/_log";
10
+ const DEVICE_ID_KEY = "vibes:log:device";
11
+ const DEVICE_HASH_SALT = "vibes.diy/vibe-log/v1";
12
+ let state;
13
+ const nowOf = (s) => (s.hooks.now ?? Date.now)();
14
+ function visibilityOf(s) {
15
+ if (s.hooks.visibilityState)
16
+ return s.hooks.visibilityState();
17
+ const doc = globalThis.document;
18
+ return doc?.visibilityState === "hidden" ? "hidden" : "visible";
19
+ }
20
+ function hiddenMsNow(s) {
21
+ const base = s.hiddenMs;
22
+ return s.hiddenSince === undefined ? base : base + Math.max(0, nowOf(s) - s.hiddenSince);
23
+ }
24
+ export function renderVibeLogArgs(args) {
25
+ const parts = [];
26
+ for (const a of args) {
27
+ if (typeof a === "string") {
28
+ parts.push(a);
29
+ continue;
30
+ }
31
+ const errLike = a;
32
+ if (errLike && typeof errLike.stack === "string") {
33
+ parts.push(errLike.stack);
34
+ continue;
35
+ }
36
+ const s = exception2Result(() => JSON.stringify(a));
37
+ const rendered = s.isErr() ? undefined : s.Ok();
38
+ parts.push(rendered === undefined ? String(a) : rendered);
39
+ }
40
+ const body = parts.join(" ");
41
+ return body.length > LOG_BODY_MAX_CHARS ? body.slice(0, LOG_BODY_MAX_CHARS) : body;
42
+ }
43
+ const LEVEL_SET = { debug: true, info: true, warn: true, error: true };
44
+ const LEVELS = Object.keys(LEVEL_SET);
45
+ export function splitVibeLogArgs(all) {
46
+ const first = all[0];
47
+ if (all.length > 0 && typeof first === "string" && LEVELS.includes(first)) {
48
+ return { level: first, args: all.slice(1) };
49
+ }
50
+ return { level: "info", args: all };
51
+ }
52
+ function randomHex(bytes) {
53
+ const buf = new Uint8Array(bytes);
54
+ const c = globalThis.crypto;
55
+ if (c?.getRandomValues) {
56
+ c.getRandomValues(buf);
57
+ }
58
+ else {
59
+ for (let i = 0; i < buf.length; i++)
60
+ buf[i] = Math.floor(Math.random() * 256);
61
+ }
62
+ return Array.from(buf, (b) => b.toString(16).padStart(2, "0")).join("");
63
+ }
64
+ function fnv1a128(input) {
65
+ const seeds = [0x811c9dc5, 0x01000193, 0x9e3779b9, 0x85ebca6b];
66
+ const lanes = seeds.map((seed) => {
67
+ let h = seed >>> 0;
68
+ for (let i = 0; i < input.length; i++) {
69
+ h ^= input.charCodeAt(i);
70
+ h = Math.imul(h, 0x01000193) >>> 0;
71
+ }
72
+ return h.toString(16).padStart(8, "0");
73
+ });
74
+ return lanes.join("");
75
+ }
76
+ export function deviceHashFor(ownerHandle, appSlug, rawId) {
77
+ return fnv1a128(`${DEVICE_HASH_SALT}|${ownerHandle}/${appSlug}|${rawId}`);
78
+ }
79
+ function readOrMintDeviceId() {
80
+ const store = safeLocalStorage();
81
+ if (!store)
82
+ return randomHex(16);
83
+ const existing = exception2Result(() => store.getItem(DEVICE_ID_KEY));
84
+ const found = existing.isErr() ? null : existing.Ok();
85
+ if (typeof found === "string" && found.length > 0)
86
+ return found;
87
+ const minted = randomHex(16);
88
+ exception2Result(() => store.setItem(DEVICE_ID_KEY, minted));
89
+ return minted;
90
+ }
91
+ async function defaultSend(body) {
92
+ await fetch(LOG_ROUTE_PATH, {
93
+ method: "POST",
94
+ headers: { "content-type": "application/json" },
95
+ body,
96
+ keepalive: true,
97
+ credentials: "omit",
98
+ });
99
+ }
100
+ function batchBody(s, events) {
101
+ const viewer = s.reg.viewerHandle ? exception2Result(() => s.reg.viewerHandle?.()) : undefined;
102
+ const viewerHandle = viewer && viewer.isOk() ? viewer.Ok() : undefined;
103
+ return JSON.stringify({
104
+ sessionId: s.sessionId,
105
+ deviceHash: s.deviceHash,
106
+ fsId: s.reg.fsId,
107
+ ...(viewerHandle ? { viewerHandle } : {}),
108
+ events,
109
+ });
110
+ }
111
+ export function vibeLog(...all) {
112
+ try {
113
+ const s = state;
114
+ if (!s)
115
+ return;
116
+ if (s.admitted >= SESSION_MAX_EVENTS)
117
+ return;
118
+ const { level, args } = splitVibeLogArgs(all);
119
+ const body = renderVibeLogArgs(args);
120
+ if (body.length === 0)
121
+ return;
122
+ s.admitted++;
123
+ s.buffer.push({
124
+ level,
125
+ body,
126
+ visibility: visibilityOf(s),
127
+ hiddenMs: hiddenMsNow(s),
128
+ });
129
+ while (s.buffer.length > BUFFER_MAX_EVENTS)
130
+ s.buffer.shift();
131
+ }
132
+ catch {
133
+ }
134
+ }
135
+ export const vibe = { log: vibeLog };
136
+ function encodedByteLength(text) {
137
+ const Enc = globalThis.TextEncoder;
138
+ if (Enc)
139
+ return new Enc().encode(text).length;
140
+ return text.length * 3;
141
+ }
142
+ function takeVibeLogBatch(s) {
143
+ const envelope = exception2Result(() => encodedByteLength(batchBody(s, [])));
144
+ let used = envelope.isOk() ? envelope.Ok() : 0;
145
+ const out = [];
146
+ while (s.buffer.length > 0 && out.length < BATCH_MAX_EVENTS) {
147
+ const next = s.buffer[0];
148
+ const sized = exception2Result(() => encodedByteLength(JSON.stringify(next)) + 1);
149
+ const cost = sized.isOk() ? sized.Ok() : REQUEST_MAX_BYTES;
150
+ if (out.length > 0 && used + cost > REQUEST_MAX_BYTES)
151
+ break;
152
+ out.push(next);
153
+ s.buffer.shift();
154
+ used += cost;
155
+ }
156
+ return out;
157
+ }
158
+ export async function flushVibeLog() {
159
+ const s = state;
160
+ if (!s)
161
+ return;
162
+ const send = s.hooks.send ?? defaultSend;
163
+ while (s.buffer.length > 0) {
164
+ const events = takeVibeLogBatch(s);
165
+ if (events.length === 0)
166
+ break;
167
+ const body = exception2Result(() => batchBody(s, events));
168
+ if (body.isErr())
169
+ continue;
170
+ await exception2Result(() => send(body.Ok()));
171
+ }
172
+ }
173
+ export function registerVibeLog(reg, hooks = {}) {
174
+ try {
175
+ unregisterVibeLog();
176
+ const s = {
177
+ reg,
178
+ hooks,
179
+ sessionId: randomHex(16),
180
+ deviceHash: deviceHashFor(reg.ownerHandle, reg.appSlug, readOrMintDeviceId()),
181
+ buffer: [],
182
+ admitted: 0,
183
+ hiddenMs: 0,
184
+ hiddenSince: undefined,
185
+ timer: undefined,
186
+ detach: undefined,
187
+ };
188
+ state = s;
189
+ if (visibilityOf(s) === "hidden")
190
+ s.hiddenSince = nowOf(s);
191
+ const realm = globalThis;
192
+ const doc = hooks.lifecycleTarget ?? realm.document;
193
+ const pageTarget = hooks.lifecycleTarget ?? realm;
194
+ const onVisibility = () => {
195
+ if (visibilityOf(s) === "hidden") {
196
+ if (s.hiddenSince === undefined)
197
+ s.hiddenSince = nowOf(s);
198
+ void flushVibeLog();
199
+ }
200
+ else if (s.hiddenSince !== undefined) {
201
+ s.hiddenMs += Math.max(0, nowOf(s) - s.hiddenSince);
202
+ s.hiddenSince = undefined;
203
+ }
204
+ };
205
+ const onPageHide = () => {
206
+ void flushVibeLog();
207
+ };
208
+ doc?.addEventListener?.("visibilitychange", onVisibility);
209
+ pageTarget.addEventListener?.("pagehide", onPageHide);
210
+ s.detach = () => {
211
+ doc?.removeEventListener?.("visibilitychange", onVisibility);
212
+ pageTarget.removeEventListener?.("pagehide", onPageHide);
213
+ };
214
+ s.timer = setInterval(() => void flushVibeLog(), FLUSH_INTERVAL_MS);
215
+ }
216
+ catch {
217
+ }
218
+ }
219
+ export function unregisterVibeLog() {
220
+ const s = state;
221
+ state = undefined;
222
+ if (!s)
223
+ return;
224
+ if (s.timer !== undefined)
225
+ clearInterval(s.timer);
226
+ exception2Result(() => s.detach?.());
227
+ }
228
+ export function __vibeLogBufferForTests() {
229
+ return state ? [...state.buffer] : [];
230
+ }
231
+ export function __vibeLogIdentityForTests() {
232
+ return state ? { sessionId: state.sessionId, deviceHash: state.deviceHash } : undefined;
233
+ }
234
+ //# sourceMappingURL=vibe-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vibe-log.js","sourceRoot":"","sources":["../jsr/vibe-log.ts"],"names":[],"mappings":"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"}