@lessonkit/core 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -279,6 +279,11 @@ function invokeTrackingSink(sink, event) {
279
279
  function createTrackingClient(opts) {
280
280
  const sink = opts?.sink;
281
281
  const batchSink = opts?.batchSink;
282
+ if (batchSink != null && opts?.batch?.enabled === false) {
283
+ throw new Error(
284
+ "[lessonkit] tracking.batchSink cannot be used with batch.enabled: false; omit batch.enabled or set it to true"
285
+ );
286
+ }
282
287
  const batchEnabled = opts?.batch?.enabled ?? Boolean(batchSink);
283
288
  const flushIntervalMs = opts?.batch?.flushIntervalMs ?? 5e3;
284
289
  const maxBatchSize = opts?.batch?.maxBatchSize ?? 25;
@@ -350,7 +355,7 @@ function createTrackingClient(opts) {
350
355
  if (disposed || disposing) return;
351
356
  if (buffer.length >= maxBufferSize) {
352
357
  buffer.shift();
353
- if (!warnedBufferCap && typeof process !== "undefined" && process.env?.NODE_ENV === "development") {
358
+ if (!warnedBufferCap && isDevEnvironment()) {
354
359
  warnedBufferCap = true;
355
360
  console.warn(
356
361
  `[lessonkit] telemetry batch buffer capped at ${maxBufferSize} events; oldest events are dropped while the sink is unavailable.`
@@ -539,7 +544,8 @@ function createMemoryBackedSessionStorage(session) {
539
544
  const warnPersistFailure = () => {
540
545
  if (warnedPersistFailure) return;
541
546
  warnedPersistFailure = true;
542
- if (typeof process !== "undefined" && process.env?.NODE_ENV === "development") {
547
+ const g = globalThis;
548
+ if (typeof g.process !== "undefined" && g.process.env?.NODE_ENV === "development") {
543
549
  console.warn(
544
550
  "[lessonkit] sessionStorage is unavailable or failed; using in-memory session dedupe for this tab (may reset on full reload)."
545
551
  );
@@ -580,23 +586,37 @@ function createMemoryBackedSessionStorage(session) {
580
586
  function resetStoragePortForTests(storage) {
581
587
  storage.resetForTests?.();
582
588
  }
589
+ function createInMemorySessionStoragePort() {
590
+ const memory = /* @__PURE__ */ new Map();
591
+ return {
592
+ getItem: (key) => memory.get(key) ?? null,
593
+ setItem: (key, value) => {
594
+ memory.set(key, value);
595
+ },
596
+ removeItem: (key) => {
597
+ memory.delete(key);
598
+ },
599
+ resetForTests: () => {
600
+ memory.clear();
601
+ }
602
+ };
603
+ }
604
+ function resolveBrowserSessionStorage() {
605
+ try {
606
+ if (typeof sessionStorage === "undefined" || sessionStorage == null) {
607
+ return null;
608
+ }
609
+ return sessionStorage;
610
+ } catch {
611
+ return null;
612
+ }
613
+ }
583
614
  function createSessionStoragePort() {
584
- if (typeof sessionStorage === "undefined") {
585
- const memory = /* @__PURE__ */ new Map();
586
- return {
587
- getItem: (key) => memory.get(key) ?? null,
588
- setItem: (key, value) => {
589
- memory.set(key, value);
590
- },
591
- removeItem: (key) => {
592
- memory.delete(key);
593
- },
594
- resetForTests: () => {
595
- memory.clear();
596
- }
597
- };
615
+ const session = resolveBrowserSessionStorage();
616
+ if (!session) {
617
+ return createInMemorySessionStoragePort();
598
618
  }
599
- return createMemoryBackedSessionStorage(sessionStorage);
619
+ return createMemoryBackedSessionStorage(session);
600
620
  }
601
621
  function createGlobalTimer() {
602
622
  return {
package/dist/index.js CHANGED
@@ -206,6 +206,11 @@ function invokeTrackingSink(sink, event) {
206
206
  function createTrackingClient(opts) {
207
207
  const sink = opts?.sink;
208
208
  const batchSink = opts?.batchSink;
209
+ if (batchSink != null && opts?.batch?.enabled === false) {
210
+ throw new Error(
211
+ "[lessonkit] tracking.batchSink cannot be used with batch.enabled: false; omit batch.enabled or set it to true"
212
+ );
213
+ }
209
214
  const batchEnabled = opts?.batch?.enabled ?? Boolean(batchSink);
210
215
  const flushIntervalMs = opts?.batch?.flushIntervalMs ?? 5e3;
211
216
  const maxBatchSize = opts?.batch?.maxBatchSize ?? 25;
@@ -277,7 +282,7 @@ function createTrackingClient(opts) {
277
282
  if (disposed || disposing) return;
278
283
  if (buffer.length >= maxBufferSize) {
279
284
  buffer.shift();
280
- if (!warnedBufferCap && typeof process !== "undefined" && process.env?.NODE_ENV === "development") {
285
+ if (!warnedBufferCap && isDevEnvironment()) {
281
286
  warnedBufferCap = true;
282
287
  console.warn(
283
288
  `[lessonkit] telemetry batch buffer capped at ${maxBufferSize} events; oldest events are dropped while the sink is unavailable.`
@@ -466,7 +471,8 @@ function createMemoryBackedSessionStorage(session) {
466
471
  const warnPersistFailure = () => {
467
472
  if (warnedPersistFailure) return;
468
473
  warnedPersistFailure = true;
469
- if (typeof process !== "undefined" && process.env?.NODE_ENV === "development") {
474
+ const g = globalThis;
475
+ if (typeof g.process !== "undefined" && g.process.env?.NODE_ENV === "development") {
470
476
  console.warn(
471
477
  "[lessonkit] sessionStorage is unavailable or failed; using in-memory session dedupe for this tab (may reset on full reload)."
472
478
  );
@@ -507,23 +513,37 @@ function createMemoryBackedSessionStorage(session) {
507
513
  function resetStoragePortForTests(storage) {
508
514
  storage.resetForTests?.();
509
515
  }
516
+ function createInMemorySessionStoragePort() {
517
+ const memory = /* @__PURE__ */ new Map();
518
+ return {
519
+ getItem: (key) => memory.get(key) ?? null,
520
+ setItem: (key, value) => {
521
+ memory.set(key, value);
522
+ },
523
+ removeItem: (key) => {
524
+ memory.delete(key);
525
+ },
526
+ resetForTests: () => {
527
+ memory.clear();
528
+ }
529
+ };
530
+ }
531
+ function resolveBrowserSessionStorage() {
532
+ try {
533
+ if (typeof sessionStorage === "undefined" || sessionStorage == null) {
534
+ return null;
535
+ }
536
+ return sessionStorage;
537
+ } catch {
538
+ return null;
539
+ }
540
+ }
510
541
  function createSessionStoragePort() {
511
- if (typeof sessionStorage === "undefined") {
512
- const memory = /* @__PURE__ */ new Map();
513
- return {
514
- getItem: (key) => memory.get(key) ?? null,
515
- setItem: (key, value) => {
516
- memory.set(key, value);
517
- },
518
- removeItem: (key) => {
519
- memory.delete(key);
520
- },
521
- resetForTests: () => {
522
- memory.clear();
523
- }
524
- };
542
+ const session = resolveBrowserSessionStorage();
543
+ if (!session) {
544
+ return createInMemorySessionStoragePort();
525
545
  }
526
- return createMemoryBackedSessionStorage(sessionStorage);
546
+ return createMemoryBackedSessionStorage(session);
527
547
  }
528
548
  function createGlobalTimer() {
529
549
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lessonkit/core",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "private": false,
5
5
  "description": "Shared types and telemetry primitives for LessonKit.",
6
6
  "license": "Apache-2.0",
@@ -48,8 +48,9 @@
48
48
  "lint": "echo \"(no lint configured yet)\""
49
49
  },
50
50
  "devDependencies": {
51
+ "@types/node": "^22.13.10",
51
52
  "tsup": "^8.5.0",
52
53
  "typescript": "^5.8.3",
53
- "vitest": "^3.2.4"
54
+ "vitest": "^4.1.8"
54
55
  }
55
56
  }