Skip to content

feat: add Windows and Linux support - #7

Draft
SnowLukin wants to merge 247 commits into
mainfrom
feat/desktop-platform-support
Draft

SnowLukin wants to merge 247 commits into
mainfrom
feat/desktop-platform-support

Conversation

@SnowLukin

@SnowLukin SnowLukin commented Sep 29, 2026 •

Copy link
Copy Markdown
Owner

Summary

Temporary draft PR used to validate Windows/Linux support in the fork before submitting it upstream. Superseded by PostHog#621 and closed after that PR was opened. The branch is retained for the upstream contribution.

Validation

On commit 39a7398, Windows/Linux tests and release examples passed, along with Android/iOS/macOS/web builds, general/browser tests, analysis, formatting, publish dry run and the public API snapshot. Local validation passed 1,099 tests with one skipped.

CI: https://github.com/SnowLukin/posthog-flutter/actions/runs/36560854993

The separate iOS plugin tests are still running. Swift CodeQL could not start because of the fork's billing/spending limit for the paid macOS runner.

dependabot Bot and others added 30 commits June 11, 2026 16:40
…#416)

Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.36.0 to 4.36.2.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@7211b7c...8aad20d)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.36.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…ostHog#417)

Bumps [planetscale/ghcommit-action](https://github.com/planetscale/ghcommit-action) from 0.2.20 to 0.2.21.
- [Release notes](https://github.com/planetscale/ghcommit-action/releases)
- [Commits](planetscale/ghcommit-action@25309d8...57a6c78)

---
updated-dependencies:
- dependency-name: planetscale/ghcommit-action
  dependency-version: 0.2.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@de0fac2...df4cb1c)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat: add logs API (captureLog + logger facade)

Add a structured-logs API wrapping the native SDKs:

- `Posthog().captureLog(body:, level:, attributes:, traceId:, spanId:,
  traceFlags:)` and the `Posthog().logger.{trace,debug,info,warn,error,
  fatal}(body, attributes?)` facade.
- Forwards over the method channel to native iOS `PostHogSDK.captureLog`,
  Android `PostHog.captureLog`, and posthog-js `captureLog` on web. Batching,
  persistence, rate-capping, OTLP transport, and auto-context are native.
- `config.logs` (PostHogLogsConfig): identity (serviceName, serviceVersion,
  environment, resourceAttributes) and tuning (flushInterval, flushAt,
  maxBatchSize, maxBufferSize, rateCapMaxLogs, rateCapWindow). All optional;
  unset fields keep the native default.
- Dart-side `config.logs.beforeSend` drop/redact hook, run on every platform
  via the shared `applyBeforeSend` helper (also used by event beforeSend);
  callbacks can't cross the channel, so it is not forwarded to native.
- W3C trace fields are pass-through (not visible to beforeSend) and live on
  captureLog only, not the logger facade, on all platforms.

Raises the posthog-android lower bound to 3.48.0 (PostHog/posthog-android#553,
first release with the public captureLog trace API).

Tests cover the Dart capture path, gating, beforeSend semantics, trace fields
(incl. explicit traceFlags=0), config serialization, the web handler, and the
iOS RunnerTests path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: floor logs flush/rate-cap window at 1s

Addresses Greptile review: a sub-second `flushInterval`/`rateCapWindow`
Duration truncated to 0 via `inSeconds`, which the native SDK treats as
"rate cap disabled" / continuous flushing. Floor both at 1s (the smallest
the seconds-granular native API can honor) and add a regression test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: map log severity without iOS SDK's internal from(name:)

The iOS build failed: PostHogLogSeverity.from(name:) is `internal` in
posthog-ios, so the plugin can't call it. Map the wire level string to the
public enum cases with a local switch instead (unknown -> .info).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* refactor: address logs PR review feedback

- beforeSend: a throwing hook now drops the log (fail closed, so a broken
  redaction hook can't leak), logged so the bug stays visible. Matches
  posthog-android. The shared helper just runs the callback now; each pipeline
  applies its own policy (events continue, logs drop).
- logger: replace `late final` with a lazy getter + nullable backing field
  (mirrors posthog-ios; no `late`).
- Parameterize the severity-mapping tests into one case per level.
- Floor sub-second flush/rate-cap durations at 1s so they can't truncate to 0.
- Trim the changeset and several comments; permalink the posthog-js reference.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore: drop redundant beforeSend comments

The debugPrint and test names already convey the drop-on-throw behavior.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* refactor: address review (ioannisj)

- Rename `config.logs` field to `config.logsConfig` to match
  `sessionReplayConfig`/`errorTrackingConfig` (channel key stays `logs`).
- Copy `attributes` before beforeSend so a hook can't mutate the caller's map.
- iOS: lowercase the wire level in the severity switch (parity with Android).
- Update the beforeSend doc to reflect drop-on-throw.
- Run the browser-only web handler test in CI (`flutter test --platform chrome`).
- Changeset: note the posthog-android 3.48.0 requirement.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore: split CI lint jobs

* chore: fix formatter checks
* docs: centralize SDK examples in official docs

* docs: address review feedback
* ci: add Dart public API check

* ci: remove unnecessary checkout fetch depth
* chore: run required checks on docs-only PRs

* chore: short-circuit required checks for docs-only PRs

* chore: reuse shared markdown-only detector

* chore: use neutral markdown-only check wording

* chore: limit docs-only short-circuit to required checks
* chore: add AI contribution policy

* docs: avoid hardcoded year in AI policy
…ostHog#444)

Bumps [planetscale/ghcommit-action](https://github.com/planetscale/ghcommit-action) from 0.2.21 to 0.2.22.
- [Release notes](https://github.com/planetscale/ghcommit-action/releases)
- [Commits](planetscale/ghcommit-action@57a6c78...a6b150b)

---
updated-dependencies:
- dependency-name: planetscale/ghcommit-action
  dependency-version: 0.2.22
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat: add addExceptionStep API for error tracking

* chore: require posthog-android 3.51.0 and posthog-ios 3.61.0 for exception steps

* feat: add exception steps example screen

* fix: no-op addExceptionStep when exception steps are disabled

* chore: format exception steps example screen

* fix: implement addExceptionStep on web

* refactor: return Map<String, Object> from exception steps toMap

* fix: treat whitespace-only exception step messages as empty

* fix: capture web exceptions via posthog-js captureException so steps attach

* refactor: type _exceptionMessage properties as Object? not dynamic
* chore: update Flutter PopScope callback

* chore: update Dart API snapshot
* chore: use pnpm setup runtime action

* chore: document temporary node version duplication

* fix: pin pnpm version for runtime setup

* fix: avoid package manager mismatch in setup action

* fix: use pnpm 11 package manager
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3 to 7.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@df4cb1c...9c091bb)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 5.2.0 to 5.3.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](actions/setup-java@be666c2...ad2b381)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore: add SDK compliance harness 0.8.0

* fix: address compliance adapter review comments

* fix: pin compliance adapter Flutter image

* fix: keep flags api key field

* fix: address compliance adapter flush review
* fix: retry adapter flags requests on 502 and 504

* fix: address flags retry review feedback

* chore: add flags retry changeset

* chore: remove unnecessary changeset
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 5.3.0 to 5.4.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](actions/setup-java@ad2b381...1bcf9fb)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: 5.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/cache/save](https://github.com/actions/cache) from 5.0.5 to 6.1.0.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](actions/cache@27d5ce7...55cc834)

---
updated-dependencies:
- dependency-name: actions/cache/save
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Anna Garcia <11654201+turnipdabeets@users.noreply.github.com>
)

Bumps [actions/cache/restore](https://github.com/actions/cache) from 5.0.5 to 6.1.0.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](actions/cache@27d5ce7...55cc834)

---
updated-dependencies:
- dependency-name: actions/cache/restore
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Anna Garcia <11654201+turnipdabeets@users.noreply.github.com>
* feat: capture platform views in session replay screenshots

Platform views (WebView, Maps, etc.) are masked by default in session
replay — they appear as a black box rather than being captured or
leaking native content.

- Adds `maskAllPlatformViews` config flag (default `true`)
- Adds `PostHogPlatformView` marker widget + `PostHogPlatformViewPrivacy`
  enum (`.mask` / `.capture`) for per-view override
- iOS: `WKWebView.takeSnapshot` for capture; no `drawHierarchy` fallback
  (would leak masked CALayer-backed views into replay)
- Android: PixelCopy + async bitmap compression; de-duplicates frames
  via `compositedBytesHash`
- 5-second timeout on `captureNativeScreenshot` to prevent replay freeze
- Example app: 8 test flows covering masked/captured combinations

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* perf: batch platform-view captures into one native channel call per frame

Previously _compositeRevealedView made one captureNativeScreenshot call
per captured platform view per frame, blocking on each round-trip before
starting the next. N views = N sequential channel crossings, each
carrying a PNG payload.

Replace with captureNativeScreenshots (plural): a single channel call
per frame that accepts a list of view specs and returns a list of byte
arrays. The Dart side computes all geometries upfront, dispatches one
awaited call, then loops to composite. On Android and iOS the single-
view work is extracted into an internal callback-based helper and the
batch handler chains them sequentially.

Also adds _viewSpec helper to screenshot_capturer.dart so geometry
computation is separated from compositing, and updates tests for the
new API.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: fix Kotlin and Swift formatting; restore codec finally

- ktlint auto-format: import ordering, statement wrapping, argument
  list wrapping, multi-space alignment in PosthogFlutterPlugin.kt
- swiftformat auto-format: elseOnSameLine, wrapMultilineStatementBraces,
  preferKeyPath in PosthogFlutterPlugin.swift
- Restore codec?.dispose() in finally block in _decodeImage (was lost
  when screenshot_capturer.dart was resynced during the batch refactor)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* perf: skip PNG codec for platform view captures — use raw RGBA

Android: replace bitmap.compress(PNG) with getPixels() + RGBA packing.
iOS: replace pngData() with a CGBitmapContext raw-pixel extraction.
Dart: replace ui.instantiateImageCodec with ui.decodeImageFromPixels,
passing the already-known spec dimensions from _viewSpec.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* style: dart format

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: correct pixel-format, crash guard, and API docs for platform-view capture

- iOS imageToRawRgba: premultipliedLast to noneSkipLast; WKWebView snapshots
  are opaque so premultiplied bytes caused double-multiply against Skia
- Dart: guard bytesList[i] with bounds check to prevent RangeError on short response
- Android captureNext: add w<=0||h<=0 guard matching the singular handler
- PostHogPlatformViewPrivacy.capture: document iOS WKWebView-only limitation
- Add platform_view_privacy_test.dart for tree-walk privacy inheritance logic

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(ios): use point dimensions in imageToRawRgba, not physical pixels

WKWebView.takeSnapshot returns a UIImage at UIScreen.main.scale (2x/3x on
Retina). cgImage.width/height are physical pixels; Dart decodes the buffer
at logical-point dimensions from _viewSpec. The mismatch produced a byte
buffer 4x/9x too large, garbling the WebView image in every replay frame
on non-1x devices.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* style: remove chatty inline comments from privacy inheritance test

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(android): guard PixelCopy.request against SurfaceView detach race

PixelCopy.request throws IllegalArgumentException if the SurfaceView
detaches between the isAttachedToWindow guard and the call. This runs
inside a PixelCopy callback so it isn't caught by the outer try-catch
in handleCaptureNativeScreenshots. Wrap in try-catch and recycle the
bitmap on failure so we advance cleanly rather than crashing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* review: batch tests, constant extraction, and changeset syntax fix

- Add Kotlin tests for captureNativeScreenshots: no-activity, empty views, zero-dimension entry
- Extract FLUTTER_VIEW_CLASS_PREFIX constant for repeated "io.flutter" string in Kotlin
- Remove unnecessary dart:typed_data import from native_communicator_test.dart
- Fix changeset enum syntax: .capture → PostHogPlatformViewPrivacy.capture (Dart, not Swift)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(test): use JUnit assertions in Kotlin zero-dimension batch test

Kotlin stdlib assert() is silently disabled when JVM assertions are off
(-ea not set), which is the default in Android Gradle test runs. Replace
with assertEquals/assertNull from JUnit 4 so the assertions always run.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(android): recycle bitmap when Flutter SurfaceView has zero dimensions

When `captureOneNative` encounters a Flutter SurfaceView with width or
height ≤ 0 (possible on the first frame or during layout transitions),
the subsequent `coerceIn(0, width - 1)` call would throw an
IllegalArgumentException because min > max. The pre-allocated bitmap was
not recycled on this path, causing a memory leak.

Guard added before the coordinate calculations: recycle the bitmap and
return null immediately when the SurfaceView has no dimensions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: skip redundant native capture for TextureBox, guard cancellation, cleanup

- TextureBox with capture policy is now skipped in _addIfNew: its content
  is already composited into the Flutter image, so a PixelCopy overlay is
  a no-op that wastes CPU/GPU every frame
- Added _cancelled guard immediately after captureNativeScreenshots await,
  consistent with all other async boundaries in the capture path
- Suppressed zero-platform-view printIfDebug noise: only log when masked
  or captured list is non-empty
- Added macOS note to PostHogPlatformViewPrivacy.capture doc: capture is
  unsupported on macOS and silently falls back to masking
- Renamed screenshotCompressionExecutor → bitmapExportExecutor: the thread
  exports raw RGBA bytes, not compressed screenshots

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: ignore .ralph/ session-tracking directory

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(example): explicit privacy wrappers and global setting visibility

- Extract kMaskAllPlatformViews constant so the per-view override screen
  can display the current global value, making expected replay behaviour
  unambiguous to anyone reading the example
- Add explicit PostHogPlatformView(privacy: .mask) wrapper to the right
  WebView in _CapturedAndMaskedWebViews so the test is deterministic
  regardless of the global setting

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: capture exception cause chains

* fix: address exception cause feedback
PostHog always answers /flags/?v=2 with the flags key. The v1 fallback is
kept for servers that ignore v=2, matching posthog-js, iOS, Android and
Python, and now says so.
@StarProxima StarProxima reopened this Oct 3, 2026
StarProxima and others added 6 commits October 3, 2026 11:17
Tear-downs run in reverse order, so a directory created after the platform
was deleted while the platform still held its lock file open. Windows refuses
that deletion, which failed two setup tests there. The directory is now
created first.
posthog-ios 4.0 removes PostHogDataMode.cellular, which always behaved like .any. Map the Dart "cellular" value to .any in the plugin and deprecate PostHogDataMode.cellular in Dart.
group('company', 'free-company') after group('company', 'paid-company',
groupProperties: {'plan': 'pro'}) kept the paid company's properties, so the
next /flags request evaluated free-company with plan = pro. A new key for a
group type now clears the flag properties stored for that type before the
new ones are applied, as posthog-js does.
@StarProxima
StarProxima force-pushed the feat/desktop-platform-support branch from 8fdd633 to 266a0f5 Compare October 5, 2026 15:46
StarProxima and others added 21 commits October 5, 2026 18:48
…rm-support

# Conflicts:
#	posthog_flutter/pubspec.yaml
…ostHog#635)

* chore: deprecate PostHogWidgetState and PostHogMaskWidgetState

Both are exported only because they are public by accident; they expose no
usable members. Deprecating now lets the next major make them private.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* chore: update API snapshot for deprecated widget states

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* chore: mark widget states @internal and hide them from exports

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…rm-support

# Conflicts:
#	posthog_flutter/pubspec.yaml
Bumps the codeql-action group with 2 updates: [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action).


Updates `github/codeql-action/init` from 4.38.0 to 4.38.2
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@b96794f...2892aa5)

Updates `github/codeql-action/analyze` from 4.38.0 to 4.38.2
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@b96794f...2892aa5)

---
updated-dependencies:
- dependency-name: github/codeql-action/init
  dependency-version: 4.38.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: codeql-action
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.38.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: codeql-action
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
)

Bumps the pub-dependencies group with 3 updates: [cupertino_icons](https://github.com/flutter/packages/tree/main/third_party/packages), [google_maps_flutter](https://github.com/flutter/packages/tree/main/packages/google_maps_flutter) and [stack_trace](https://github.com/dart-lang/tools/tree/main/pkgs).


Updates `cupertino_icons` from 1.0.9 to 2.0.0
- [Release notes](https://github.com/flutter/packages/releases)
- [Commits](https://github.com/flutter/packages/commits/cupertino_icons-v2.0.0/third_party/packages)

Updates `google_maps_flutter` from 2.18.1 to 2.18.2
- [Release notes](https://github.com/flutter/packages/releases)
- [Commits](https://github.com/flutter/packages/commits/google_maps_flutter-v2.18.2/packages/google_maps_flutter)

Updates `stack_trace` from 1.12.1 to 1.12.2
- [Release notes](https://github.com/dart-lang/tools/releases)
- [Commits](https://github.com/dart-lang/tools/commits/stack_trace-v1.12.2/pkgs)

---
updated-dependencies:
- dependency-name: cupertino_icons
  dependency-version: 2.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: pub-dependencies
- dependency-name: google_maps_flutter
  dependency-version: 2.18.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: pub-dependencies
- dependency-name: stack_trace
  dependency-version: 1.12.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: pub-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…ostHog#636)

* feat: add optIn/optOut and sendFeatureFlagEvent, deprecate old names

Match the names used by posthog-ios, posthog-android and posthog-react-native.
The old names forward to the new ones, so behavior is unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* chore(api): record @deprecated accessors in the API snapshot

dart_apitool misses annotations on explicit getters/setters; the annotate
step already patched @experimental, now it also patches @deprecated. This
marks sendFeatureFlagEvents, plus the already-deprecated apiKey and
debouncerDelay, as deprecated in the snapshot.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(replay): stop session replay when the user opts out

disable() left the Flutter screenshot loop running after opt-out.
Stop it before the platform opt-out, and start a new recording on
opt-in only if a recording was actually stopped.

* docs(replay): keep opt-out ordering out of the public docs

Callers do not need the native stop and start constraints. Those notes
now sit next to the calls.

* fix(replay): address review on opt-out replay stop

Send the native stop and disable back to back instead of awaiting the
stop first, so a capture() after an un-awaited optOut() still reaches
native after the opt-out. Skip the stop and restart on web, where
posthog-js already drops replay while opted out and a restart would
override a replay disabled in posthog.init. Name iOS as the platform
that ignores startSessionRecording while opted out.

Co-authored-by: Omid Mirzaei <omidomirzaei@gmail.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Anna Garcia <anna.g@posthog.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…test-sdk-action.yml (PostHog#650)

Bumps [PostHog/posthog-sdk-test-harness/.github/workflows/test-sdk-action.yml](https://github.com/posthog/posthog-sdk-test-harness) from 03d972e49be84402c491324320b0a0f38c2ddc53 to 27806196fa5c5ac74e9e7500bc46b74db1869f3a.
- [Release notes](https://github.com/posthog/posthog-sdk-test-harness/releases)
- [Changelog](https://github.com/PostHog/posthog-sdk-test-harness/blob/main/CHANGELOG.md)
- [Commits](PostHog/posthog-sdk-test-harness@03d972e...2780619)

---
updated-dependencies:
- dependency-name: PostHog/posthog-sdk-test-harness/.github/workflows/test-sdk-action.yml
  dependency-version: 27806196fa5c5ac74e9e7500bc46b74db1869f3a
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
)

* feat(surveys): honor surveyPopupDelaySeconds before showing

Wire the appearance field through native maps and Dart models, wait in
SurveyService with cancel/replace semantics, and add widget tests.

Fixes PostHog#322

* fix(surveys): address review on popup delay

Wait out the delay on the same pending-show completer the context wait
uses, so a survey with no context after its delay waits for the next
navigation instead of being closed, and hideSurvey or a newer survey
cancels either wait. A navigation during the delay no longer cuts it
short. Cap the delay at one day so huge values can't overflow, drop the
redundant generation counter, and make the changeset a minor.

Co-authored-by: Omid Mirzaei <omidomirzaei@gmail.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(surveys): address review findings on popup delay

Don't call onClosed for a survey hidden or replaced during its popup
delay. The user never saw it, so it must not be marked seen or send
`survey dismissed`, matching the wait-for-context path and the Android
surveys host. Native has already dropped that presentation by the time
Flutter cancels the delay, so nothing is left waiting for a close.

Make the replacement test fail if the replaced survey's timer keeps
running and shows the newer survey early.

Co-authored-by: Omid Mirzaei <omidomirzaei@gmail.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Anna Garcia <anna.g@posthog.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.