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