PTHMINT-119: SSE event stream support and EventManager - #59

Merged
zulquer merged 5 commits into
masterfrom
PTHMINT-119
Jun 3, 2026
Merged

PTHMINT-119: SSE event stream support and EventManager#59
zulquer merged 5 commits into
masterfrom
PTHMINT-119

Conversation

@zulquer

Copy link
Copy Markdown
Collaborator

This pull request introduces a new event streaming API for order events, allowing clients to subscribe to real-time updates using server-sent events (SSE). It includes new response models, event stream handling, and updates for backward compatibility with both singular and plural event field names in order responses.

The most important changes are:

Event Streaming API Implementation:

  • Added the EventManager class (event_manager.py) and its public interface (__init__.py) to manage event stream subscriptions for orders. This provides methods to subscribe to event streams using event tokens and URLs, or directly from order response objects. [1][2]
  • Introduced the EventStream class (stream/__init__.py) to handle server-sent event streams, including deserialization of payloads and context manager support. This enables iteration over live event messages from the SSE endpoint.

Event Response Models:

  • Added new response models for SSE events: Event, EventData, and EventDataPayload, including recursive deserialization for nested payloads. [1][2][3][4]

Order Response Backward Compatibility:

  • Updated the Order response model to support both singular and plural forms of event-related fields (events_token, event_token, etc.), with normalization logic to ensure compatibility with different API payloads. [1][2][3]

Example Usage:

  • Added a new example script subscribe_events.py demonstrating how to create a Cloud POS order and subscribe to its event stream using the new API.

Client Exports:

  • Re-exported ServerSentEvent and ServerSentEventStream from the client package for easier access.

@zulquer
zulquerforce-pushed the PTHMINT-118 branch 2 times, most recently from a3ccc41 to 08221e9CompareApril 30, 2026 10:40
Base automatically changed from PTHMINT-118 to masterMay 8, 2026 09:18
zulquer added 2 commits May 11, 2026 12:34
Introduce Server-Sent Events support and higher-level helpers for subscribing to order event streams. Adds multisafepay.client.sse (ServerSentEvent, ServerSentEventStream, StreamingResponse) and an EventStream adapter under api.paths.events.stream to deserialize SSE payloads into Event/EventData models. Adds EventManager for subscribing by token or from an Order response, and exposes get_event_manager() on the Sdk. Extend Order response to include events_token/events_url/events_stream_url with normalization for backward compatibility with legacy event_token/event_stream_url fields. Include an example (examples/event_manager/subscribe_events.py), update examples/order_manager/cloud_pos_order.py, update README with usage and env vars, export SSE types from client.__init__, and add unit and e2e tests for stream and manager behavior. Also contains small formatting/.env and test tweaks.
Introduce streaming HTTP support across the SDK: add HTTPStreamResponse and open_stream(...) to the HTTPTransport protocol and export HTTPStreamResponse from transport package. Update RequestsTransport to share request preparation with a new open_stream implementation and return a _RequestsStreamResponse adapter that exposes readline(), close(), and raise_for_status(). Modify SSE client and EventStream to use the configured transport.open_stream(...) (and raise a clear error if the transport lacks streaming support), and pass the client transport from EventManager to EventStream.open. Update README and unit tests to reflect streaming behavior and ensure streams are closed on failing status checks.
@codecov

codecovBot commented May 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.61%. Comparing base (01815bd) to head (1f4ad33).

Additional details and impacted files
@@ Coverage Diff @@## master #59 +/- ##
==========================================
- Coverage 92.96% 92.61% -0.35% 
==========================================
Files 172 180 +8 Lines 3027 3331 +304 ==========================================
+ Hits 2814 3085 +271 - Misses 213 246 +33 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Introduces a Server-Sent Events (SSE) subscription API for order events. Adds a transport-level streaming abstraction (HTTPStreamResponse / open_stream), a generic ServerSentEventStream parser in the client layer, an events-path EventStream + response models (Event, EventData), and an EventManager exposed via the SDK. Also adds backward-compatible singular/plural event field aliases to Order and a runnable example + E2E test for Cloud POS event streaming.

Changes:

  • New SSE streaming stack: HTTPStreamResponse protocol + RequestsTransport.open_stream adapter, ServerSentEventStream parser, events-path EventStream and response models, EventManager on the SDK.
  • Backward-compat normalization between events_* and event_* fields on Order, plus public AUTH_SCOPE_* aliases re-exposed on Client.
  • New examples/event_manager/subscribe_events.py, E2E fixtures/test for SSE, and README documentation for SSE usage and required env vars.

Reviewed changes

Copilot reviewed 26 out of 27 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/multisafepay/transport/http_transport.pyAdds HTTPStreamResponse protocol and open_stream to HTTPTransport; reorders class definitions.
src/multisafepay/transport/requests_transport.pyAdds streaming adapter _RequestsStreamResponse and shared _prepare_request used by request/open_stream.
src/multisafepay/transport/init.pyExports HTTPStreamResponse.
src/multisafepay/client/sse.pyGeneric ServerSentEvent / ServerSentEventStream parser and opener using the configured transport.
src/multisafepay/client/client.pyPublic AUTH_SCOPE_* constants re-exported from ScopedCredentialResolver.
src/multisafepay/client/init.pyRe-exports SSE types.
src/multisafepay/api/paths/events/event_manager.pyEventManager with subscribe_events / subscribe_order_events.
src/multisafepay/api/paths/events/init.pyExports EventManager.
src/multisafepay/api/paths/events/stream/init.pyEvents-path EventStream adapter wrapping the generic SSE stream.
src/multisafepay/api/paths/events/stream/response/event.pyEvent response model with recursive payload adaptation.
src/multisafepay/api/paths/events/stream/response/components/event_data.pyEventData model and EventDataPayload union.
src/multisafepay/api/paths/events/stream/response/{init,components/init}.pyPackage exports.
src/multisafepay/api/paths/orders/response/order_response.pyAdds events_* fields and _normalize_event_fields aliasing.
src/multisafepay/sdk.pyAdds get_event_manager().
examples/event_manager/subscribe_events.pyCloud POS order creation + SSE subscription example.
examples/order_manager/cloud_pos_order.pyMinor formatting cleanup.
README.mdDocuments transport streaming, event-stream usage, env vars.
.env.exampleTrailing-newline fix.
tests/multisafepay/unit/api/path/events/**Unit tests for EventManager and event-path EventStream.
tests/multisafepay/unit/api/path/orders/response/test_unit_order_response.pyTests singular/plural event field normalization.
tests/multisafepay/unit/transport/test_unit_transport.pyTest for RequestsTransport.open_stream.
tests/multisafepay/unit/test_unit_sdk.pyTest for Sdk.get_event_manager().
tests/multisafepay/unit/client/test_unit_client.pyTest for Client.AUTH_SCOPE_* aliases.
tests/multisafepay/e2e/examples/event_manager/{conftest.py,test_subscribe_events.py}E2E fixtures and test for SSE subscription against Cloud POS.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 3 comments.

Comment threadsrc/multisafepay/api/paths/events/stream/response/event.py
Comment threadsrc/multisafepay/transport/http_transport.py

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 5 comments.

Comment threadsrc/multisafepay/transport/http_transport.py
Comment threadsrc/multisafepay/api/paths/events/event_manager.py Outdated
Comment threadsrc/multisafepay/api/paths/orders/response/order_response.py
Comment threadsrc/multisafepay/api/paths/events/stream/__init__.py
Comment threadREADME.md
zulquer added 2 commits May 27, 2026 10:52
Add a runtime-checkable HTTPStreamingTransport protocol that extends HTTPTransport with open_stream and update the SDK to require it for SSE subscriptions. Adjust sse client to use isinstance checks and improve error messaging; export the new protocol from transport package. Rename order response fields to events_token/events_url/events_stream_url while keeping backward-compatible aliases, add an assertion in SSE payload adaptation, update README to document the HTTPStreamingTransport requirement, and update/add unit tests to cover the protocol split and new error messages.
@zulquer
zulquer removed the request for review from danielcivitJune 3, 2026 13:19
@zulquer
zulquer merged commit 369bdc2 into masterJun 3, 2026
6 checks passed
@zulquer
zulquer deleted the PTHMINT-119 branch June 3, 2026 13:30
Sign up for freeto 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.

3 participants

@zulquer@danielcivit
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

PTHMINT-119: SSE event stream support and EventManager - #59

Merged
zulquer merged 5 commits into
masterfrom
PTHMINT-119
Jun 3, 2026
Merged

PTHMINT-119: SSE event stream support and EventManager#59
zulquer merged 5 commits into
masterfrom
PTHMINT-119

Conversation

@zulquer

Copy link
Copy Markdown
Collaborator

This pull request introduces a new event streaming API for order events, allowing clients to subscribe to real-time updates using server-sent events (SSE). It includes new response models, event stream handling, and updates for backward compatibility with both singular and plural event field names in order responses.

The most important changes are:

Event Streaming API Implementation:

  • Added the EventManager class (event_manager.py) and its public interface (__init__.py) to manage event stream subscriptions for orders. This provides methods to subscribe to event streams using event tokens and URLs, or directly from order response objects. [1][2]
  • Introduced the EventStream class (stream/__init__.py) to handle server-sent event streams, including deserialization of payloads and context manager support. This enables iteration over live event messages from the SSE endpoint.

Event Response Models:

  • Added new response models for SSE events: Event, EventData, and EventDataPayload, including recursive deserialization for nested payloads. [1][2][3][4]

Order Response Backward Compatibility:

  • Updated the Order response model to support both singular and plural forms of event-related fields (events_token, event_token, etc.), with normalization logic to ensure compatibility with different API payloads. [1][2][3]

Example Usage:

  • Added a new example script subscribe_events.py demonstrating how to create a Cloud POS order and subscribe to its event stream using the new API.

Client Exports:

  • Re-exported ServerSentEvent and ServerSentEventStream from the client package for easier access.

@zulquer
zulquerforce-pushed the PTHMINT-118 branch 2 times, most recently from a3ccc41 to 08221e9CompareApril 30, 2026 10:40
Base automatically changed from PTHMINT-118 to masterMay 8, 2026 09:18
zulquer added 2 commits May 11, 2026 12:34
Introduce Server-Sent Events support and higher-level helpers for subscribing to order event streams. Adds multisafepay.client.sse (ServerSentEvent, ServerSentEventStream, StreamingResponse) and an EventStream adapter under api.paths.events.stream to deserialize SSE payloads into Event/EventData models. Adds EventManager for subscribing by token or from an Order response, and exposes get_event_manager() on the Sdk. Extend Order response to include events_token/events_url/events_stream_url with normalization for backward compatibility with legacy event_token/event_stream_url fields. Include an example (examples/event_manager/subscribe_events.py), update examples/order_manager/cloud_pos_order.py, update README with usage and env vars, export SSE types from client.__init__, and add unit and e2e tests for stream and manager behavior. Also contains small formatting/.env and test tweaks.
Introduce streaming HTTP support across the SDK: add HTTPStreamResponse and open_stream(...) to the HTTPTransport protocol and export HTTPStreamResponse from transport package. Update RequestsTransport to share request preparation with a new open_stream implementation and return a _RequestsStreamResponse adapter that exposes readline(), close(), and raise_for_status(). Modify SSE client and EventStream to use the configured transport.open_stream(...) (and raise a clear error if the transport lacks streaming support), and pass the client transport from EventManager to EventStream.open. Update README and unit tests to reflect streaming behavior and ensure streams are closed on failing status checks.
@codecov

codecovBot commented May 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.61%. Comparing base (01815bd) to head (1f4ad33).

Additional details and impacted files
@@ Coverage Diff @@## master #59 +/- ##
==========================================
- Coverage 92.96% 92.61% -0.35% 
==========================================
Files 172 180 +8 Lines 3027 3331 +304 ==========================================
+ Hits 2814 3085 +271 - Misses 213 246 +33 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Introduces a Server-Sent Events (SSE) subscription API for order events. Adds a transport-level streaming abstraction (HTTPStreamResponse / open_stream), a generic ServerSentEventStream parser in the client layer, an events-path EventStream + response models (Event, EventData), and an EventManager exposed via the SDK. Also adds backward-compatible singular/plural event field aliases to Order and a runnable example + E2E test for Cloud POS event streaming.

Changes:

  • New SSE streaming stack: HTTPStreamResponse protocol + RequestsTransport.open_stream adapter, ServerSentEventStream parser, events-path EventStream and response models, EventManager on the SDK.
  • Backward-compat normalization between events_* and event_* fields on Order, plus public AUTH_SCOPE_* aliases re-exposed on Client.
  • New examples/event_manager/subscribe_events.py, E2E fixtures/test for SSE, and README documentation for SSE usage and required env vars.

Reviewed changes

Copilot reviewed 26 out of 27 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/multisafepay/transport/http_transport.pyAdds HTTPStreamResponse protocol and open_stream to HTTPTransport; reorders class definitions.
src/multisafepay/transport/requests_transport.pyAdds streaming adapter _RequestsStreamResponse and shared _prepare_request used by request/open_stream.
src/multisafepay/transport/init.pyExports HTTPStreamResponse.
src/multisafepay/client/sse.pyGeneric ServerSentEvent / ServerSentEventStream parser and opener using the configured transport.
src/multisafepay/client/client.pyPublic AUTH_SCOPE_* constants re-exported from ScopedCredentialResolver.
src/multisafepay/client/init.pyRe-exports SSE types.
src/multisafepay/api/paths/events/event_manager.pyEventManager with subscribe_events / subscribe_order_events.
src/multisafepay/api/paths/events/init.pyExports EventManager.
src/multisafepay/api/paths/events/stream/init.pyEvents-path EventStream adapter wrapping the generic SSE stream.
src/multisafepay/api/paths/events/stream/response/event.pyEvent response model with recursive payload adaptation.
src/multisafepay/api/paths/events/stream/response/components/event_data.pyEventData model and EventDataPayload union.
src/multisafepay/api/paths/events/stream/response/{init,components/init}.pyPackage exports.
src/multisafepay/api/paths/orders/response/order_response.pyAdds events_* fields and _normalize_event_fields aliasing.
src/multisafepay/sdk.pyAdds get_event_manager().
examples/event_manager/subscribe_events.pyCloud POS order creation + SSE subscription example.
examples/order_manager/cloud_pos_order.pyMinor formatting cleanup.
README.mdDocuments transport streaming, event-stream usage, env vars.
.env.exampleTrailing-newline fix.
tests/multisafepay/unit/api/path/events/**Unit tests for EventManager and event-path EventStream.
tests/multisafepay/unit/api/path/orders/response/test_unit_order_response.pyTests singular/plural event field normalization.
tests/multisafepay/unit/transport/test_unit_transport.pyTest for RequestsTransport.open_stream.
tests/multisafepay/unit/test_unit_sdk.pyTest for Sdk.get_event_manager().
tests/multisafepay/unit/client/test_unit_client.pyTest for Client.AUTH_SCOPE_* aliases.
tests/multisafepay/e2e/examples/event_manager/{conftest.py,test_subscribe_events.py}E2E fixtures and test for SSE subscription against Cloud POS.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 3 comments.

Comment threadsrc/multisafepay/api/paths/events/stream/response/event.py
Comment threadsrc/multisafepay/transport/http_transport.py

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 5 comments.

Comment threadsrc/multisafepay/transport/http_transport.py
Comment threadsrc/multisafepay/api/paths/events/event_manager.py Outdated
Comment threadsrc/multisafepay/api/paths/orders/response/order_response.py
Comment threadsrc/multisafepay/api/paths/events/stream/__init__.py
Comment threadREADME.md
zulquer added 2 commits May 27, 2026 10:52
Add a runtime-checkable HTTPStreamingTransport protocol that extends HTTPTransport with open_stream and update the SDK to require it for SSE subscriptions. Adjust sse client to use isinstance checks and improve error messaging; export the new protocol from transport package. Rename order response fields to events_token/events_url/events_stream_url while keeping backward-compatible aliases, add an assertion in SSE payload adaptation, update README to document the HTTPStreamingTransport requirement, and update/add unit tests to cover the protocol split and new error messages.
@zulquer
zulquer removed the request for review from danielcivitJune 3, 2026 13:19
@zulquer
zulquer merged commit 369bdc2 into masterJun 3, 2026
6 checks passed
@zulquer
zulquer deleted the PTHMINT-119 branch June 3, 2026 13:30
Sign up for freeto 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.

3 participants

@zulquer@danielcivit
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

PTHMINT-119: SSE event stream support and EventManager - #59

Merged
zulquer merged 5 commits into
masterfrom
PTHMINT-119
Jun 3, 2026
Merged

PTHMINT-119: SSE event stream support and EventManager#59
zulquer merged 5 commits into
masterfrom
PTHMINT-119

Conversation

@zulquer

Copy link
Copy Markdown
Collaborator

This pull request introduces a new event streaming API for order events, allowing clients to subscribe to real-time updates using server-sent events (SSE). It includes new response models, event stream handling, and updates for backward compatibility with both singular and plural event field names in order responses.

The most important changes are:

Event Streaming API Implementation:

  • Added the EventManager class (event_manager.py) and its public interface (__init__.py) to manage event stream subscriptions for orders. This provides methods to subscribe to event streams using event tokens and URLs, or directly from order response objects. [1][2]
  • Introduced the EventStream class (stream/__init__.py) to handle server-sent event streams, including deserialization of payloads and context manager support. This enables iteration over live event messages from the SSE endpoint.

Event Response Models:

  • Added new response models for SSE events: Event, EventData, and EventDataPayload, including recursive deserialization for nested payloads. [1][2][3][4]

Order Response Backward Compatibility:

  • Updated the Order response model to support both singular and plural forms of event-related fields (events_token, event_token, etc.), with normalization logic to ensure compatibility with different API payloads. [1][2][3]

Example Usage:

  • Added a new example script subscribe_events.py demonstrating how to create a Cloud POS order and subscribe to its event stream using the new API.

Client Exports:

  • Re-exported ServerSentEvent and ServerSentEventStream from the client package for easier access.

@zulquer
zulquerforce-pushed the PTHMINT-118 branch 2 times, most recently from a3ccc41 to 08221e9CompareApril 30, 2026 10:40
Base automatically changed from PTHMINT-118 to masterMay 8, 2026 09:18
zulquer added 2 commits May 11, 2026 12:34
Introduce Server-Sent Events support and higher-level helpers for subscribing to order event streams. Adds multisafepay.client.sse (ServerSentEvent, ServerSentEventStream, StreamingResponse) and an EventStream adapter under api.paths.events.stream to deserialize SSE payloads into Event/EventData models. Adds EventManager for subscribing by token or from an Order response, and exposes get_event_manager() on the Sdk. Extend Order response to include events_token/events_url/events_stream_url with normalization for backward compatibility with legacy event_token/event_stream_url fields. Include an example (examples/event_manager/subscribe_events.py), update examples/order_manager/cloud_pos_order.py, update README with usage and env vars, export SSE types from client.__init__, and add unit and e2e tests for stream and manager behavior. Also contains small formatting/.env and test tweaks.
Introduce streaming HTTP support across the SDK: add HTTPStreamResponse and open_stream(...) to the HTTPTransport protocol and export HTTPStreamResponse from transport package. Update RequestsTransport to share request preparation with a new open_stream implementation and return a _RequestsStreamResponse adapter that exposes readline(), close(), and raise_for_status(). Modify SSE client and EventStream to use the configured transport.open_stream(...) (and raise a clear error if the transport lacks streaming support), and pass the client transport from EventManager to EventStream.open. Update README and unit tests to reflect streaming behavior and ensure streams are closed on failing status checks.
@codecov

codecovBot commented May 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.61%. Comparing base (01815bd) to head (1f4ad33).

Additional details and impacted files
@@ Coverage Diff @@## master #59 +/- ##
==========================================
- Coverage 92.96% 92.61% -0.35% 
==========================================
Files 172 180 +8 Lines 3027 3331 +304 ==========================================
+ Hits 2814 3085 +271 - Misses 213 246 +33 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Introduces a Server-Sent Events (SSE) subscription API for order events. Adds a transport-level streaming abstraction (HTTPStreamResponse / open_stream), a generic ServerSentEventStream parser in the client layer, an events-path EventStream + response models (Event, EventData), and an EventManager exposed via the SDK. Also adds backward-compatible singular/plural event field aliases to Order and a runnable example + E2E test for Cloud POS event streaming.

Changes:

  • New SSE streaming stack: HTTPStreamResponse protocol + RequestsTransport.open_stream adapter, ServerSentEventStream parser, events-path EventStream and response models, EventManager on the SDK.
  • Backward-compat normalization between events_* and event_* fields on Order, plus public AUTH_SCOPE_* aliases re-exposed on Client.
  • New examples/event_manager/subscribe_events.py, E2E fixtures/test for SSE, and README documentation for SSE usage and required env vars.

Reviewed changes

Copilot reviewed 26 out of 27 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/multisafepay/transport/http_transport.pyAdds HTTPStreamResponse protocol and open_stream to HTTPTransport; reorders class definitions.
src/multisafepay/transport/requests_transport.pyAdds streaming adapter _RequestsStreamResponse and shared _prepare_request used by request/open_stream.
src/multisafepay/transport/init.pyExports HTTPStreamResponse.
src/multisafepay/client/sse.pyGeneric ServerSentEvent / ServerSentEventStream parser and opener using the configured transport.
src/multisafepay/client/client.pyPublic AUTH_SCOPE_* constants re-exported from ScopedCredentialResolver.
src/multisafepay/client/init.pyRe-exports SSE types.
src/multisafepay/api/paths/events/event_manager.pyEventManager with subscribe_events / subscribe_order_events.
src/multisafepay/api/paths/events/init.pyExports EventManager.
src/multisafepay/api/paths/events/stream/init.pyEvents-path EventStream adapter wrapping the generic SSE stream.
src/multisafepay/api/paths/events/stream/response/event.pyEvent response model with recursive payload adaptation.
src/multisafepay/api/paths/events/stream/response/components/event_data.pyEventData model and EventDataPayload union.
src/multisafepay/api/paths/events/stream/response/{init,components/init}.pyPackage exports.
src/multisafepay/api/paths/orders/response/order_response.pyAdds events_* fields and _normalize_event_fields aliasing.
src/multisafepay/sdk.pyAdds get_event_manager().
examples/event_manager/subscribe_events.pyCloud POS order creation + SSE subscription example.
examples/order_manager/cloud_pos_order.pyMinor formatting cleanup.
README.mdDocuments transport streaming, event-stream usage, env vars.
.env.exampleTrailing-newline fix.
tests/multisafepay/unit/api/path/events/**Unit tests for EventManager and event-path EventStream.
tests/multisafepay/unit/api/path/orders/response/test_unit_order_response.pyTests singular/plural event field normalization.
tests/multisafepay/unit/transport/test_unit_transport.pyTest for RequestsTransport.open_stream.
tests/multisafepay/unit/test_unit_sdk.pyTest for Sdk.get_event_manager().
tests/multisafepay/unit/client/test_unit_client.pyTest for Client.AUTH_SCOPE_* aliases.
tests/multisafepay/e2e/examples/event_manager/{conftest.py,test_subscribe_events.py}E2E fixtures and test for SSE subscription against Cloud POS.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 3 comments.

Comment threadsrc/multisafepay/api/paths/events/stream/response/event.py
Comment threadsrc/multisafepay/transport/http_transport.py

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 5 comments.

Comment threadsrc/multisafepay/transport/http_transport.py
Comment threadsrc/multisafepay/api/paths/events/event_manager.py Outdated
Comment threadsrc/multisafepay/api/paths/orders/response/order_response.py
Comment threadsrc/multisafepay/api/paths/events/stream/__init__.py
Comment threadREADME.md
zulquer added 2 commits May 27, 2026 10:52
Add a runtime-checkable HTTPStreamingTransport protocol that extends HTTPTransport with open_stream and update the SDK to require it for SSE subscriptions. Adjust sse client to use isinstance checks and improve error messaging; export the new protocol from transport package. Rename order response fields to events_token/events_url/events_stream_url while keeping backward-compatible aliases, add an assertion in SSE payload adaptation, update README to document the HTTPStreamingTransport requirement, and update/add unit tests to cover the protocol split and new error messages.
@zulquer
zulquer removed the request for review from danielcivitJune 3, 2026 13:19
@zulquer
zulquer merged commit 369bdc2 into masterJun 3, 2026
6 checks passed
@zulquer
zulquer deleted the PTHMINT-119 branch June 3, 2026 13:30
Sign up for freeto 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.

3 participants

@zulquer@danielcivit
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

PTHMINT-119: SSE event stream support and EventManager - #59

Merged
zulquer merged 5 commits into
masterfrom
PTHMINT-119
Jun 3, 2026
Merged

PTHMINT-119: SSE event stream support and EventManager#59
zulquer merged 5 commits into
masterfrom
PTHMINT-119

Conversation

@zulquer

Copy link
Copy Markdown
Collaborator

This pull request introduces a new event streaming API for order events, allowing clients to subscribe to real-time updates using server-sent events (SSE). It includes new response models, event stream handling, and updates for backward compatibility with both singular and plural event field names in order responses.

The most important changes are:

Event Streaming API Implementation:

  • Added the EventManager class (event_manager.py) and its public interface (__init__.py) to manage event stream subscriptions for orders. This provides methods to subscribe to event streams using event tokens and URLs, or directly from order response objects. [1][2]
  • Introduced the EventStream class (stream/__init__.py) to handle server-sent event streams, including deserialization of payloads and context manager support. This enables iteration over live event messages from the SSE endpoint.

Event Response Models:

  • Added new response models for SSE events: Event, EventData, and EventDataPayload, including recursive deserialization for nested payloads. [1][2][3][4]

Order Response Backward Compatibility:

  • Updated the Order response model to support both singular and plural forms of event-related fields (events_token, event_token, etc.), with normalization logic to ensure compatibility with different API payloads. [1][2][3]

Example Usage:

  • Added a new example script subscribe_events.py demonstrating how to create a Cloud POS order and subscribe to its event stream using the new API.

Client Exports:

  • Re-exported ServerSentEvent and ServerSentEventStream from the client package for easier access.

@zulquer
zulquerforce-pushed the PTHMINT-118 branch 2 times, most recently from a3ccc41 to 08221e9CompareApril 30, 2026 10:40
Base automatically changed from PTHMINT-118 to masterMay 8, 2026 09:18
zulquer added 2 commits May 11, 2026 12:34
Introduce Server-Sent Events support and higher-level helpers for subscribing to order event streams. Adds multisafepay.client.sse (ServerSentEvent, ServerSentEventStream, StreamingResponse) and an EventStream adapter under api.paths.events.stream to deserialize SSE payloads into Event/EventData models. Adds EventManager for subscribing by token or from an Order response, and exposes get_event_manager() on the Sdk. Extend Order response to include events_token/events_url/events_stream_url with normalization for backward compatibility with legacy event_token/event_stream_url fields. Include an example (examples/event_manager/subscribe_events.py), update examples/order_manager/cloud_pos_order.py, update README with usage and env vars, export SSE types from client.__init__, and add unit and e2e tests for stream and manager behavior. Also contains small formatting/.env and test tweaks.
Introduce streaming HTTP support across the SDK: add HTTPStreamResponse and open_stream(...) to the HTTPTransport protocol and export HTTPStreamResponse from transport package. Update RequestsTransport to share request preparation with a new open_stream implementation and return a _RequestsStreamResponse adapter that exposes readline(), close(), and raise_for_status(). Modify SSE client and EventStream to use the configured transport.open_stream(...) (and raise a clear error if the transport lacks streaming support), and pass the client transport from EventManager to EventStream.open. Update README and unit tests to reflect streaming behavior and ensure streams are closed on failing status checks.
@codecov

codecovBot commented May 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.61%. Comparing base (01815bd) to head (1f4ad33).

Additional details and impacted files
@@ Coverage Diff @@## master #59 +/- ##
==========================================
- Coverage 92.96% 92.61% -0.35% 
==========================================
Files 172 180 +8 Lines 3027 3331 +304 ==========================================
+ Hits 2814 3085 +271 - Misses 213 246 +33 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Introduces a Server-Sent Events (SSE) subscription API for order events. Adds a transport-level streaming abstraction (HTTPStreamResponse / open_stream), a generic ServerSentEventStream parser in the client layer, an events-path EventStream + response models (Event, EventData), and an EventManager exposed via the SDK. Also adds backward-compatible singular/plural event field aliases to Order and a runnable example + E2E test for Cloud POS event streaming.

Changes:

  • New SSE streaming stack: HTTPStreamResponse protocol + RequestsTransport.open_stream adapter, ServerSentEventStream parser, events-path EventStream and response models, EventManager on the SDK.
  • Backward-compat normalization between events_* and event_* fields on Order, plus public AUTH_SCOPE_* aliases re-exposed on Client.
  • New examples/event_manager/subscribe_events.py, E2E fixtures/test for SSE, and README documentation for SSE usage and required env vars.

Reviewed changes

Copilot reviewed 26 out of 27 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/multisafepay/transport/http_transport.pyAdds HTTPStreamResponse protocol and open_stream to HTTPTransport; reorders class definitions.
src/multisafepay/transport/requests_transport.pyAdds streaming adapter _RequestsStreamResponse and shared _prepare_request used by request/open_stream.
src/multisafepay/transport/init.pyExports HTTPStreamResponse.
src/multisafepay/client/sse.pyGeneric ServerSentEvent / ServerSentEventStream parser and opener using the configured transport.
src/multisafepay/client/client.pyPublic AUTH_SCOPE_* constants re-exported from ScopedCredentialResolver.
src/multisafepay/client/init.pyRe-exports SSE types.
src/multisafepay/api/paths/events/event_manager.pyEventManager with subscribe_events / subscribe_order_events.
src/multisafepay/api/paths/events/init.pyExports EventManager.
src/multisafepay/api/paths/events/stream/init.pyEvents-path EventStream adapter wrapping the generic SSE stream.
src/multisafepay/api/paths/events/stream/response/event.pyEvent response model with recursive payload adaptation.
src/multisafepay/api/paths/events/stream/response/components/event_data.pyEventData model and EventDataPayload union.
src/multisafepay/api/paths/events/stream/response/{init,components/init}.pyPackage exports.
src/multisafepay/api/paths/orders/response/order_response.pyAdds events_* fields and _normalize_event_fields aliasing.
src/multisafepay/sdk.pyAdds get_event_manager().
examples/event_manager/subscribe_events.pyCloud POS order creation + SSE subscription example.
examples/order_manager/cloud_pos_order.pyMinor formatting cleanup.
README.mdDocuments transport streaming, event-stream usage, env vars.
.env.exampleTrailing-newline fix.
tests/multisafepay/unit/api/path/events/**Unit tests for EventManager and event-path EventStream.
tests/multisafepay/unit/api/path/orders/response/test_unit_order_response.pyTests singular/plural event field normalization.
tests/multisafepay/unit/transport/test_unit_transport.pyTest for RequestsTransport.open_stream.
tests/multisafepay/unit/test_unit_sdk.pyTest for Sdk.get_event_manager().
tests/multisafepay/unit/client/test_unit_client.pyTest for Client.AUTH_SCOPE_* aliases.
tests/multisafepay/e2e/examples/event_manager/{conftest.py,test_subscribe_events.py}E2E fixtures and test for SSE subscription against Cloud POS.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 3 comments.

Comment threadsrc/multisafepay/api/paths/events/stream/response/event.py
Comment threadsrc/multisafepay/transport/http_transport.py

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 5 comments.

Comment threadsrc/multisafepay/transport/http_transport.py
Comment threadsrc/multisafepay/api/paths/events/event_manager.py Outdated
Comment threadsrc/multisafepay/api/paths/orders/response/order_response.py
Comment threadsrc/multisafepay/api/paths/events/stream/__init__.py
Comment threadREADME.md
zulquer added 2 commits May 27, 2026 10:52
Add a runtime-checkable HTTPStreamingTransport protocol that extends HTTPTransport with open_stream and update the SDK to require it for SSE subscriptions. Adjust sse client to use isinstance checks and improve error messaging; export the new protocol from transport package. Rename order response fields to events_token/events_url/events_stream_url while keeping backward-compatible aliases, add an assertion in SSE payload adaptation, update README to document the HTTPStreamingTransport requirement, and update/add unit tests to cover the protocol split and new error messages.
@zulquer
zulquer removed the request for review from danielcivitJune 3, 2026 13:19
@zulquer
zulquer merged commit 369bdc2 into masterJun 3, 2026
6 checks passed
@zulquer
zulquer deleted the PTHMINT-119 branch June 3, 2026 13:30
Sign up for freeto 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.

3 participants

@zulquer@danielcivit
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

PTHMINT-119: SSE event stream support and EventManager - #59

Merged
zulquer merged 5 commits into
masterfrom
PTHMINT-119
Jun 3, 2026
Merged

PTHMINT-119: SSE event stream support and EventManager#59
zulquer merged 5 commits into
masterfrom
PTHMINT-119

Conversation

@zulquer

Copy link
Copy Markdown
Collaborator

This pull request introduces a new event streaming API for order events, allowing clients to subscribe to real-time updates using server-sent events (SSE). It includes new response models, event stream handling, and updates for backward compatibility with both singular and plural event field names in order responses.

The most important changes are:

Event Streaming API Implementation:

  • Added the EventManager class (event_manager.py) and its public interface (__init__.py) to manage event stream subscriptions for orders. This provides methods to subscribe to event streams using event tokens and URLs, or directly from order response objects. [1][2]
  • Introduced the EventStream class (stream/__init__.py) to handle server-sent event streams, including deserialization of payloads and context manager support. This enables iteration over live event messages from the SSE endpoint.

Event Response Models:

  • Added new response models for SSE events: Event, EventData, and EventDataPayload, including recursive deserialization for nested payloads. [1][2][3][4]

Order Response Backward Compatibility:

  • Updated the Order response model to support both singular and plural forms of event-related fields (events_token, event_token, etc.), with normalization logic to ensure compatibility with different API payloads. [1][2][3]

Example Usage:

  • Added a new example script subscribe_events.py demonstrating how to create a Cloud POS order and subscribe to its event stream using the new API.

Client Exports:

  • Re-exported ServerSentEvent and ServerSentEventStream from the client package for easier access.

@zulquer
zulquerforce-pushed the PTHMINT-118 branch 2 times, most recently from a3ccc41 to 08221e9CompareApril 30, 2026 10:40
Base automatically changed from PTHMINT-118 to masterMay 8, 2026 09:18
zulquer added 2 commits May 11, 2026 12:34
Introduce Server-Sent Events support and higher-level helpers for subscribing to order event streams. Adds multisafepay.client.sse (ServerSentEvent, ServerSentEventStream, StreamingResponse) and an EventStream adapter under api.paths.events.stream to deserialize SSE payloads into Event/EventData models. Adds EventManager for subscribing by token or from an Order response, and exposes get_event_manager() on the Sdk. Extend Order response to include events_token/events_url/events_stream_url with normalization for backward compatibility with legacy event_token/event_stream_url fields. Include an example (examples/event_manager/subscribe_events.py), update examples/order_manager/cloud_pos_order.py, update README with usage and env vars, export SSE types from client.__init__, and add unit and e2e tests for stream and manager behavior. Also contains small formatting/.env and test tweaks.
Introduce streaming HTTP support across the SDK: add HTTPStreamResponse and open_stream(...) to the HTTPTransport protocol and export HTTPStreamResponse from transport package. Update RequestsTransport to share request preparation with a new open_stream implementation and return a _RequestsStreamResponse adapter that exposes readline(), close(), and raise_for_status(). Modify SSE client and EventStream to use the configured transport.open_stream(...) (and raise a clear error if the transport lacks streaming support), and pass the client transport from EventManager to EventStream.open. Update README and unit tests to reflect streaming behavior and ensure streams are closed on failing status checks.
@codecov

codecovBot commented May 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.61%. Comparing base (01815bd) to head (1f4ad33).

Additional details and impacted files
@@ Coverage Diff @@## master #59 +/- ##
==========================================
- Coverage 92.96% 92.61% -0.35% 
==========================================
Files 172 180 +8 Lines 3027 3331 +304 ==========================================
+ Hits 2814 3085 +271 - Misses 213 246 +33 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Introduces a Server-Sent Events (SSE) subscription API for order events. Adds a transport-level streaming abstraction (HTTPStreamResponse / open_stream), a generic ServerSentEventStream parser in the client layer, an events-path EventStream + response models (Event, EventData), and an EventManager exposed via the SDK. Also adds backward-compatible singular/plural event field aliases to Order and a runnable example + E2E test for Cloud POS event streaming.

Changes:

  • New SSE streaming stack: HTTPStreamResponse protocol + RequestsTransport.open_stream adapter, ServerSentEventStream parser, events-path EventStream and response models, EventManager on the SDK.
  • Backward-compat normalization between events_* and event_* fields on Order, plus public AUTH_SCOPE_* aliases re-exposed on Client.
  • New examples/event_manager/subscribe_events.py, E2E fixtures/test for SSE, and README documentation for SSE usage and required env vars.

Reviewed changes

Copilot reviewed 26 out of 27 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/multisafepay/transport/http_transport.pyAdds HTTPStreamResponse protocol and open_stream to HTTPTransport; reorders class definitions.
src/multisafepay/transport/requests_transport.pyAdds streaming adapter _RequestsStreamResponse and shared _prepare_request used by request/open_stream.
src/multisafepay/transport/init.pyExports HTTPStreamResponse.
src/multisafepay/client/sse.pyGeneric ServerSentEvent / ServerSentEventStream parser and opener using the configured transport.
src/multisafepay/client/client.pyPublic AUTH_SCOPE_* constants re-exported from ScopedCredentialResolver.
src/multisafepay/client/init.pyRe-exports SSE types.
src/multisafepay/api/paths/events/event_manager.pyEventManager with subscribe_events / subscribe_order_events.
src/multisafepay/api/paths/events/init.pyExports EventManager.
src/multisafepay/api/paths/events/stream/init.pyEvents-path EventStream adapter wrapping the generic SSE stream.
src/multisafepay/api/paths/events/stream/response/event.pyEvent response model with recursive payload adaptation.
src/multisafepay/api/paths/events/stream/response/components/event_data.pyEventData model and EventDataPayload union.
src/multisafepay/api/paths/events/stream/response/{init,components/init}.pyPackage exports.
src/multisafepay/api/paths/orders/response/order_response.pyAdds events_* fields and _normalize_event_fields aliasing.
src/multisafepay/sdk.pyAdds get_event_manager().
examples/event_manager/subscribe_events.pyCloud POS order creation + SSE subscription example.
examples/order_manager/cloud_pos_order.pyMinor formatting cleanup.
README.mdDocuments transport streaming, event-stream usage, env vars.
.env.exampleTrailing-newline fix.
tests/multisafepay/unit/api/path/events/**Unit tests for EventManager and event-path EventStream.
tests/multisafepay/unit/api/path/orders/response/test_unit_order_response.pyTests singular/plural event field normalization.
tests/multisafepay/unit/transport/test_unit_transport.pyTest for RequestsTransport.open_stream.
tests/multisafepay/unit/test_unit_sdk.pyTest for Sdk.get_event_manager().
tests/multisafepay/unit/client/test_unit_client.pyTest for Client.AUTH_SCOPE_* aliases.
tests/multisafepay/e2e/examples/event_manager/{conftest.py,test_subscribe_events.py}E2E fixtures and test for SSE subscription against Cloud POS.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 3 comments.

Comment threadsrc/multisafepay/api/paths/events/stream/response/event.py
Comment threadsrc/multisafepay/transport/http_transport.py

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 5 comments.

Comment threadsrc/multisafepay/transport/http_transport.py
Comment threadsrc/multisafepay/api/paths/events/event_manager.py Outdated
Comment threadsrc/multisafepay/api/paths/orders/response/order_response.py
Comment threadsrc/multisafepay/api/paths/events/stream/__init__.py
Comment threadREADME.md
zulquer added 2 commits May 27, 2026 10:52
Add a runtime-checkable HTTPStreamingTransport protocol that extends HTTPTransport with open_stream and update the SDK to require it for SSE subscriptions. Adjust sse client to use isinstance checks and improve error messaging; export the new protocol from transport package. Rename order response fields to events_token/events_url/events_stream_url while keeping backward-compatible aliases, add an assertion in SSE payload adaptation, update README to document the HTTPStreamingTransport requirement, and update/add unit tests to cover the protocol split and new error messages.
@zulquer
zulquer removed the request for review from danielcivitJune 3, 2026 13:19
@zulquer
zulquer merged commit 369bdc2 into masterJun 3, 2026
6 checks passed
@zulquer
zulquer deleted the PTHMINT-119 branch June 3, 2026 13:30
Sign up for freeto 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.

3 participants

@zulquer@danielcivit
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

PTHMINT-119: SSE event stream support and EventManager - #59

Merged
zulquer merged 5 commits into
masterfrom
PTHMINT-119
Jun 3, 2026
Merged

PTHMINT-119: SSE event stream support and EventManager#59
zulquer merged 5 commits into
masterfrom
PTHMINT-119

Conversation

@zulquer

Copy link
Copy Markdown
Collaborator

This pull request introduces a new event streaming API for order events, allowing clients to subscribe to real-time updates using server-sent events (SSE). It includes new response models, event stream handling, and updates for backward compatibility with both singular and plural event field names in order responses.

The most important changes are:

Event Streaming API Implementation:

  • Added the EventManager class (event_manager.py) and its public interface (__init__.py) to manage event stream subscriptions for orders. This provides methods to subscribe to event streams using event tokens and URLs, or directly from order response objects. [1][2]
  • Introduced the EventStream class (stream/__init__.py) to handle server-sent event streams, including deserialization of payloads and context manager support. This enables iteration over live event messages from the SSE endpoint.

Event Response Models:

  • Added new response models for SSE events: Event, EventData, and EventDataPayload, including recursive deserialization for nested payloads. [1][2][3][4]

Order Response Backward Compatibility:

  • Updated the Order response model to support both singular and plural forms of event-related fields (events_token, event_token, etc.), with normalization logic to ensure compatibility with different API payloads. [1][2][3]

Example Usage:

  • Added a new example script subscribe_events.py demonstrating how to create a Cloud POS order and subscribe to its event stream using the new API.

Client Exports:

  • Re-exported ServerSentEvent and ServerSentEventStream from the client package for easier access.

@zulquer
zulquerforce-pushed the PTHMINT-118 branch 2 times, most recently from a3ccc41 to 08221e9CompareApril 30, 2026 10:40
Base automatically changed from PTHMINT-118 to masterMay 8, 2026 09:18
zulquer added 2 commits May 11, 2026 12:34
Introduce Server-Sent Events support and higher-level helpers for subscribing to order event streams. Adds multisafepay.client.sse (ServerSentEvent, ServerSentEventStream, StreamingResponse) and an EventStream adapter under api.paths.events.stream to deserialize SSE payloads into Event/EventData models. Adds EventManager for subscribing by token or from an Order response, and exposes get_event_manager() on the Sdk. Extend Order response to include events_token/events_url/events_stream_url with normalization for backward compatibility with legacy event_token/event_stream_url fields. Include an example (examples/event_manager/subscribe_events.py), update examples/order_manager/cloud_pos_order.py, update README with usage and env vars, export SSE types from client.__init__, and add unit and e2e tests for stream and manager behavior. Also contains small formatting/.env and test tweaks.
Introduce streaming HTTP support across the SDK: add HTTPStreamResponse and open_stream(...) to the HTTPTransport protocol and export HTTPStreamResponse from transport package. Update RequestsTransport to share request preparation with a new open_stream implementation and return a _RequestsStreamResponse adapter that exposes readline(), close(), and raise_for_status(). Modify SSE client and EventStream to use the configured transport.open_stream(...) (and raise a clear error if the transport lacks streaming support), and pass the client transport from EventManager to EventStream.open. Update README and unit tests to reflect streaming behavior and ensure streams are closed on failing status checks.
@codecov

codecovBot commented May 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.61%. Comparing base (01815bd) to head (1f4ad33).

Additional details and impacted files
@@ Coverage Diff @@## master #59 +/- ##
==========================================
- Coverage 92.96% 92.61% -0.35% 
==========================================
Files 172 180 +8 Lines 3027 3331 +304 ==========================================
+ Hits 2814 3085 +271 - Misses 213 246 +33 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Introduces a Server-Sent Events (SSE) subscription API for order events. Adds a transport-level streaming abstraction (HTTPStreamResponse / open_stream), a generic ServerSentEventStream parser in the client layer, an events-path EventStream + response models (Event, EventData), and an EventManager exposed via the SDK. Also adds backward-compatible singular/plural event field aliases to Order and a runnable example + E2E test for Cloud POS event streaming.

Changes:

  • New SSE streaming stack: HTTPStreamResponse protocol + RequestsTransport.open_stream adapter, ServerSentEventStream parser, events-path EventStream and response models, EventManager on the SDK.
  • Backward-compat normalization between events_* and event_* fields on Order, plus public AUTH_SCOPE_* aliases re-exposed on Client.
  • New examples/event_manager/subscribe_events.py, E2E fixtures/test for SSE, and README documentation for SSE usage and required env vars.

Reviewed changes

Copilot reviewed 26 out of 27 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/multisafepay/transport/http_transport.pyAdds HTTPStreamResponse protocol and open_stream to HTTPTransport; reorders class definitions.
src/multisafepay/transport/requests_transport.pyAdds streaming adapter _RequestsStreamResponse and shared _prepare_request used by request/open_stream.
src/multisafepay/transport/init.pyExports HTTPStreamResponse.
src/multisafepay/client/sse.pyGeneric ServerSentEvent / ServerSentEventStream parser and opener using the configured transport.
src/multisafepay/client/client.pyPublic AUTH_SCOPE_* constants re-exported from ScopedCredentialResolver.
src/multisafepay/client/init.pyRe-exports SSE types.
src/multisafepay/api/paths/events/event_manager.pyEventManager with subscribe_events / subscribe_order_events.
src/multisafepay/api/paths/events/init.pyExports EventManager.
src/multisafepay/api/paths/events/stream/init.pyEvents-path EventStream adapter wrapping the generic SSE stream.
src/multisafepay/api/paths/events/stream/response/event.pyEvent response model with recursive payload adaptation.
src/multisafepay/api/paths/events/stream/response/components/event_data.pyEventData model and EventDataPayload union.
src/multisafepay/api/paths/events/stream/response/{init,components/init}.pyPackage exports.
src/multisafepay/api/paths/orders/response/order_response.pyAdds events_* fields and _normalize_event_fields aliasing.
src/multisafepay/sdk.pyAdds get_event_manager().
examples/event_manager/subscribe_events.pyCloud POS order creation + SSE subscription example.
examples/order_manager/cloud_pos_order.pyMinor formatting cleanup.
README.mdDocuments transport streaming, event-stream usage, env vars.
.env.exampleTrailing-newline fix.
tests/multisafepay/unit/api/path/events/**Unit tests for EventManager and event-path EventStream.
tests/multisafepay/unit/api/path/orders/response/test_unit_order_response.pyTests singular/plural event field normalization.
tests/multisafepay/unit/transport/test_unit_transport.pyTest for RequestsTransport.open_stream.
tests/multisafepay/unit/test_unit_sdk.pyTest for Sdk.get_event_manager().
tests/multisafepay/unit/client/test_unit_client.pyTest for Client.AUTH_SCOPE_* aliases.
tests/multisafepay/e2e/examples/event_manager/{conftest.py,test_subscribe_events.py}E2E fixtures and test for SSE subscription against Cloud POS.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 3 comments.

Comment threadsrc/multisafepay/api/paths/events/stream/response/event.py
Comment threadsrc/multisafepay/transport/http_transport.py

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 5 comments.

Comment threadsrc/multisafepay/transport/http_transport.py
Comment threadsrc/multisafepay/api/paths/events/event_manager.py Outdated
Comment threadsrc/multisafepay/api/paths/orders/response/order_response.py
Comment threadsrc/multisafepay/api/paths/events/stream/__init__.py
Comment threadREADME.md
zulquer added 2 commits May 27, 2026 10:52
Add a runtime-checkable HTTPStreamingTransport protocol that extends HTTPTransport with open_stream and update the SDK to require it for SSE subscriptions. Adjust sse client to use isinstance checks and improve error messaging; export the new protocol from transport package. Rename order response fields to events_token/events_url/events_stream_url while keeping backward-compatible aliases, add an assertion in SSE payload adaptation, update README to document the HTTPStreamingTransport requirement, and update/add unit tests to cover the protocol split and new error messages.
@zulquer
zulquer removed the request for review from danielcivitJune 3, 2026 13:19
@zulquer
zulquer merged commit 369bdc2 into masterJun 3, 2026
6 checks passed
@zulquer
zulquer deleted the PTHMINT-119 branch June 3, 2026 13:30
Sign up for freeto 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.

3 participants

@zulquer@danielcivit
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

PTHMINT-119: SSE event stream support and EventManager - #59

Merged
zulquer merged 5 commits into
masterfrom
PTHMINT-119
Jun 3, 2026
Merged

PTHMINT-119: SSE event stream support and EventManager#59
zulquer merged 5 commits into
masterfrom
PTHMINT-119

Conversation

@zulquer

Copy link
Copy Markdown
Collaborator

This pull request introduces a new event streaming API for order events, allowing clients to subscribe to real-time updates using server-sent events (SSE). It includes new response models, event stream handling, and updates for backward compatibility with both singular and plural event field names in order responses.

The most important changes are:

Event Streaming API Implementation:

  • Added the EventManager class (event_manager.py) and its public interface (__init__.py) to manage event stream subscriptions for orders. This provides methods to subscribe to event streams using event tokens and URLs, or directly from order response objects. [1][2]
  • Introduced the EventStream class (stream/__init__.py) to handle server-sent event streams, including deserialization of payloads and context manager support. This enables iteration over live event messages from the SSE endpoint.

Event Response Models:

  • Added new response models for SSE events: Event, EventData, and EventDataPayload, including recursive deserialization for nested payloads. [1][2][3][4]

Order Response Backward Compatibility:

  • Updated the Order response model to support both singular and plural forms of event-related fields (events_token, event_token, etc.), with normalization logic to ensure compatibility with different API payloads. [1][2][3]

Example Usage:

  • Added a new example script subscribe_events.py demonstrating how to create a Cloud POS order and subscribe to its event stream using the new API.

Client Exports:

  • Re-exported ServerSentEvent and ServerSentEventStream from the client package for easier access.

@zulquer
zulquerforce-pushed the PTHMINT-118 branch 2 times, most recently from a3ccc41 to 08221e9CompareApril 30, 2026 10:40
Base automatically changed from PTHMINT-118 to masterMay 8, 2026 09:18
zulquer added 2 commits May 11, 2026 12:34
Introduce Server-Sent Events support and higher-level helpers for subscribing to order event streams. Adds multisafepay.client.sse (ServerSentEvent, ServerSentEventStream, StreamingResponse) and an EventStream adapter under api.paths.events.stream to deserialize SSE payloads into Event/EventData models. Adds EventManager for subscribing by token or from an Order response, and exposes get_event_manager() on the Sdk. Extend Order response to include events_token/events_url/events_stream_url with normalization for backward compatibility with legacy event_token/event_stream_url fields. Include an example (examples/event_manager/subscribe_events.py), update examples/order_manager/cloud_pos_order.py, update README with usage and env vars, export SSE types from client.__init__, and add unit and e2e tests for stream and manager behavior. Also contains small formatting/.env and test tweaks.
Introduce streaming HTTP support across the SDK: add HTTPStreamResponse and open_stream(...) to the HTTPTransport protocol and export HTTPStreamResponse from transport package. Update RequestsTransport to share request preparation with a new open_stream implementation and return a _RequestsStreamResponse adapter that exposes readline(), close(), and raise_for_status(). Modify SSE client and EventStream to use the configured transport.open_stream(...) (and raise a clear error if the transport lacks streaming support), and pass the client transport from EventManager to EventStream.open. Update README and unit tests to reflect streaming behavior and ensure streams are closed on failing status checks.
@codecov

codecovBot commented May 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.61%. Comparing base (01815bd) to head (1f4ad33).

Additional details and impacted files
@@ Coverage Diff @@## master #59 +/- ##
==========================================
- Coverage 92.96% 92.61% -0.35% 
==========================================
Files 172 180 +8 Lines 3027 3331 +304 ==========================================
+ Hits 2814 3085 +271 - Misses 213 246 +33 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Introduces a Server-Sent Events (SSE) subscription API for order events. Adds a transport-level streaming abstraction (HTTPStreamResponse / open_stream), a generic ServerSentEventStream parser in the client layer, an events-path EventStream + response models (Event, EventData), and an EventManager exposed via the SDK. Also adds backward-compatible singular/plural event field aliases to Order and a runnable example + E2E test for Cloud POS event streaming.

Changes:

  • New SSE streaming stack: HTTPStreamResponse protocol + RequestsTransport.open_stream adapter, ServerSentEventStream parser, events-path EventStream and response models, EventManager on the SDK.
  • Backward-compat normalization between events_* and event_* fields on Order, plus public AUTH_SCOPE_* aliases re-exposed on Client.
  • New examples/event_manager/subscribe_events.py, E2E fixtures/test for SSE, and README documentation for SSE usage and required env vars.

Reviewed changes

Copilot reviewed 26 out of 27 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/multisafepay/transport/http_transport.pyAdds HTTPStreamResponse protocol and open_stream to HTTPTransport; reorders class definitions.
src/multisafepay/transport/requests_transport.pyAdds streaming adapter _RequestsStreamResponse and shared _prepare_request used by request/open_stream.
src/multisafepay/transport/init.pyExports HTTPStreamResponse.
src/multisafepay/client/sse.pyGeneric ServerSentEvent / ServerSentEventStream parser and opener using the configured transport.
src/multisafepay/client/client.pyPublic AUTH_SCOPE_* constants re-exported from ScopedCredentialResolver.
src/multisafepay/client/init.pyRe-exports SSE types.
src/multisafepay/api/paths/events/event_manager.pyEventManager with subscribe_events / subscribe_order_events.
src/multisafepay/api/paths/events/init.pyExports EventManager.
src/multisafepay/api/paths/events/stream/init.pyEvents-path EventStream adapter wrapping the generic SSE stream.
src/multisafepay/api/paths/events/stream/response/event.pyEvent response model with recursive payload adaptation.
src/multisafepay/api/paths/events/stream/response/components/event_data.pyEventData model and EventDataPayload union.
src/multisafepay/api/paths/events/stream/response/{init,components/init}.pyPackage exports.
src/multisafepay/api/paths/orders/response/order_response.pyAdds events_* fields and _normalize_event_fields aliasing.
src/multisafepay/sdk.pyAdds get_event_manager().
examples/event_manager/subscribe_events.pyCloud POS order creation + SSE subscription example.
examples/order_manager/cloud_pos_order.pyMinor formatting cleanup.
README.mdDocuments transport streaming, event-stream usage, env vars.
.env.exampleTrailing-newline fix.
tests/multisafepay/unit/api/path/events/**Unit tests for EventManager and event-path EventStream.
tests/multisafepay/unit/api/path/orders/response/test_unit_order_response.pyTests singular/plural event field normalization.
tests/multisafepay/unit/transport/test_unit_transport.pyTest for RequestsTransport.open_stream.
tests/multisafepay/unit/test_unit_sdk.pyTest for Sdk.get_event_manager().
tests/multisafepay/unit/client/test_unit_client.pyTest for Client.AUTH_SCOPE_* aliases.
tests/multisafepay/e2e/examples/event_manager/{conftest.py,test_subscribe_events.py}E2E fixtures and test for SSE subscription against Cloud POS.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 3 comments.

Comment threadsrc/multisafepay/api/paths/events/stream/response/event.py
Comment threadsrc/multisafepay/transport/http_transport.py

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 5 comments.

Comment threadsrc/multisafepay/transport/http_transport.py
Comment threadsrc/multisafepay/api/paths/events/event_manager.py Outdated
Comment threadsrc/multisafepay/api/paths/orders/response/order_response.py
Comment threadsrc/multisafepay/api/paths/events/stream/__init__.py
Comment threadREADME.md
zulquer added 2 commits May 27, 2026 10:52
Add a runtime-checkable HTTPStreamingTransport protocol that extends HTTPTransport with open_stream and update the SDK to require it for SSE subscriptions. Adjust sse client to use isinstance checks and improve error messaging; export the new protocol from transport package. Rename order response fields to events_token/events_url/events_stream_url while keeping backward-compatible aliases, add an assertion in SSE payload adaptation, update README to document the HTTPStreamingTransport requirement, and update/add unit tests to cover the protocol split and new error messages.
@zulquer
zulquer removed the request for review from danielcivitJune 3, 2026 13:19
@zulquer
zulquer merged commit 369bdc2 into masterJun 3, 2026
6 checks passed
@zulquer
zulquer deleted the PTHMINT-119 branch June 3, 2026 13:30
Sign up for freeto 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.

3 participants

@zulquer@danielcivit
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

PTHMINT-119: SSE event stream support and EventManager - #59

Merged
zulquer merged 5 commits into
masterfrom
PTHMINT-119
Jun 3, 2026
Merged

PTHMINT-119: SSE event stream support and EventManager#59
zulquer merged 5 commits into
masterfrom
PTHMINT-119

Conversation

@zulquer

Copy link
Copy Markdown
Collaborator

This pull request introduces a new event streaming API for order events, allowing clients to subscribe to real-time updates using server-sent events (SSE). It includes new response models, event stream handling, and updates for backward compatibility with both singular and plural event field names in order responses.

The most important changes are:

Event Streaming API Implementation:

  • Added the EventManager class (event_manager.py) and its public interface (__init__.py) to manage event stream subscriptions for orders. This provides methods to subscribe to event streams using event tokens and URLs, or directly from order response objects. [1][2]
  • Introduced the EventStream class (stream/__init__.py) to handle server-sent event streams, including deserialization of payloads and context manager support. This enables iteration over live event messages from the SSE endpoint.

Event Response Models:

  • Added new response models for SSE events: Event, EventData, and EventDataPayload, including recursive deserialization for nested payloads. [1][2][3][4]

Order Response Backward Compatibility:

  • Updated the Order response model to support both singular and plural forms of event-related fields (events_token, event_token, etc.), with normalization logic to ensure compatibility with different API payloads. [1][2][3]

Example Usage:

  • Added a new example script subscribe_events.py demonstrating how to create a Cloud POS order and subscribe to its event stream using the new API.

Client Exports:

  • Re-exported ServerSentEvent and ServerSentEventStream from the client package for easier access.

@zulquer
zulquerforce-pushed the PTHMINT-118 branch 2 times, most recently from a3ccc41 to 08221e9CompareApril 30, 2026 10:40
Base automatically changed from PTHMINT-118 to masterMay 8, 2026 09:18
zulquer added 2 commits May 11, 2026 12:34
Introduce Server-Sent Events support and higher-level helpers for subscribing to order event streams. Adds multisafepay.client.sse (ServerSentEvent, ServerSentEventStream, StreamingResponse) and an EventStream adapter under api.paths.events.stream to deserialize SSE payloads into Event/EventData models. Adds EventManager for subscribing by token or from an Order response, and exposes get_event_manager() on the Sdk. Extend Order response to include events_token/events_url/events_stream_url with normalization for backward compatibility with legacy event_token/event_stream_url fields. Include an example (examples/event_manager/subscribe_events.py), update examples/order_manager/cloud_pos_order.py, update README with usage and env vars, export SSE types from client.__init__, and add unit and e2e tests for stream and manager behavior. Also contains small formatting/.env and test tweaks.
Introduce streaming HTTP support across the SDK: add HTTPStreamResponse and open_stream(...) to the HTTPTransport protocol and export HTTPStreamResponse from transport package. Update RequestsTransport to share request preparation with a new open_stream implementation and return a _RequestsStreamResponse adapter that exposes readline(), close(), and raise_for_status(). Modify SSE client and EventStream to use the configured transport.open_stream(...) (and raise a clear error if the transport lacks streaming support), and pass the client transport from EventManager to EventStream.open. Update README and unit tests to reflect streaming behavior and ensure streams are closed on failing status checks.
@codecov

codecovBot commented May 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.61%. Comparing base (01815bd) to head (1f4ad33).

Additional details and impacted files
@@ Coverage Diff @@## master #59 +/- ##
==========================================
- Coverage 92.96% 92.61% -0.35% 
==========================================
Files 172 180 +8 Lines 3027 3331 +304 ==========================================
+ Hits 2814 3085 +271 - Misses 213 246 +33 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Introduces a Server-Sent Events (SSE) subscription API for order events. Adds a transport-level streaming abstraction (HTTPStreamResponse / open_stream), a generic ServerSentEventStream parser in the client layer, an events-path EventStream + response models (Event, EventData), and an EventManager exposed via the SDK. Also adds backward-compatible singular/plural event field aliases to Order and a runnable example + E2E test for Cloud POS event streaming.

Changes:

  • New SSE streaming stack: HTTPStreamResponse protocol + RequestsTransport.open_stream adapter, ServerSentEventStream parser, events-path EventStream and response models, EventManager on the SDK.
  • Backward-compat normalization between events_* and event_* fields on Order, plus public AUTH_SCOPE_* aliases re-exposed on Client.
  • New examples/event_manager/subscribe_events.py, E2E fixtures/test for SSE, and README documentation for SSE usage and required env vars.

Reviewed changes

Copilot reviewed 26 out of 27 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/multisafepay/transport/http_transport.pyAdds HTTPStreamResponse protocol and open_stream to HTTPTransport; reorders class definitions.
src/multisafepay/transport/requests_transport.pyAdds streaming adapter _RequestsStreamResponse and shared _prepare_request used by request/open_stream.
src/multisafepay/transport/init.pyExports HTTPStreamResponse.
src/multisafepay/client/sse.pyGeneric ServerSentEvent / ServerSentEventStream parser and opener using the configured transport.
src/multisafepay/client/client.pyPublic AUTH_SCOPE_* constants re-exported from ScopedCredentialResolver.
src/multisafepay/client/init.pyRe-exports SSE types.
src/multisafepay/api/paths/events/event_manager.pyEventManager with subscribe_events / subscribe_order_events.
src/multisafepay/api/paths/events/init.pyExports EventManager.
src/multisafepay/api/paths/events/stream/init.pyEvents-path EventStream adapter wrapping the generic SSE stream.
src/multisafepay/api/paths/events/stream/response/event.pyEvent response model with recursive payload adaptation.
src/multisafepay/api/paths/events/stream/response/components/event_data.pyEventData model and EventDataPayload union.
src/multisafepay/api/paths/events/stream/response/{init,components/init}.pyPackage exports.
src/multisafepay/api/paths/orders/response/order_response.pyAdds events_* fields and _normalize_event_fields aliasing.
src/multisafepay/sdk.pyAdds get_event_manager().
examples/event_manager/subscribe_events.pyCloud POS order creation + SSE subscription example.
examples/order_manager/cloud_pos_order.pyMinor formatting cleanup.
README.mdDocuments transport streaming, event-stream usage, env vars.
.env.exampleTrailing-newline fix.
tests/multisafepay/unit/api/path/events/**Unit tests for EventManager and event-path EventStream.
tests/multisafepay/unit/api/path/orders/response/test_unit_order_response.pyTests singular/plural event field normalization.
tests/multisafepay/unit/transport/test_unit_transport.pyTest for RequestsTransport.open_stream.
tests/multisafepay/unit/test_unit_sdk.pyTest for Sdk.get_event_manager().
tests/multisafepay/unit/client/test_unit_client.pyTest for Client.AUTH_SCOPE_* aliases.
tests/multisafepay/e2e/examples/event_manager/{conftest.py,test_subscribe_events.py}E2E fixtures and test for SSE subscription against Cloud POS.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 3 comments.

Comment threadsrc/multisafepay/api/paths/events/stream/response/event.py
Comment threadsrc/multisafepay/transport/http_transport.py

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 26 out of 26 changed files in this pull request and generated 5 comments.

Comment threadsrc/multisafepay/transport/http_transport.py
Comment threadsrc/multisafepay/api/paths/events/event_manager.py Outdated
Comment threadsrc/multisafepay/api/paths/orders/response/order_response.py
Comment threadsrc/multisafepay/api/paths/events/stream/__init__.py
Comment threadREADME.md
zulquer added 2 commits May 27, 2026 10:52
Add a runtime-checkable HTTPStreamingTransport protocol that extends HTTPTransport with open_stream and update the SDK to require it for SSE subscriptions. Adjust sse client to use isinstance checks and improve error messaging; export the new protocol from transport package. Rename order response fields to events_token/events_url/events_stream_url while keeping backward-compatible aliases, add an assertion in SSE payload adaptation, update README to document the HTTPStreamingTransport requirement, and update/add unit tests to cover the protocol split and new error messages.
@zulquer
zulquer removed the request for review from danielcivitJune 3, 2026 13:19
@zulquer
zulquer merged commit 369bdc2 into masterJun 3, 2026
6 checks passed
@zulquer
zulquer deleted the PTHMINT-119 branch June 3, 2026 13:30
Sign up for freeto 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.

3 participants

@zulquer@danielcivit