Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OPEN state but no messages #68

Closed
rwst opened this issue May 19, 2022 · 3 comments
Closed

OPEN state but no messages #68

rwst opened this issue May 19, 2022 · 3 comments

Comments

@rwst
Copy link

rwst commented May 19, 2022

The stream using curl:

curl https://lichess.org/api/board/game/stream/5AbVbnlV -H "Authorization: Bearer xyz"
{"id":"5AbVbnlV","variant":{"key":"chess960","name":"Chess960","short":"960"},"clock":null,"speed":"correspondence","perf":{"name":"Chess960"},"rated":false,"createdAt":1650300721078,"white":{"id":"drdisentangle","name":"DrDisentangle","title":null,"rating":1543,"provisional":true},"black":{"aiLevel":1},"initialFen":"nqrknbbr/pppppppp/8/8/8/8/PPPPPPPP/NQRKNBBR w KQkq - 0 1","type":"gameFull","state":{"type":"gameState","moves":"e2e4 c7c5 f1c4 e8d6 e4e5 a8b6 e5d6 e7d6 c4b3 d6d5 f2f4 h7h6 g1e3 g8h7 e1f3 b6c4 b3c4 h7e4 h1e1 b8d6 c4b5 d6g6 d2d3 d5d4 d3e4 g6g2 b5e2 f8d6","wtime":2147483647,"btime":2147483647,"winc":0,"binc":0,"status":"started"}}








{"type":"gameState","moves":"e2e4 c7c5 f1c4 e8d6 e4e5 a8b6 e5d6 e7d6 c4b3 d6d5 f2f4 h7h6 g1e3 g8h7 e1f3 b6c4 b3c4 h7e4 h1e1 b8d6 c4b5 d6g6 d2d3 d5d4 d3e4 g6g2 b5e2 f8d6 e4e5","wtime":2147483647,"btime":2147483647,"winc":0,"binc":0,"status":"started"}
{"type":"gameState","moves":"e2e4 c7c5 f1c4 e8d6 e4e5 a8b6 e5d6 e7d6 c4b3 d6d5 f2f4 h7h6 g1e3 g8h7 e1f3 b6c4 b3c4 h7e4 h1e1 b8d6 c4b5 d6g6 d2d3 d5d4 d3e4 g6g2 b5e2 f8d6 e4e5 d8h8","wtime":2147483647,"btime":2147483647,"winc":0,"binc":0,"status":"started"}

As you can see there is one initial message and one message after each move, which I can trigger manually. There are also empty lines. Now my Kotlin code is:

    @RequiresApi(Build.VERSION_CODES.O)
    fun getBoardGameStream(gameId: String) {
        val eventHandler = GameStreamEventHandler()
        val url = RetrofitHelper.baseUrl + String.format("api/board/game/stream/$gameId");
        Log.i(TAG, "url = $url")
        val headers: Headers = Headers.headersOf("Authorization", "Bearer $theToken")
        val builder = EventSource.Builder(eventHandler, URI.create(url))
            .reconnectTime(Duration.ofMillis(3000))
            .headers(headers)

        val eventSource = builder.build()
        eventSource.start()
        runBlocking() {
            delay(5000L)
        }
        Log.i(TAG, "eventSource: ${eventSource.state}, ${eventSource.uri}, ${eventSource.lastEventId}")
    }

This gives me the following log:

I/LichessService: url = https://lichess.org/api/board/game/stream/5AbVbnlV
W/System.err: [main] INFO com.launchdarkly.eventsource.EventSource - Starting EventSource client using URI: https://lichess.org/api/board/game/stream/5AbVbnlV
W/System.err: [okhttp-eventsource-stream-[]-0] INFO com.launchdarkly.eventsource.EventSource - Connected to EventSource stream.
I/SSEventHandler: onOpen
I/LichessService: eventSource: OPEN, https://lichess.org/api/board/game/stream/5AbVbnlV, null

Nothing more, even if I trigger a move. Note the null lastEventId that I get after 5s. The GameStreamEventHandler=SSEventHandler is simply overriding EventHandler and logs every callback.

My question: how can I debug further? In the end I may need to copy and tweak your code, but maybe you have an idea?

@eli-darkly
Copy link
Contributor

Is this definitely an SSE stream? I ask because the curl output in your description does not look like one. It's showing a series of text lines, each of which is a JSON object, but that is not the SSE format. An SSE event would have, at a minimum, a line starting with data: and would be terminated by two linefeeds.

https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events

@rwst
Copy link
Author

rwst commented May 20, 2022

That solves it, many thanks. This is not an SSE stream. As a suggestion maybe your code can give a hint when it encounters messages without data.

@rwst rwst closed this as completed May 20, 2022
LaunchDarklyReleaseBot pushed a commit that referenced this issue Jan 10, 2023
… an event (#68)

* in streaming data mode, throw an exception if stream is closed during an event

* one more unit test
LaunchDarklyReleaseBot added a commit that referenced this issue Jan 10, 2023
* add time threshold for backoff reset

* allow endpoint to be specified as either URI or HttpUrl

* add @SInCE

* add interface for customizing requests

* javadoc fixes

* add changelog for past releases

* remove JSR305

* replace SSL-specific config method with general-purpose HTTP config method

* make helper method static

* add end-to-end EventSource tests

* spacing

* omit default header value if there's a custom value

* avoid trailing period in logger name

* add 1.x branch

* update to OkHttp 4.x and Java 8

* javadoc fixes

* remove EventSource setters, + test improvements

* update Gradle release

* enable Github Pages

* skip tests in release

* add ability to force a stream restart; improve tests so we can test this

* revert whitespace change

* bump OkHttp version to latest Java 7-compatible version

* add ability to force a stream restart; improve tests so we can test this (#29)

* update to okhttp 4.5.0

* longer timeout for cleaner shutdown of test servers

* fix Gradle scopes

* allow setting specific thread priority

* remove misleading logging & unnecessary backoff, improve tests (#34)

* known issue with onClose() - add comment, disable test assertions

* allow caller to specify a custom logger instead of SLF4J (#32)

* add method for changing base name of SLF4J logger

* enable coverage reports in CI, improve CI to test all supported Java versions

* rm inapplicable CI copy-paste

* another CI fix

* add checkstyle config

* fix jitter calculation when upper bound is a power of 2

* misc coverage + test improvements, add CI enforcement of coverage (#39)

* fix shutdown state logic, simplify code paths (#40)

* Fix Java 7 compatibility.

* add OpenJDK 7 build + fix test race condition + javadoc fix (#42)

* update Gradle to 6.8.3

* Kotlinize build script

* fix logic for shutting down after an unrecoverable error

* use newer HTTP test helpers

* use Releaser v2 config + newer CI images (#47)

* use new stream-reading implementation to support CR-only line endings

* make buffer size configurable

* rm usage that's not allowed in Java 8

* add Guava test dependency

* add code coverage ovverride

* implement contract tests (#48)

* use Gradle 7

* Bounded queues for the EventHandler thread (#58)

* Bounded queue for the EventHandler thread

The unbounded queue fronting the 'event' thread can cause trouble when the
EventHandler is unable to keep up with the workload. This can lead to heap
exhaustion, GC issues and failure modes that are generally considered "bad".

Band-aid over this with a semaphore to limit the number of tasks in the queue.
The semaphore is opt-in and disabled by default to avoid any nasty surprises
for folks upgrading.

Also add 'EventSource.awaitClosed()' to allow users to wait for underlying
thread pools to completely shut down. We can't know if it's safe to clean
up resources used by the EventHandler thread if we can't be certain that it
has completely terminated.

* Address checkstyle griping in StubServer

* Fix JavaDoc issue

* Tighten up exception handling

Co-authored-by: Eli Bishop <eli@launchdarkly.com>

* update @SInCE

* test Java 17 in CI (#51)

* improve tests for AsyncEventHandler and EventSource.awaitClosed (#52)

* add streaming data mode for very large events (#53)

* add option to ensure that expected fields are always read

* add Gradle option to suppress kotlin-stdlib in our pom

* update okhttp to 4.9.3

* use LaunchDarkly logging facade

* rm unused

* misc fixes

* improve javadoc links

* remove SLF4J dependency, use only com.launchdarkly.logging

* update com.launchdarkly.logging version

* consistently use placeholders instead of concatenation in log output

* update release metadata

* use SecureRandom instead of Random, just to make scanners happier

* use SecureRandom instead of Random, just to make scanners happier

* use SecureRandom instead of Random, just to make scanners happier

* fix release metadata

* remove usage of Duration for Android compatibility

* new synchronous EventSource implementation (#64)

* add async wrapper to emulate old EventSource (#65)

* update doc comments regarding thread behavior in Android

* update Gradle to 7.6 + fix snapshot releases

* in streaming data mode, throw an exception if stream is closed during an event (#68)

* in streaming data mode, throw an exception if stream is closed during an event

* one more unit test

Co-authored-by: Eli Bishop <eli@launchdarkly.com>
Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com>
Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com>
Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com>
Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
LaunchDarklyReleaseBot added a commit that referenced this issue Jan 10, 2023
* add time threshold for backoff reset

* allow endpoint to be specified as either URI or HttpUrl

* add @SInCE

* add interface for customizing requests

* javadoc fixes

* add changelog for past releases

* remove JSR305

* replace SSL-specific config method with general-purpose HTTP config method

* make helper method static

* add end-to-end EventSource tests

* spacing

* omit default header value if there's a custom value

* avoid trailing period in logger name

* add 1.x branch

* update to OkHttp 4.x and Java 8

* javadoc fixes

* remove EventSource setters, + test improvements

* update Gradle release

* enable Github Pages

* skip tests in release

* add ability to force a stream restart; improve tests so we can test this

* revert whitespace change

* bump OkHttp version to latest Java 7-compatible version

* add ability to force a stream restart; improve tests so we can test this (#29)

* update to okhttp 4.5.0

* longer timeout for cleaner shutdown of test servers

* fix Gradle scopes

* allow setting specific thread priority

* remove misleading logging & unnecessary backoff, improve tests (#34)

* known issue with onClose() - add comment, disable test assertions

* allow caller to specify a custom logger instead of SLF4J (#32)

* add method for changing base name of SLF4J logger

* enable coverage reports in CI, improve CI to test all supported Java versions

* rm inapplicable CI copy-paste

* another CI fix

* add checkstyle config

* fix jitter calculation when upper bound is a power of 2

* misc coverage + test improvements, add CI enforcement of coverage (#39)

* fix shutdown state logic, simplify code paths (#40)

* Fix Java 7 compatibility.

* add OpenJDK 7 build + fix test race condition + javadoc fix (#42)

* update Gradle to 6.8.3

* Kotlinize build script

* fix logic for shutting down after an unrecoverable error

* use newer HTTP test helpers

* use Releaser v2 config + newer CI images (#47)

* use new stream-reading implementation to support CR-only line endings

* make buffer size configurable

* rm usage that's not allowed in Java 8

* add Guava test dependency

* add code coverage ovverride

* implement contract tests (#48)

* use Gradle 7

* Bounded queues for the EventHandler thread (#58)

* Bounded queue for the EventHandler thread

The unbounded queue fronting the 'event' thread can cause trouble when the
EventHandler is unable to keep up with the workload. This can lead to heap
exhaustion, GC issues and failure modes that are generally considered "bad".

Band-aid over this with a semaphore to limit the number of tasks in the queue.
The semaphore is opt-in and disabled by default to avoid any nasty surprises
for folks upgrading.

Also add 'EventSource.awaitClosed()' to allow users to wait for underlying
thread pools to completely shut down. We can't know if it's safe to clean
up resources used by the EventHandler thread if we can't be certain that it
has completely terminated.

* Address checkstyle griping in StubServer

* Fix JavaDoc issue

* Tighten up exception handling

Co-authored-by: Eli Bishop <eli@launchdarkly.com>

* update @SInCE

* test Java 17 in CI (#51)

* improve tests for AsyncEventHandler and EventSource.awaitClosed (#52)

* add streaming data mode for very large events (#53)

* add option to ensure that expected fields are always read

* add Gradle option to suppress kotlin-stdlib in our pom

* update okhttp to 4.9.3

* use LaunchDarkly logging facade

* rm unused

* misc fixes

* improve javadoc links

* remove SLF4J dependency, use only com.launchdarkly.logging

* update com.launchdarkly.logging version

* consistently use placeholders instead of concatenation in log output

* update release metadata

* use SecureRandom instead of Random, just to make scanners happier

* use SecureRandom instead of Random, just to make scanners happier

* use SecureRandom instead of Random, just to make scanners happier

* fix release metadata

* remove usage of Duration for Android compatibility

* new synchronous EventSource implementation (#64)

* add async wrapper to emulate old EventSource (#65)

* update doc comments regarding thread behavior in Android

* update Gradle to 7.6 + fix snapshot releases

* in streaming data mode, throw an exception if stream is closed during an event (#68)

* in streaming data mode, throw an exception if stream is closed during an event

* one more unit test

* fix overly time-sensitive tests

Co-authored-by: Eli Bishop <eli@launchdarkly.com>
Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com>
Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com>
Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com>
Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
tanderson-ld added a commit that referenced this issue Jun 27, 2023
* add time threshold for backoff reset

* allow endpoint to be specified as either URI or HttpUrl

* add @SInCE

* add interface for customizing requests

* javadoc fixes

* add changelog for past releases

* remove JSR305

* replace SSL-specific config method with general-purpose HTTP config method

* make helper method static

* add end-to-end EventSource tests

* spacing

* omit default header value if there's a custom value

* avoid trailing period in logger name

* add 1.x branch

* update to OkHttp 4.x and Java 8

* javadoc fixes

* remove EventSource setters, + test improvements

* update Gradle release

* enable Github Pages

* skip tests in release

* add ability to force a stream restart; improve tests so we can test this

* revert whitespace change

* bump OkHttp version to latest Java 7-compatible version

* add ability to force a stream restart; improve tests so we can test this (#29)

* update to okhttp 4.5.0

* longer timeout for cleaner shutdown of test servers

* fix Gradle scopes

* allow setting specific thread priority

* remove misleading logging & unnecessary backoff, improve tests (#34)

* known issue with onClose() - add comment, disable test assertions

* allow caller to specify a custom logger instead of SLF4J (#32)

* add method for changing base name of SLF4J logger

* enable coverage reports in CI, improve CI to test all supported Java versions

* rm inapplicable CI copy-paste

* another CI fix

* add checkstyle config

* fix jitter calculation when upper bound is a power of 2

* misc coverage + test improvements, add CI enforcement of coverage (#39)

* fix shutdown state logic, simplify code paths (#40)

* Fix Java 7 compatibility.

* add OpenJDK 7 build + fix test race condition + javadoc fix (#42)

* update Gradle to 6.8.3

* Kotlinize build script

* fix logic for shutting down after an unrecoverable error

* use newer HTTP test helpers

* use Releaser v2 config + newer CI images (#47)

* use new stream-reading implementation to support CR-only line endings

* make buffer size configurable

* rm usage that's not allowed in Java 8

* add Guava test dependency

* add code coverage ovverride

* implement contract tests (#48)

* use Gradle 7

* Bounded queues for the EventHandler thread (#58)

* Bounded queue for the EventHandler thread

The unbounded queue fronting the 'event' thread can cause trouble when the
EventHandler is unable to keep up with the workload. This can lead to heap
exhaustion, GC issues and failure modes that are generally considered "bad".

Band-aid over this with a semaphore to limit the number of tasks in the queue.
The semaphore is opt-in and disabled by default to avoid any nasty surprises
for folks upgrading.

Also add 'EventSource.awaitClosed()' to allow users to wait for underlying
thread pools to completely shut down. We can't know if it's safe to clean
up resources used by the EventHandler thread if we can't be certain that it
has completely terminated.

* Address checkstyle griping in StubServer

* Fix JavaDoc issue

* Tighten up exception handling

Co-authored-by: Eli Bishop <eli@launchdarkly.com>

* update @SInCE

* test Java 17 in CI (#51)

* improve tests for AsyncEventHandler and EventSource.awaitClosed (#52)

* add streaming data mode for very large events (#53)

* add option to ensure that expected fields are always read

* add Gradle option to suppress kotlin-stdlib in our pom

* update okhttp to 4.9.3

* use LaunchDarkly logging facade

* rm unused

* misc fixes

* improve javadoc links

* remove SLF4J dependency, use only com.launchdarkly.logging

* update com.launchdarkly.logging version

* consistently use placeholders instead of concatenation in log output

* update release metadata

* use SecureRandom instead of Random, just to make scanners happier

* use SecureRandom instead of Random, just to make scanners happier

* use SecureRandom instead of Random, just to make scanners happier

* fix release metadata

* remove usage of Duration for Android compatibility

* new synchronous EventSource implementation (#64)

* add async wrapper to emulate old EventSource (#65)

* update doc comments regarding thread behavior in Android

* update Gradle to 7.6 + fix snapshot releases

* in streaming data mode, throw an exception if stream is closed during an event (#68)

* in streaming data mode, throw an exception if stream is closed during an event

* one more unit test

* fix overly time-sensitive tests

* Bumping Guava to fix CVE-2023-2976

---------

Co-authored-by: Eli Bishop <eli@launchdarkly.com>
Co-authored-by: LaunchDarklyCI <dev@launchdarkly.com>
Co-authored-by: Gavin Whelan <gwhelan@launchdarkly.com>
Co-authored-by: LaunchDarklyReleaseBot <launchdarklyreleasebot@launchdarkly.com>
Co-authored-by: Tom Lee <93216+thomaslee@users.noreply.github.com>
Co-authored-by: Todd Anderson <tanderson@launchdarkly.com>
Co-authored-by: tanderson-ld <127344469+tanderson-ld@users.noreply.github.com>
@Anugrahasb
Copy link

Anugrahasb commented Jul 30, 2023

I am using the library 'okhttp-eventsource' version 2.5.0 from https://github.com/launchdarkly/okhttp-eventsource/releases/tag/2.5.0 for SSE in Android. I am facing an issue where I can connect and receive signals, but after some time (around 5 minutes), the signals stop coming to my end, even if the backend is sending the signals and the SSE connection remains open.

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

No branches or pull requests

3 participants