@newtalaria/browser 0.1.8 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -114,6 +114,17 @@ When an **error/fatal** event attempts an on-error clip (`replaysSessionSampleRa
114
114
 
115
115
  Failed captures do **not** set `replayId` (avoids linking a blank player). Details are also under `extra.replayCapture`.
116
116
 
117
+ When the paint base cannot ship, `extra.replayCapture` also includes size diagnostics where available:
118
+
119
+ | Field | Meaning |
120
+ | --- | --- |
121
+ | `fullSnapshotEstimatedBytes` | JSON size estimate of the FullSnapshot |
122
+ | `fullSnapshotCompressedBytes` | Gzip size of the FullSnapshot alone (when measured) |
123
+ | `metaEstimatedBytes` | JSON size estimate of the Meta event |
124
+ | `maxUncompressedSegmentBytes` / `maxCompressedSegmentBytes` | Current pack caps |
125
+
126
+ Use these to see how far over budget a CMS/admin snapshot was when a clip was aborted.
127
+
117
128
  ## Serverpod URL pattern
118
129
 
119
130
  Talaria uses **Serverpod RPC**, not REST resource URLs:
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -161,6 +161,10 @@ var SegmentBuffer = class {
161
161
  hasFullSnapshot() {
162
162
  return this.events.some((e) => e.type === RRWEB_FULL_SNAPSHOT);
163
163
  }
164
+ /** First FullSnapshot still queued (does not remove it). */
165
+ peekFullSnapshot() {
166
+ return this.events.find((e) => e.type === RRWEB_FULL_SNAPSHOT);
167
+ }
164
168
  /**
165
169
  * Drop leading events until Meta+FullSnapshot (or FullSnapshot alone).
166
170
  * Returns false if no FullSnapshot is present (replay would paint blank).
@@ -390,6 +394,28 @@ function mergeReplayCaptureExtra(extra, outcome) {
390
394
  };
391
395
  }
392
396
 
397
+ // src/replay/paint_base_size.ts
398
+ function paintBaseSizeDetails(events, opts) {
399
+ const meta = events.find((e) => e.type === RRWEB_META);
400
+ const full = events.find((e) => e.type === RRWEB_FULL_SNAPSHOT);
401
+ const details = {
402
+ segmentEventTypes: events.map((e) => e.type),
403
+ maxUncompressedSegmentBytes: SEGMENT_SIZE_BYTES,
404
+ targetCompressedSegmentBytes: TARGET_COMPRESSED_SEGMENT_BYTES,
405
+ maxCompressedSegmentBytes: MAX_COMPRESSED_SEGMENT_BYTES
406
+ };
407
+ if (meta) {
408
+ details.metaEstimatedBytes = estimateJsonBytes(meta);
409
+ }
410
+ if (full) {
411
+ details.fullSnapshotEstimatedBytes = estimateJsonBytes(full);
412
+ }
413
+ if (opts?.fullSnapshotCompressedBytes !== void 0) {
414
+ details.fullSnapshotCompressedBytes = opts.fullSnapshotCompressedBytes;
415
+ }
416
+ return details;
417
+ }
418
+
393
419
  // ../../node_modules/rrweb/dist/rrweb.js
394
420
  var __defProp = Object.defineProperty;
395
421
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -13975,7 +14001,11 @@ var TalariaClient = class {
13975
14001
  if (!this.options || !this.transport || !this.replayId) return;
13976
14002
  if (!this.startedOnServer || this.finishedOnServer) return;
13977
14003
  if (!this.prepareBufferForNewReplay()) {
13978
- await this.abortUnusableClip("no_full_snapshot");
14004
+ const leftover = this.buffer.peekFullSnapshot();
14005
+ await this.abortUnusableClip(
14006
+ "no_full_snapshot",
14007
+ paintBaseSizeDetails(leftover ? [leftover] : [])
14008
+ );
13979
14009
  return;
13980
14010
  }
13981
14011
  while (this.buffer.length > 0) {
@@ -14023,9 +14053,21 @@ var TalariaClient = class {
14023
14053
  }
14024
14054
  const { events, gzip } = fitted;
14025
14055
  if (this.segmentIndex === 0 && !events.some((e) => e.type === RRWEB_FULL_SNAPSHOT)) {
14026
- await this.abortUnusableClip("no_full_snapshot", {
14027
- segmentEventTypes: events.map((e) => e.type)
14028
- });
14056
+ const leftoverFs = this.buffer.peekFullSnapshot();
14057
+ let compressedBytes;
14058
+ if (leftoverFs) {
14059
+ try {
14060
+ compressedBytes = (await compressReplayEvents([leftoverFs])).length;
14061
+ } catch {
14062
+ }
14063
+ }
14064
+ await this.abortUnusableClip(
14065
+ "no_full_snapshot",
14066
+ paintBaseSizeDetails(
14067
+ leftoverFs ? [...events, leftoverFs] : events,
14068
+ { fullSnapshotCompressedBytes: compressedBytes }
14069
+ )
14070
+ );
14029
14071
  return;
14030
14072
  }
14031
14073
  if (this.isErrorClipMode() && this.uploadedCompressedBytes + gzip.length > MAX_ERROR_CLIP_COMPRESSED_BYTES && this.segmentIndex > 0) {
@@ -14077,9 +14119,14 @@ var TalariaClient = class {
14077
14119
  { type: droppedType }
14078
14120
  );
14079
14121
  if (this.segmentIndex === 0 && droppedType === RRWEB_FULL_SNAPSHOT) {
14080
- await this.abortUnusableClip("oversized_full_snapshot", {
14081
- source: "server_reject"
14082
- });
14122
+ await this.abortUnusableClip(
14123
+ "oversized_full_snapshot",
14124
+ {
14125
+ source: "server_reject",
14126
+ ...paintBaseSizeDetails(events),
14127
+ rejectedCompressedBytes: gzip.length
14128
+ }
14129
+ );
14083
14130
  return;
14084
14131
  }
14085
14132
  continue;
@@ -14128,11 +14175,21 @@ var TalariaClient = class {
14128
14175
  { type: dropped?.type }
14129
14176
  );
14130
14177
  if (this.segmentIndex === 0 && dropped?.type === RRWEB_FULL_SNAPSHOT) {
14178
+ let compressedBytes;
14179
+ try {
14180
+ compressedBytes = (await compressReplayEvents([dropped])).length;
14181
+ } catch {
14182
+ }
14131
14183
  return {
14132
14184
  events: [],
14133
14185
  gzip: new Uint8Array(),
14134
14186
  abortReason: "oversized_full_snapshot",
14135
- abortDetails: { source: "fit_compressed_prefix" }
14187
+ abortDetails: {
14188
+ source: "fit_compressed_prefix",
14189
+ ...paintBaseSizeDetails(chunk, {
14190
+ fullSnapshotCompressedBytes: compressedBytes
14191
+ })
14192
+ }
14136
14193
  };
14137
14194
  }
14138
14195
  if (chunk.length > 1) {
@@ -14141,11 +14198,24 @@ var TalariaClient = class {
14141
14198
  return this.takeFittedSegment();
14142
14199
  }
14143
14200
  if (this.segmentIndex === 0 && chunk.some((e) => e.type === RRWEB_FULL_SNAPSHOT) && !fitted.events.some((e) => e.type === RRWEB_FULL_SNAPSHOT)) {
14201
+ const full = chunk.find((e) => e.type === RRWEB_FULL_SNAPSHOT);
14202
+ let compressedBytes;
14203
+ if (full) {
14204
+ try {
14205
+ compressedBytes = (await compressReplayEvents([full])).length;
14206
+ } catch {
14207
+ }
14208
+ }
14144
14209
  return {
14145
14210
  events: [],
14146
14211
  gzip: new Uint8Array(),
14147
14212
  abortReason: "oversized_full_snapshot",
14148
- abortDetails: { source: "fit_dropped_full_snapshot" }
14213
+ abortDetails: {
14214
+ source: "fit_dropped_full_snapshot",
14215
+ ...paintBaseSizeDetails(chunk, {
14216
+ fullSnapshotCompressedBytes: compressedBytes
14217
+ })
14218
+ }
14149
14219
  };
14150
14220
  }
14151
14221
  if (fitted.remainder.length > 0) {