@blyp/core 0.1.2 → 0.1.22

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.
Files changed (230) hide show
  1. package/README.md +273 -14
  2. package/STABILITY.md +56 -0
  3. package/dist/ai/anthropic/index.d.ts +3 -0
  4. package/dist/ai/anthropic/normalize.d.ts +9 -0
  5. package/dist/ai/anthropic/stream.d.ts +3 -0
  6. package/dist/ai/anthropic/wrap.d.ts +13 -0
  7. package/dist/ai/anthropic.js +701 -0
  8. package/dist/ai/anthropic.mjs +701 -0
  9. package/dist/ai/fetch.js +701 -0
  10. package/dist/ai/fetch.mjs +701 -0
  11. package/dist/ai/openai/index.d.ts +3 -0
  12. package/dist/ai/openai/normalize.d.ts +10 -0
  13. package/dist/ai/openai/stream.d.ts +3 -0
  14. package/dist/ai/openai/wrap.d.ts +24 -0
  15. package/dist/ai/openai.js +701 -0
  16. package/dist/ai/openai.mjs +701 -0
  17. package/dist/ai/shared/fetch.d.ts +5 -0
  18. package/dist/ai/shared/index.d.ts +2 -0
  19. package/dist/ai/shared/normalize.d.ts +17 -0
  20. package/dist/ai/shared/redaction.d.ts +6 -0
  21. package/dist/ai/shared/stream.d.ts +7 -0
  22. package/dist/ai/shared/trace.d.ts +116 -0
  23. package/dist/ai/shared/types.d.ts +161 -0
  24. package/dist/ai/shared.js +701 -0
  25. package/dist/ai/shared.mjs +701 -0
  26. package/dist/ai/vercel/index.d.ts +3 -0
  27. package/dist/ai/vercel/middleware.d.ts +3 -0
  28. package/dist/ai/vercel/model.d.ts +3 -0
  29. package/dist/ai/vercel.js +701 -0
  30. package/dist/ai/vercel.mjs +701 -0
  31. package/dist/astro.js +701 -0
  32. package/dist/astro.mjs +701 -0
  33. package/dist/client.js +1 -1132
  34. package/dist/client.mjs +1 -1125
  35. package/dist/connectors/betterstack.js +9 -1508
  36. package/dist/connectors/betterstack.mjs +9 -1483
  37. package/dist/connectors/databuddy/index.d.ts +7 -0
  38. package/dist/connectors/databuddy/sender.d.ts +5 -0
  39. package/dist/connectors/databuddy.js +9 -0
  40. package/dist/connectors/databuddy.mjs +9 -0
  41. package/dist/connectors/delivery/backoff.d.ts +2 -0
  42. package/dist/connectors/delivery/manager.d.ts +44 -0
  43. package/dist/connectors/delivery/queue-path.d.ts +1 -0
  44. package/dist/connectors/delivery/sqlite-adapter-bun.d.ts +1 -0
  45. package/dist/connectors/delivery/sqlite-adapter-node.d.ts +1 -0
  46. package/dist/connectors/delivery/sqlite-client.d.ts +37 -0
  47. package/dist/connectors/delivery/sqlite-worker.d.ts +1 -0
  48. package/dist/connectors/delivery/studio-queue.d.ts +12 -0
  49. package/dist/connectors/delivery/types.d.ts +98 -0
  50. package/dist/connectors/otlp/index.d.ts +1 -0
  51. package/dist/connectors/otlp.js +9 -1347
  52. package/dist/connectors/otlp.mjs +9 -1344
  53. package/dist/connectors/posthog/properties.d.ts +4 -0
  54. package/dist/connectors/posthog/sender.d.ts +0 -1
  55. package/dist/connectors/posthog.js +10 -1503
  56. package/dist/connectors/posthog.mjs +10 -1498
  57. package/dist/connectors/sentry.js +9 -1356
  58. package/dist/connectors/sentry.mjs +9 -1333
  59. package/dist/core/config.d.ts +7 -2
  60. package/dist/core/log-record.d.ts +5 -4
  61. package/dist/core/logger.d.ts +5 -0
  62. package/dist/core/optional-module.d.ts +1 -0
  63. package/dist/core/pino-pretty-loader.d.ts +4 -0
  64. package/dist/database.js +1 -24
  65. package/dist/database.mjs +1 -21
  66. package/dist/elysia.js +621 -4100
  67. package/dist/elysia.mjs +622 -4073
  68. package/dist/expo.js +1 -719
  69. package/dist/expo.mjs +1 -717
  70. package/dist/express.js +616 -4085
  71. package/dist/express.mjs +616 -4056
  72. package/dist/fastify.js +618 -4104
  73. package/dist/fastify.mjs +618 -4075
  74. package/dist/frameworks/astro/index.d.ts +2 -0
  75. package/dist/frameworks/astro/logger.d.ts +3 -0
  76. package/dist/frameworks/elysia/index.d.ts +1 -1
  77. package/dist/frameworks/elysia/logger.d.ts +2 -35
  78. package/dist/frameworks/nestjs/helpers.d.ts +2 -0
  79. package/dist/frameworks/nitro/index.d.ts +2 -0
  80. package/dist/frameworks/nitro/logger.d.ts +6 -0
  81. package/dist/frameworks/nuxt/index.d.ts +2 -0
  82. package/dist/frameworks/nuxt/logger.d.ts +3 -0
  83. package/dist/frameworks/react-router/index.d.ts +2 -0
  84. package/dist/frameworks/react-router/logger.d.ts +3 -0
  85. package/dist/frameworks/shared/h3.d.ts +19 -0
  86. package/dist/frameworks/shared/http.d.ts +3 -2
  87. package/dist/frameworks/shared/index.d.ts +2 -1
  88. package/dist/frameworks/shared/logger.d.ts +2 -0
  89. package/dist/frameworks/shared/request-context.d.ts +2 -0
  90. package/dist/frameworks/shared/trace.d.ts +6 -0
  91. package/dist/hono.js +624 -4079
  92. package/dist/hono.mjs +626 -4053
  93. package/dist/index.d.ts +57 -17
  94. package/dist/index.js +616 -6494
  95. package/dist/index.mjs +619 -6410
  96. package/dist/nestjs.js +626 -4574
  97. package/dist/nestjs.mjs +622 -4542
  98. package/dist/nextjs.js +625 -4107
  99. package/dist/nextjs.mjs +627 -4081
  100. package/dist/nitro.js +701 -0
  101. package/dist/nitro.mjs +701 -0
  102. package/dist/nuxt.js +701 -0
  103. package/dist/nuxt.mjs +701 -0
  104. package/dist/react-router.js +701 -0
  105. package/dist/react-router.mjs +701 -0
  106. package/dist/shared/redaction.d.ts +17 -0
  107. package/dist/standalone.js +606 -3258
  108. package/dist/standalone.mjs +611 -3234
  109. package/dist/sveltekit.js +625 -4106
  110. package/dist/sveltekit.mjs +626 -4079
  111. package/dist/tanstack-start.js +624 -4105
  112. package/dist/tanstack-start.mjs +626 -4079
  113. package/dist/types/connectors/databuddy.d.ts +52 -0
  114. package/dist/types/core/config.d.ts +89 -0
  115. package/dist/types/core/logger.d.ts +5 -0
  116. package/dist/types/core/structured-log.d.ts +2 -0
  117. package/dist/types/database.d.ts +1 -0
  118. package/dist/types/frameworks/astro.d.ts +33 -0
  119. package/dist/types/frameworks/client.d.ts +2 -0
  120. package/dist/types/frameworks/elysia.d.ts +2 -0
  121. package/dist/types/frameworks/express.d.ts +1 -0
  122. package/dist/types/frameworks/fastify.d.ts +1 -0
  123. package/dist/types/frameworks/hono.d.ts +1 -0
  124. package/dist/types/frameworks/http.d.ts +1 -0
  125. package/dist/types/frameworks/nestjs.d.ts +2 -0
  126. package/dist/types/frameworks/nextjs.d.ts +1 -0
  127. package/dist/types/frameworks/nitro.d.ts +63 -0
  128. package/dist/types/frameworks/nuxt.d.ts +12 -0
  129. package/dist/types/frameworks/react-router.d.ts +35 -0
  130. package/dist/types/frameworks/request-context.d.ts +1 -0
  131. package/dist/types/frameworks/shared.d.ts +28 -1
  132. package/dist/types/frameworks/standalone.d.ts +3 -2
  133. package/dist/types/frameworks/sveltekit.d.ts +1 -0
  134. package/dist/types/frameworks/tanstack-start.d.ts +9 -3
  135. package/dist/types/frameworks/workers.d.ts +3 -0
  136. package/dist/types/shared/client-log.d.ts +2 -1
  137. package/dist/workers.js +2 -626
  138. package/dist/workers.mjs +2 -623
  139. package/package.json +273 -143
  140. package/dist/client.js.map +0 -1
  141. package/dist/client.mjs.map +0 -1
  142. package/dist/connectors/betterstack.js.map +0 -1
  143. package/dist/connectors/betterstack.mjs.map +0 -1
  144. package/dist/connectors/otlp.js.map +0 -1
  145. package/dist/connectors/otlp.mjs.map +0 -1
  146. package/dist/connectors/posthog.js.map +0 -1
  147. package/dist/connectors/posthog.mjs.map +0 -1
  148. package/dist/connectors/sentry.js.map +0 -1
  149. package/dist/connectors/sentry.mjs.map +0 -1
  150. package/dist/database.js.map +0 -1
  151. package/dist/database.mjs.map +0 -1
  152. package/dist/elysia.js.map +0 -1
  153. package/dist/elysia.mjs.map +0 -1
  154. package/dist/expo.js.map +0 -1
  155. package/dist/expo.mjs.map +0 -1
  156. package/dist/express.js.map +0 -1
  157. package/dist/express.mjs.map +0 -1
  158. package/dist/fastify.js.map +0 -1
  159. package/dist/fastify.mjs.map +0 -1
  160. package/dist/hono.js.map +0 -1
  161. package/dist/hono.mjs.map +0 -1
  162. package/dist/index.js.map +0 -1
  163. package/dist/index.mjs.map +0 -1
  164. package/dist/nestjs.js.map +0 -1
  165. package/dist/nestjs.mjs.map +0 -1
  166. package/dist/nextjs.js.map +0 -1
  167. package/dist/nextjs.mjs.map +0 -1
  168. package/dist/standalone.js.map +0 -1
  169. package/dist/standalone.mjs.map +0 -1
  170. package/dist/sveltekit.js.map +0 -1
  171. package/dist/sveltekit.mjs.map +0 -1
  172. package/dist/tanstack-start.js.map +0 -1
  173. package/dist/tanstack-start.mjs.map +0 -1
  174. package/dist/workers.js.map +0 -1
  175. package/dist/workers.mjs.map +0 -1
  176. package/exports/client.js +0 -3
  177. package/exports/client.mjs +0 -3
  178. package/exports/connectors/betterstack.js +0 -1
  179. package/exports/connectors/betterstack.mjs +0 -1
  180. package/exports/connectors/otlp.js +0 -1
  181. package/exports/connectors/otlp.mjs +0 -1
  182. package/exports/connectors/posthog.js +0 -1
  183. package/exports/connectors/posthog.mjs +0 -1
  184. package/exports/connectors/sentry.js +0 -1
  185. package/exports/connectors/sentry.mjs +0 -1
  186. package/exports/database.js +0 -1
  187. package/exports/database.mjs +0 -1
  188. package/exports/expo.js +0 -1
  189. package/exports/expo.mjs +0 -1
  190. package/exports/frameworks/elysia.js +0 -1
  191. package/exports/frameworks/elysia.mjs +0 -1
  192. package/exports/frameworks/express.js +0 -1
  193. package/exports/frameworks/express.mjs +0 -1
  194. package/exports/frameworks/fastify.js +0 -1
  195. package/exports/frameworks/fastify.mjs +0 -1
  196. package/exports/frameworks/hono.js +0 -1
  197. package/exports/frameworks/hono.mjs +0 -1
  198. package/exports/frameworks/nestjs.js +0 -1
  199. package/exports/frameworks/nestjs.mjs +0 -1
  200. package/exports/frameworks/nextjs.js +0 -1
  201. package/exports/frameworks/nextjs.mjs +0 -1
  202. package/exports/frameworks/standalone.js +0 -1
  203. package/exports/frameworks/standalone.mjs +0 -1
  204. package/exports/frameworks/sveltekit.js +0 -1
  205. package/exports/frameworks/sveltekit.mjs +0 -1
  206. package/exports/frameworks/tanstack-start.js +0 -1
  207. package/exports/frameworks/tanstack-start.mjs +0 -1
  208. package/exports/workers.js +0 -1
  209. package/exports/workers.mjs +0 -1
  210. package/types/client.d.ts +0 -34
  211. package/types/connectors/betterstack.d.ts +0 -1
  212. package/types/connectors/otlp.d.ts +0 -1
  213. package/types/connectors/posthog.d.ts +0 -1
  214. package/types/connectors/sentry.d.ts +0 -1
  215. package/types/database.d.ts +0 -1
  216. package/types/expo.d.ts +0 -17
  217. package/types/frameworks/client.d.ts +0 -160
  218. package/types/frameworks/elysia.d.ts +0 -1
  219. package/types/frameworks/expo.d.ts +0 -50
  220. package/types/frameworks/express.d.ts +0 -1
  221. package/types/frameworks/fastify.d.ts +0 -1
  222. package/types/frameworks/hono.d.ts +0 -1
  223. package/types/frameworks/nestjs.d.ts +0 -1
  224. package/types/frameworks/nextjs.d.ts +0 -1
  225. package/types/frameworks/standalone.d.ts +0 -1
  226. package/types/frameworks/sveltekit.d.ts +0 -1
  227. package/types/frameworks/tanstack-start.d.ts +0 -1
  228. package/types/frameworks/workers.d.ts +0 -115
  229. package/types/index.d.ts +0 -1
  230. package/types/workers.d.ts +0 -13
package/dist/expo.mjs CHANGED
@@ -1,717 +1 @@
1
- import { z } from 'zod';
2
-
3
- // src/shared/client-log.ts
4
-
5
- // src/shared/log-value.ts
6
- function normalizeError(error) {
7
- const normalized = {
8
- name: error.name,
9
- message: error.message
10
- };
11
- if (error.stack) {
12
- normalized.stack = error.stack;
13
- }
14
- const errorWithCause = error;
15
- if (errorWithCause.cause !== void 0) {
16
- normalized.cause = normalizeLogValue(errorWithCause.cause);
17
- }
18
- return normalized;
19
- }
20
- function normalizeLogValue(value, seen = /* @__PURE__ */ new WeakSet()) {
21
- if (value instanceof Error) {
22
- return normalizeError(value);
23
- }
24
- if (typeof value === "function") {
25
- return `[Function: ${value.name || "anonymous"}]`;
26
- }
27
- if (typeof value === "symbol") {
28
- return value.toString();
29
- }
30
- if (value === void 0 || value === null) {
31
- return value;
32
- }
33
- if (Array.isArray(value)) {
34
- return value.map((entry) => normalizeLogValue(entry, seen));
35
- }
36
- if (typeof value === "object") {
37
- if (seen.has(value)) {
38
- return "[Circular]";
39
- }
40
- seen.add(value);
41
- const normalized = {};
42
- for (const [key, entry] of Object.entries(value)) {
43
- normalized[key] = normalizeLogValue(entry, seen);
44
- }
45
- seen.delete(value);
46
- return normalized;
47
- }
48
- return value;
49
- }
50
- function serializeLogMessage(message) {
51
- if (typeof message === "string") {
52
- return message;
53
- }
54
- if (message instanceof Error) {
55
- return message.message || message.name;
56
- }
57
- const normalized = normalizeLogValue(message);
58
- if (typeof normalized === "string") {
59
- return normalized;
60
- }
61
- try {
62
- const serialized = JSON.stringify(normalized, null, 2);
63
- return serialized ?? String(normalized);
64
- } catch {
65
- return String(normalized);
66
- }
67
- }
68
- var absoluteHttpUrlSchema = z.string().url().refine((value) => {
69
- try {
70
- const url = new URL(value);
71
- return url.protocol === "http:" || url.protocol === "https:";
72
- } catch {
73
- return false;
74
- }
75
- }, {
76
- message: "Expected an absolute http(s) URL"
77
- });
78
- var plainObjectSchema = z.custom(
79
- (value) => {
80
- return value !== null && typeof value === "object" && !Array.isArray(value);
81
- },
82
- {
83
- message: "Expected a plain object"
84
- }
85
- );
86
- var nonEmptyStringSchema = z.string().trim().min(1);
87
- function isAbsoluteHttpUrl(value) {
88
- return absoluteHttpUrlSchema.safeParse(value).success;
89
- }
90
- function isPlainObject(value) {
91
- return plainObjectSchema.safeParse(value).success;
92
- }
93
-
94
- // src/shared/client-log.ts
95
- z.union([
96
- z.literal("betterstack"),
97
- z.literal("posthog"),
98
- z.literal("sentry"),
99
- z.undefined(),
100
- z.object({
101
- type: z.literal("otlp"),
102
- name: nonEmptyStringSchema
103
- })
104
- ]);
105
- function safeGet(getter) {
106
- try {
107
- return getter();
108
- } catch {
109
- return void 0;
110
- }
111
- }
112
- function randomSegment() {
113
- return Math.random().toString(36).slice(2, 10);
114
- }
115
- function createRandomId() {
116
- const maybeCrypto = safeGet(() => globalThis.crypto);
117
- const randomUUID = maybeCrypto && typeof maybeCrypto.randomUUID === "function" ? maybeCrypto.randomUUID.bind(maybeCrypto) : void 0;
118
- if (randomUUID) {
119
- return randomUUID();
120
- }
121
- return `${Date.now().toString(36)}-${randomSegment()}`;
122
- }
123
- function normalizeClientLogLevel(level) {
124
- return level === "warn" ? "warning" : level;
125
- }
126
- function normalizeClientPayloadData(message, args) {
127
- const normalizedArgs = args.map((entry) => normalizeLogValue(entry));
128
- const messageData = message instanceof Error ? normalizeError(message) : void 0;
129
- if (messageData !== void 0 && normalizedArgs.length === 0) {
130
- return messageData;
131
- }
132
- const combined = messageData === void 0 ? normalizedArgs : [messageData, ...normalizedArgs];
133
- if (combined.length === 0) {
134
- return void 0;
135
- }
136
- if (combined.length === 1) {
137
- return combined[0];
138
- }
139
- return combined;
140
- }
141
- function normalizeMetadata(metadata) {
142
- if (metadata === void 0) {
143
- return void 0;
144
- }
145
- const resolved = typeof metadata === "function" ? safeGet(metadata) : metadata;
146
- if (!isPlainObject(resolved)) {
147
- return void 0;
148
- }
149
- return normalizeLogValue(resolved);
150
- }
151
-
152
- // src/shared/remote-delivery.ts
153
- var DEFAULT_MAX_RETRIES = 3;
154
- var DEFAULT_RETRY_DELAY_MS = 5e3;
155
- var DEFAULT_MAX_QUEUE_SIZE = 100;
156
- function clampInteger(value, fallback, minimum) {
157
- if (!Number.isFinite(value)) {
158
- return fallback;
159
- }
160
- return Math.max(minimum, Math.floor(value));
161
- }
162
- function safeCall(callback, value) {
163
- if (!callback) {
164
- return;
165
- }
166
- try {
167
- callback(value);
168
- } catch {
169
- }
170
- }
171
- function warn(message) {
172
- if (typeof console === "undefined" || typeof console.warn !== "function") {
173
- return;
174
- }
175
- console.warn(message);
176
- }
177
- function formatWarningValue(value) {
178
- return value === void 0 ? "unknown" : String(value);
179
- }
180
- function createRemoteDeliveryManager(options) {
181
- const deliveryConfig = {
182
- maxRetries: clampInteger(options.delivery?.maxRetries, DEFAULT_MAX_RETRIES, 0),
183
- retryDelayMs: clampInteger(options.delivery?.retryDelayMs, DEFAULT_RETRY_DELAY_MS, 0),
184
- maxQueueSize: clampInteger(options.delivery?.maxQueueSize, DEFAULT_MAX_QUEUE_SIZE, 1),
185
- warnOnFailure: options.delivery?.warnOnFailure ?? true,
186
- onSuccess: options.delivery?.onSuccess,
187
- onRetry: options.delivery?.onRetry,
188
- onFailure: options.delivery?.onFailure,
189
- onDrop: options.delivery?.onDrop
190
- };
191
- const queue = [];
192
- let inFlight;
193
- let flushTimer;
194
- let isProcessing = false;
195
- let unsubscribeFromResume;
196
- const runtimeLabel = options.runtime === "browser" ? "client" : options.runtime;
197
- const clearFlushTimer = () => {
198
- if (!flushTimer) {
199
- return;
200
- }
201
- clearTimeout(flushTimer);
202
- flushTimer = void 0;
203
- };
204
- const hasUnsentEvents = () => queue.length > 0 || inFlight !== void 0;
205
- const refreshResumeSubscription = (flush2) => {
206
- if (!options.subscribeToResume) {
207
- return;
208
- }
209
- if (hasUnsentEvents()) {
210
- if (!unsubscribeFromResume) {
211
- unsubscribeFromResume = options.subscribeToResume(() => {
212
- const now = Date.now();
213
- for (const item of queue) {
214
- item.nextAttemptAt = now;
215
- }
216
- clearFlushTimer();
217
- flush2();
218
- }) ?? void 0;
219
- }
220
- return;
221
- }
222
- if (unsubscribeFromResume) {
223
- unsubscribeFromResume();
224
- unsubscribeFromResume = void 0;
225
- }
226
- };
227
- const warnDrop = (ctx) => {
228
- if (!deliveryConfig.warnOnFailure) {
229
- return;
230
- }
231
- warn(
232
- `[blyp/${runtimeLabel}] Dropped queued log "${ctx.droppedEvent.message}" (id: ${ctx.droppedEvent.id}) because the delivery queue reached ${ctx.maxQueueSize}. Keeping "${ctx.replacementEvent.message}" (id: ${ctx.replacementEvent.id}) instead.`
233
- );
234
- };
235
- const warnFailure = (ctx, suppressWarning) => {
236
- if (!deliveryConfig.warnOnFailure || suppressWarning) {
237
- return;
238
- }
239
- const details = [
240
- `reason=${ctx.reason}`,
241
- `attempt=${formatWarningValue(ctx.attempt)}`,
242
- `status=${formatWarningValue(ctx.status)}`
243
- ];
244
- if (ctx.error) {
245
- details.push(`error=${ctx.error}`);
246
- }
247
- warn(
248
- `[blyp/${runtimeLabel}] Failed to deliver log "${ctx.event.message}" (id: ${ctx.event.id}, ${details.join(", ")})`
249
- );
250
- };
251
- const totalUnsentEvents = () => queue.length + (inFlight ? 1 : 0);
252
- const scheduleFlush = (flush2) => {
253
- clearFlushTimer();
254
- if (queue.length === 0) {
255
- refreshResumeSubscription(flush2);
256
- return;
257
- }
258
- const nextAttemptAt = queue.reduce((lowest, item) => {
259
- return Math.min(lowest, item.nextAttemptAt);
260
- }, Number.POSITIVE_INFINITY);
261
- const delay = Math.max(nextAttemptAt - Date.now(), 0);
262
- flushTimer = setTimeout(() => {
263
- flushTimer = void 0;
264
- flush2();
265
- }, delay);
266
- refreshResumeSubscription(flush2);
267
- };
268
- const emitDrop = (droppedEvent, replacementEvent) => {
269
- const context = {
270
- runtime: options.runtime,
271
- droppedEvent,
272
- replacementEvent,
273
- maxQueueSize: deliveryConfig.maxQueueSize,
274
- reason: "queue_overflow"
275
- };
276
- safeCall(deliveryConfig.onDrop, context);
277
- warnDrop(context);
278
- };
279
- const enforceQueueCapacity = () => {
280
- while (totalUnsentEvents() > deliveryConfig.maxQueueSize && queue.length > 0) {
281
- const droppedItem = queue.shift();
282
- const replacementEvent = queue[queue.length - 1]?.event ?? inFlight?.event;
283
- if (!droppedItem || !replacementEvent) {
284
- break;
285
- }
286
- emitDrop(droppedItem.event, replacementEvent);
287
- }
288
- };
289
- const getNextReadyIndex = () => {
290
- const now = Date.now();
291
- for (let index = 0; index < queue.length; index += 1) {
292
- if (queue[index].nextAttemptAt <= now) {
293
- return index;
294
- }
295
- }
296
- return -1;
297
- };
298
- const flush = async () => {
299
- if (isProcessing) {
300
- return;
301
- }
302
- isProcessing = true;
303
- try {
304
- while (true) {
305
- const nextIndex = getNextReadyIndex();
306
- if (nextIndex === -1) {
307
- break;
308
- }
309
- const item = queue.splice(nextIndex, 1)[0];
310
- if (!item) {
311
- continue;
312
- }
313
- inFlight = item;
314
- refreshResumeSubscription(() => {
315
- void flush();
316
- });
317
- item.attempt += 1;
318
- const result = await options.send(item.event);
319
- inFlight = void 0;
320
- if (result.outcome === "success") {
321
- const context = {
322
- runtime: options.runtime,
323
- event: item.event,
324
- attempt: item.attempt,
325
- status: result.status,
326
- transport: result.transport
327
- };
328
- safeCall(deliveryConfig.onSuccess, context);
329
- continue;
330
- }
331
- if (result.outcome === "retry" && item.attempt <= deliveryConfig.maxRetries) {
332
- item.nextAttemptAt = Date.now() + deliveryConfig.retryDelayMs;
333
- queue.push(item);
334
- const context = {
335
- runtime: options.runtime,
336
- event: item.event,
337
- attempt: item.attempt,
338
- retriesRemaining: deliveryConfig.maxRetries - (item.attempt - 1),
339
- nextRetryAt: new Date(item.nextAttemptAt).toISOString(),
340
- reason: result.reason,
341
- status: result.status,
342
- error: result.error
343
- };
344
- safeCall(deliveryConfig.onRetry, context);
345
- continue;
346
- }
347
- const failureContext = {
348
- runtime: options.runtime,
349
- event: item.event,
350
- attempt: item.attempt,
351
- reason: result.reason,
352
- status: result.status,
353
- error: result.error
354
- };
355
- safeCall(deliveryConfig.onFailure, failureContext);
356
- warnFailure(
357
- failureContext,
358
- result.outcome === "failure" ? result.suppressWarning : void 0
359
- );
360
- }
361
- } finally {
362
- isProcessing = false;
363
- scheduleFlush(() => {
364
- void flush();
365
- });
366
- }
367
- };
368
- return {
369
- enqueue(event) {
370
- queue.push({
371
- event,
372
- attempt: 0,
373
- nextAttemptAt: Date.now()
374
- });
375
- enforceQueueCapacity();
376
- scheduleFlush(() => {
377
- void flush();
378
- });
379
- void flush();
380
- }
381
- };
382
- }
383
-
384
- // src/shared/once.ts
385
- function createConsoleOnceLogger(method, warnedKeys = /* @__PURE__ */ new Set()) {
386
- return (key, message, error) => {
387
- if (warnedKeys.has(key) || typeof console === "undefined") {
388
- return;
389
- }
390
- const writer = console[method];
391
- if (typeof writer !== "function") {
392
- return;
393
- }
394
- warnedKeys.add(key);
395
- if (error === void 0) {
396
- writer.call(console, message);
397
- return;
398
- }
399
- writer.call(console, message, error);
400
- };
401
- }
402
- function createWarnOnceLogger(warnedKeys) {
403
- return createConsoleOnceLogger("warn", warnedKeys);
404
- }
405
- function createErrorOnceLogger(warnedKeys) {
406
- return createConsoleOnceLogger("error", warnedKeys);
407
- }
408
-
409
- // src/frameworks/expo/network.ts
410
- var expoNetworkLoader = async () => {
411
- try {
412
- const module = await import('expo-network');
413
- if (typeof module.getNetworkStateAsync !== "function") {
414
- return null;
415
- }
416
- return module;
417
- } catch {
418
- return null;
419
- }
420
- };
421
- var expoNetworkModulePromise;
422
- var lastKnownExpoNetworkState;
423
- function normalizeNetworkState(state) {
424
- if (!state) {
425
- return void 0;
426
- }
427
- return {
428
- type: typeof state.type === "string" ? state.type : void 0,
429
- isConnected: typeof state.isConnected === "boolean" ? state.isConnected : void 0,
430
- isInternetReachable: typeof state.isInternetReachable === "boolean" ? state.isInternetReachable : void 0
431
- };
432
- }
433
- function loadExpoNetworkModule() {
434
- if (!expoNetworkModulePromise) {
435
- expoNetworkModulePromise = expoNetworkLoader();
436
- }
437
- return expoNetworkModulePromise;
438
- }
439
- async function getExpoNetworkSnapshot() {
440
- const module = await loadExpoNetworkModule();
441
- if (!module) {
442
- return void 0;
443
- }
444
- try {
445
- const state = normalizeNetworkState(await module.getNetworkStateAsync());
446
- lastKnownExpoNetworkState = state;
447
- return state;
448
- } catch {
449
- return lastKnownExpoNetworkState;
450
- }
451
- }
452
- function subscribeToExpoNetworkState(listener) {
453
- let isActive = true;
454
- let subscription;
455
- void loadExpoNetworkModule().then((module) => {
456
- if (!isActive || !module || typeof module.addNetworkStateListener !== "function") {
457
- return;
458
- }
459
- subscription = module.addNetworkStateListener((event) => {
460
- const state = normalizeNetworkState(event);
461
- lastKnownExpoNetworkState = state;
462
- listener(state);
463
- });
464
- });
465
- return () => {
466
- isActive = false;
467
- subscription?.remove();
468
- };
469
- }
470
-
471
- // src/frameworks/expo/logger.ts
472
- var expoSessionId = createRandomId();
473
- var warnedMessages = /* @__PURE__ */ new Set();
474
- var warnOnce = createWarnOnceLogger(warnedMessages);
475
- var errorOnce = createErrorOnceLogger(warnedMessages);
476
- function isRetryableStatus(status) {
477
- return status === 429 || status >= 500;
478
- }
479
- function resolveHeaders(headers) {
480
- return {
481
- "content-type": "application/json",
482
- ...headers ?? {}
483
- };
484
- }
485
- function emitLocalConsole(level, message, args) {
486
- if (typeof console === "undefined") {
487
- return;
488
- }
489
- const normalizedArgs = args.map((entry) => normalizeLogValue(entry));
490
- const text = serializeLogMessage(message);
491
- switch (level) {
492
- case "table":
493
- console.log(text);
494
- if (normalizedArgs.length > 0 && typeof console.table === "function") {
495
- console.table(normalizedArgs[0]);
496
- }
497
- return;
498
- case "warning":
499
- case "warn":
500
- console.warn(text, ...normalizedArgs);
501
- return;
502
- case "error":
503
- case "critical":
504
- console.error(text, ...normalizedArgs);
505
- return;
506
- case "debug":
507
- console.debug(text, ...normalizedArgs);
508
- return;
509
- case "success":
510
- console.log(text, ...normalizedArgs);
511
- return;
512
- case "info":
513
- default:
514
- console.info(text, ...normalizedArgs);
515
- }
516
- }
517
- async function sendRemoteLog(config, event) {
518
- if (!isAbsoluteHttpUrl(config.endpoint)) {
519
- warnOnce(
520
- "invalid-endpoint",
521
- "[blyp/expo] `endpoint` must be an absolute http(s) URL. Remote sync skipped."
522
- );
523
- return {
524
- outcome: "failure",
525
- reason: "invalid_endpoint",
526
- suppressWarning: true
527
- };
528
- }
529
- const expoNetworkModule = await loadExpoNetworkModule();
530
- if (!expoNetworkModule) {
531
- warnOnce(
532
- "missing-expo-network",
533
- "[blyp/expo] Install `expo-network` to enable remote sync in Expo."
534
- );
535
- return {
536
- outcome: "failure",
537
- reason: "missing_transport",
538
- suppressWarning: true
539
- };
540
- }
541
- if (typeof fetch !== "function") {
542
- return {
543
- outcome: "failure",
544
- reason: "missing_transport"
545
- };
546
- }
547
- const network = await getExpoNetworkSnapshot();
548
- if (network?.isConnected === false || network?.isInternetReachable === false) {
549
- return {
550
- outcome: "retry",
551
- reason: "offline"
552
- };
553
- }
554
- const payload = {
555
- ...event,
556
- device: {
557
- runtime: "expo",
558
- network
559
- }
560
- };
561
- try {
562
- const response = await fetch(config.endpoint, {
563
- method: "POST",
564
- headers: resolveHeaders(config.headers),
565
- body: JSON.stringify(payload)
566
- });
567
- if (response.ok) {
568
- if (config.connector === "betterstack" && response.headers.get("x-blyp-betterstack-status") === "missing") {
569
- errorOnce(
570
- "missing-betterstack-server-config",
571
- "[blyp/expo] Better Stack connector requested but not configured on the server. Continuing without Better Stack forwarding."
572
- );
573
- }
574
- if (config.connector === "posthog" && response.headers.get("x-blyp-posthog-status") === "missing") {
575
- errorOnce(
576
- "missing-posthog-server-config",
577
- "[blyp/expo] PostHog connector requested but not configured on the server. Continuing without PostHog forwarding."
578
- );
579
- }
580
- if (config.connector === "sentry" && response.headers.get("x-blyp-sentry-status") === "missing") {
581
- errorOnce(
582
- "missing-sentry-server-config",
583
- "[blyp/expo] Sentry not setup. Continuing without Sentry forwarding."
584
- );
585
- }
586
- if (config.connector && typeof config.connector === "object" && config.connector.type === "otlp" && response.headers.get("x-blyp-otlp-status") === "missing") {
587
- errorOnce(
588
- `missing-otlp-server-config:${config.connector.name}`,
589
- `[blyp/expo] OTLP target "${config.connector.name}" was requested but not configured on the server. Continuing without OTLP forwarding.`
590
- );
591
- }
592
- return {
593
- outcome: "success",
594
- transport: "fetch",
595
- status: response.status
596
- };
597
- }
598
- if (isRetryableStatus(response.status)) {
599
- return {
600
- outcome: "retry",
601
- reason: "response_status",
602
- status: response.status
603
- };
604
- }
605
- return {
606
- outcome: "failure",
607
- reason: "response_status",
608
- status: response.status
609
- };
610
- } catch (error) {
611
- return {
612
- outcome: "retry",
613
- reason: "network_error",
614
- error: error instanceof Error ? error.message : String(error)
615
- };
616
- }
617
- }
618
- function buildExpoLogger(config, state) {
619
- const resolvedConfig = {
620
- endpoint: config?.endpoint,
621
- headers: config?.headers,
622
- localConsole: config?.localConsole ?? true,
623
- remoteSync: config?.remoteSync ?? true,
624
- connector: config?.connector,
625
- metadata: config?.metadata
626
- };
627
- const delivery = state.delivery ?? (resolvedConfig.remoteSync ? createRemoteDeliveryManager({
628
- runtime: "expo",
629
- delivery: config?.delivery,
630
- send: (event) => sendRemoteLog(resolvedConfig, event),
631
- subscribeToResume: (resume) => {
632
- return subscribeToExpoNetworkState((network) => {
633
- if (network?.isConnected === false || network?.isInternetReachable === false) {
634
- return;
635
- }
636
- resume();
637
- });
638
- }
639
- }) : void 0);
640
- const writeLog = (level, message, args) => {
641
- if (resolvedConfig.localConsole) {
642
- emitLocalConsole(level, message, args);
643
- }
644
- if (!resolvedConfig.remoteSync) {
645
- return;
646
- }
647
- const payload = {
648
- type: "client_log",
649
- source: "client",
650
- id: createRandomId(),
651
- level: normalizeClientLogLevel(level),
652
- message: serializeLogMessage(message),
653
- connector: resolvedConfig.connector,
654
- data: normalizeClientPayloadData(message, args),
655
- bindings: Object.keys(state.bindings).length > 0 ? normalizeLogValue(state.bindings) : void 0,
656
- clientTimestamp: (/* @__PURE__ */ new Date()).toISOString(),
657
- page: {},
658
- browser: {},
659
- device: {
660
- runtime: "expo"
661
- },
662
- session: {
663
- pageId: state.pageId,
664
- sessionId: state.sessionId
665
- },
666
- metadata: normalizeMetadata(resolvedConfig.metadata)
667
- };
668
- delivery?.enqueue(payload);
669
- };
670
- return {
671
- debug: (message, ...args) => {
672
- writeLog("debug", message, args);
673
- },
674
- info: (message, ...args) => {
675
- writeLog("info", message, args);
676
- },
677
- error: (message, ...args) => {
678
- writeLog("error", message, args);
679
- },
680
- warn: (message, ...args) => {
681
- writeLog("warn", message, args);
682
- },
683
- warning: (message, ...args) => {
684
- writeLog("warning", message, args);
685
- },
686
- success: (message, ...args) => {
687
- writeLog("success", message, args);
688
- },
689
- critical: (message, ...args) => {
690
- writeLog("critical", message, args);
691
- },
692
- table: (message, data) => {
693
- writeLog("table", message, data === void 0 ? [] : [data]);
694
- },
695
- child: (bindings) => {
696
- return buildExpoLogger(config, {
697
- ...state,
698
- bindings: {
699
- ...state.bindings,
700
- ...bindings
701
- },
702
- delivery
703
- });
704
- }
705
- };
706
- }
707
- function createExpoLogger(config) {
708
- return buildExpoLogger(config, {
709
- pageId: createRandomId(),
710
- sessionId: expoSessionId,
711
- bindings: {}
712
- });
713
- }
714
-
715
- export { createExpoLogger };
716
- //# sourceMappingURL=expo.mjs.map
717
- //# sourceMappingURL=expo.mjs.map
1
+ import {z as z$1}from'zod';function E(e){let t={name:e.name,message:e.message};e.stack&&(t.stack=e.stack);let o=e;return o.cause!==void 0&&(t.cause=l(o.cause)),t}function l(e,t=new WeakSet){if(e instanceof Error)return E(e);if(typeof e=="function")return `[Function: ${e.name||"anonymous"}]`;if(typeof e=="symbol")return e.toString();if(e==null)return e;if(Array.isArray(e))return e.map(o=>l(o,t));if(typeof e=="object"){if(t.has(e))return "[Circular]";t.add(e);let o={};for(let[r,i]of Object.entries(e))o[r]=l(i,t);return t.delete(e),o}return e}function m(e){if(typeof e=="string")return e;if(e instanceof Error)return e.message||e.name;let t=l(e);if(typeof t=="string")return t;try{return JSON.stringify(t,null,2)??String(t)}catch{return String(t)}}var le=z$1.string().url().refine(e=>{try{let t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return false}},{message:"Expected an absolute http(s) URL"}),N=z$1.custom(e=>e!==null&&typeof e=="object"&&!Array.isArray(e),{message:"Expected a plain object"}),O=z$1.string().trim().min(1);function I(e){return le.safeParse(e).success}function F(e){return N.safeParse(e).success}z$1.union([z$1.literal("betterstack"),z$1.literal("databuddy"),z$1.literal("posthog"),z$1.literal("sentry"),z$1.undefined(),z$1.object({type:z$1.literal("otlp"),name:O})]);function M(e){try{return e()}catch{return}}function de(){return Math.random().toString(36).slice(2,10)}function v(){let e=M(()=>globalThis.crypto),t=e&&typeof e.randomUUID=="function"?e.randomUUID.bind(e):void 0;return t?t():`${Date.now().toString(36)}-${de()}`}function U(e){return e==="warn"?"warning":e}function q(e,t){let o=t.map(n=>l(n)),r=e instanceof Error?E(e):void 0;if(r!==void 0&&o.length===0)return r;let i=r===void 0?o:[r,...o];if(i.length!==0)return i.length===1?i[0]:i}function $(e){if(e===void 0)return;let t=typeof e=="function"?M(e):e;if(F(t))return l(t)}function D(e,t,o){return Number.isFinite(e)?Math.max(o,Math.floor(e)):t}function b(e,t){if(e)try{e(t);}catch{}}function j(e){typeof console>"u"||typeof console.warn!="function"||console.warn(e);}function H(e){return e===void 0?"unknown":String(e)}function Q(e){let t={maxRetries:D(e.delivery?.maxRetries,3,0),retryDelayMs:D(e.delivery?.retryDelayMs,5e3,0),maxQueueSize:D(e.delivery?.maxQueueSize,100,1),warnOnFailure:e.delivery?.warnOnFailure??true,onSuccess:e.delivery?.onSuccess,onRetry:e.delivery?.onRetry,onFailure:e.delivery?.onFailure,onDrop:e.delivery?.onDrop},o=[],r,i,n=false,s,d=e.runtime==="browser"?"client":e.runtime,w=()=>{i&&(clearTimeout(i),i=void 0);},oe=()=>o.length>0||r!==void 0,h=a=>{if(e.subscribeToResume){if(oe()){s||(s=e.subscribeToResume(()=>{let u=Date.now();for(let c of o)c.nextAttemptAt=u;w(),a();})??void 0);return}s&&(s(),s=void 0);}},re=a=>{t.warnOnFailure&&j(`[blyp/${d}] Dropped queued log "${a.droppedEvent.message}" (id: ${a.droppedEvent.id}) because the delivery queue reached ${a.maxQueueSize}. Keeping "${a.replacementEvent.message}" (id: ${a.replacementEvent.id}) instead.`);},ie=(a,u)=>{if(!t.warnOnFailure||u)return;let c=[`reason=${a.reason}`,`attempt=${H(a.attempt)}`,`status=${H(a.status)}`];a.error&&c.push(`error=${a.error}`),j(`[blyp/${d}] Failed to deliver log "${a.event.message}" (id: ${a.event.id}, ${c.join(", ")})`);},se=()=>o.length+(r?1:0),P=a=>{if(w(),o.length===0){h(a);return}let u=o.reduce((x,y)=>Math.min(x,y.nextAttemptAt),Number.POSITIVE_INFINITY),c=Math.max(u-Date.now(),0);i=setTimeout(()=>{i=void 0,a();},c),h(a);},ae=(a,u)=>{let c={runtime:e.runtime,droppedEvent:a,replacementEvent:u,maxQueueSize:t.maxQueueSize,reason:"queue_overflow"};b(t.onDrop,c),re(c);},ue=()=>{for(;se()>t.maxQueueSize&&o.length>0;){let a=o.shift(),u=o[o.length-1]?.event??r?.event;if(!a||!u)break;ae(a.event,u);}},ce=()=>{let a=Date.now();for(let u=0;u<o.length;u+=1)if(o[u].nextAttemptAt<=a)return u;return -1},C=async()=>{if(!n){n=true;try{for(;;){let a=ce();if(a===-1)break;let u=o.splice(a,1)[0];if(!u)continue;r=u,h(()=>{C();}),u.attempt+=1;let c=await e.send(u.event);if(r=void 0,c.outcome==="success"){let y={runtime:e.runtime,event:u.event,attempt:u.attempt,status:c.status,transport:c.transport};b(t.onSuccess,y);continue}if(c.outcome==="retry"&&u.attempt<=t.maxRetries){u.nextAttemptAt=Date.now()+t.retryDelayMs,o.push(u);let y={runtime:e.runtime,event:u.event,attempt:u.attempt,retriesRemaining:t.maxRetries-(u.attempt-1),nextRetryAt:new Date(u.nextAttemptAt).toISOString(),reason:c.reason,status:c.status,error:c.error};b(t.onRetry,y);continue}let x={runtime:e.runtime,event:u.event,attempt:u.attempt,reason:c.reason,status:c.status,error:c.error};b(t.onFailure,x),ie(x,c.outcome==="failure"?c.suppressWarning:void 0);}}finally{n=false,P(()=>{C();});}}};return {enqueue(a){o.push({event:a,attempt:0,nextAttemptAt:Date.now()}),ue(),P(()=>{C();}),C();}}}var fe="[REDACTED]",ge=["password","passwd","pwd","secret","token","api_key","apikey","api_secret","authorization","auth","x-api-key","private_key","privatekey","access_token","refresh_token","client_secret","session","cookie","set-cookie","ssn","credit_card","card_number","cvv","cvc","otp","pin"];var pe=[{type:"bearer",pattern:/\bBearer\s+(?:sk-[A-Za-z0-9]{20,}|pk_(?:live|test)_[A-Za-z0-9]{16,}|eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+|[A-Za-z0-9._~+/-]{20,})\b/g},{type:"jwt",pattern:/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{type:"api_key",pattern:/\b(?:sk-[A-Za-z0-9]{20,}|pk_(?:live|test)_[A-Za-z0-9]{16,})\b/g}],me=/\b(?:\d[ -]*?){16}\b/g;function Z(e){let t=new Set,o=[];for(let r of e)typeof r!="string"||r.length===0||t.has(r)||(t.add(r),o.push(r));return o}function ye(e){let t=e.flags.includes("g")?e.flags:`${e.flags}g`;return new RegExp(e.source,t)}function Re(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function we(e){return new Set(e.keys.map(t=>t.toLowerCase()))}function Ce(e){return e.split(".").filter(Boolean)}function A(e,t,o=0,r=0){if(o===e.length)return r===t.length;let i=e[o];if(i==="**"){if(o===e.length-1)return true;for(let n=r;n<=t.length;n+=1)if(A(e,t,o+1,n))return true;return false}return r>=t.length||i!=="*"&&i!==t[r]?false:A(e,t,o+1,r+1)}function xe(e,t){return e.length===0||t.paths.length===0?false:t.paths.some(o=>A(Ce(o),e))}function ve(e){let t=e.replace(/\D/g,"");if(t.length!==16)return false;let o=0,r=false;for(let i=t.length-1;i>=0;i-=1){let n=Number(t[i]);r&&(n*=2,n>9&&(n-=9)),o+=n,r=!r;}return o%10===0}function V(e,t,o){if(o||t.disablePatternScanning)return e;let r=e;for(let{type:i,pattern:n}of pe)r=r.replace(n,`[REDACTED:${i}]`);r=r.replace(me,i=>ve(i)?"[REDACTED:card]":i);for(let i of t.patterns)r=r.replace(ye(i),"[REDACTED:pattern]");return r}function k(e,t,o,r){if(typeof e=="string")return V(e,t,!!r.skipPatternScanning);if(e==null||typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map((n,s)=>k(n,t,o,{path:[...r.path,String(s)],skipPatternScanning:r.skipPatternScanning}));if(!Re(e))return e;let i={};for(let[n,s]of Object.entries(e)){let d=[...r.path,n];if(o.has(n.toLowerCase())||xe(d,t)){if(s==null||typeof s=="string"||typeof s=="number"||typeof s=="boolean"){i[n]=fe;continue}i[n]=k(s,t,o,{path:d,skipPatternScanning:r.skipPatternScanning});continue}i[n]=k(s,t,o,{path:d,skipPatternScanning:r.skipPatternScanning});}return i}function B(e,t){return {keys:Z([...ge,...[],...[]]),paths:Z([...[],...[]]),patterns:[...[],...[]].filter(o=>o instanceof RegExp),disablePatternScanning:false}}function g(e,t,o={path:[]}){let r=l(e);return k(r,t,we(t),o)}function T(e,t){return typeof e=="string"?V(e,t,false):m(g(e,t))}function W(e,t=new Set){return (o,r,i)=>{if(t.has(o)||typeof console>"u")return;let n=console[e];if(typeof n=="function"){if(t.add(o),i===void 0){n.call(console,r);return}n.call(console,r,i);}}}function Y(e){return W("warn",e)}function G(e){return W("error",e)}var be=async()=>{try{let e=await import('expo-network');return typeof e.getNetworkStateAsync!="function"?null:e}catch{return null}},z,_;function J(e){if(e)return {type:typeof e.type=="string"?e.type:void 0,isConnected:typeof e.isConnected=="boolean"?e.isConnected:void 0,isInternetReachable:typeof e.isInternetReachable=="boolean"?e.isInternetReachable:void 0}}function L(){return z||(z=be()),z}async function K(){let e=await L();if(e)try{let t=J(await e.getNetworkStateAsync());return _=t,t}catch{return _}}function X(e){let t=true,o;return L().then(r=>{!t||!r||typeof r.addNetworkStateListener!="function"||(o=r.addNetworkStateListener(i=>{let n=J(i);_=n,e(n);}));}),()=>{t=false,o?.remove();}}var ke=v(),te=new Set,ee=Y(te),R=G(te),p=B();function Le(e){return e===429||e>=500}function he(e){return {"content-type":"application/json",...e??{}}}function Ee(e,t,o){if(typeof console>"u")return;let r=o.map(s=>l(s)),i=r.map(s=>g(s,p)),n=T(m(t),p);switch(e){case "table":console.log(n),r.length>0&&typeof console.table=="function"&&console.table(i[0]);return;case "warning":case "warn":console.warn(n,...i);return;case "error":case "critical":console.error(n,...i);return;case "debug":console.debug(n,...i);return;case "success":console.log(n,...i);return;default:console.info(n,...i);}}async function Se(e,t){if(!I(e.endpoint))return ee("invalid-endpoint","[blyp/expo] `endpoint` must be an absolute http(s) URL. Remote sync skipped."),{outcome:"failure",reason:"invalid_endpoint",suppressWarning:true};if(!await L())return ee("missing-expo-network","[blyp/expo] Install `expo-network` to enable remote sync in Expo."),{outcome:"failure",reason:"missing_transport",suppressWarning:true};if(typeof fetch!="function")return {outcome:"failure",reason:"missing_transport"};let r=await K();if(r?.isConnected===false||r?.isInternetReachable===false)return {outcome:"retry",reason:"offline"};let i={...t,device:{runtime:"expo",network:r}};try{let n=await fetch(e.endpoint,{method:"POST",headers:he(e.headers),body:JSON.stringify(g(i,p))});return n.ok?(e.connector==="betterstack"&&n.headers.get("x-blyp-betterstack-status")==="missing"&&R("missing-betterstack-server-config","[blyp/expo] Better Stack connector requested but not configured on the server. Continuing without Better Stack forwarding."),e.connector==="databuddy"&&n.headers.get("x-blyp-databuddy-status")==="missing"&&R("missing-databuddy-server-config","[blyp/expo] Databuddy connector requested but not configured on the server. Continuing without Databuddy forwarding."),e.connector==="posthog"&&n.headers.get("x-blyp-posthog-status")==="missing"&&R("missing-posthog-server-config","[blyp/expo] PostHog connector requested but not configured on the server. Continuing without PostHog forwarding."),e.connector==="sentry"&&n.headers.get("x-blyp-sentry-status")==="missing"&&R("missing-sentry-server-config","[blyp/expo] Sentry not setup. Continuing without Sentry forwarding."),e.connector&&typeof e.connector=="object"&&e.connector.type==="otlp"&&n.headers.get("x-blyp-otlp-status")==="missing"&&R(`missing-otlp-server-config:${e.connector.name}`,`[blyp/expo] OTLP target "${e.connector.name}" was requested but not configured on the server. Continuing without OTLP forwarding.`),{outcome:"success",transport:"fetch",status:n.status}):Le(n.status)?{outcome:"retry",reason:"response_status",status:n.status}:{outcome:"failure",reason:"response_status",status:n.status}}catch(n){return {outcome:"retry",reason:"network_error",error:n instanceof Error?n.message:String(n)}}}function ne(e,t){let o={endpoint:e?.endpoint,headers:e?.headers,localConsole:e?.localConsole??true,remoteSync:e?.remoteSync??true,connector:e?.connector,metadata:e?.metadata},r=t.delivery??(o.remoteSync?Q({runtime:"expo",delivery:e?.delivery,send:n=>Se(o,n),subscribeToResume:n=>X(s=>{s?.isConnected===false||s?.isInternetReachable===false||n();})}):void 0),i=(n,s,d)=>{if(o.localConsole&&Ee(n,s,d),!o.remoteSync)return;let w={type:"client_log",source:"client",id:v(),level:U(n),message:T(m(s),p),connector:o.connector,data:g(q(s,d),p),bindings:Object.keys(t.bindings).length>0?g(t.bindings,p):void 0,clientTimestamp:new Date().toISOString(),page:{},browser:{},device:{runtime:"expo"},session:{pageId:t.pageId,sessionId:t.sessionId},metadata:g($(o.metadata),p)};r?.enqueue(g(w,p));};return {debug:(n,...s)=>{i("debug",n,s);},info:(n,...s)=>{i("info",n,s);},error:(n,...s)=>{i("error",n,s);},warn:(n,...s)=>{i("warn",n,s);},warning:(n,...s)=>{i("warning",n,s);},success:(n,...s)=>{i("success",n,s);},critical:(n,...s)=>{i("critical",n,s);},table:(n,s)=>{i("table",n,s===void 0?[]:[s]);},child:n=>ne(e,{...t,bindings:{...t.bindings,...n},delivery:r})}}function De(e){return ne(e,{pageId:v(),sessionId:ke,bindings:{}})}export{De as createExpoLogger};