feat: define reporting service contracts and dispatchers#1224
feat: define reporting service contracts and dispatchers#1224alexs-mparticle wants to merge 15 commits intodevelopmentfrom
Conversation
…dule - Define IErrorReportingService, ILoggingService, ISDKError, ISDKLogEntry contracts - Add ErrorReportingDispatcher and LoggingDispatcher for multi-service fan-out - Decouple Logger from reporting (console-only now) - Remove concrete ReportingLogger implementation (moves to kit) - Remove Rokt-specific URLs from constants - Rename src/logging/ to src/reporting/ - Expose registerErrorReportingService/registerLoggingService on mParticle API
PR SummaryMedium Risk Overview Introduces structured reporting contracts in Updates Written by Cursor Bugbot for commit e1b78da. This will update automatically on new commits. Configure here. |
- Add optional chaining for _ErrorReportingDispatcher in identityApiClient so tests without a mock dispatcher don't crash - Add registerErrorReportingService and registerLoggingService to the expected public API keys in instance manager test
This reverts commit e573c1f.
…ning Reverts optional chaining on _ErrorReportingDispatcher.report() which was masking potential bugs. Instead, properly adds ErrorReportingDispatcher instances to all mock mpInstance objects in identity API client tests.
…uctor - Wrap each service call in try-catch in ErrorReportingDispatcher and LoggingDispatcher so one failing service doesn't break fan-out - Move dispatcher instantiation from runPreConfigFetchInitialization to mParticleInstance constructor so registration works before init() - Destructure errorReporter in identityApiClient for cleaner usage
Rename registerErrorReportingService/registerLoggingService to _registerErrorReportingService/_registerLoggingService to signal these are internal APIs consumed by kits, not public.
Pass ErrorReportingDispatcher and LoggingDispatcher into RoktManager.init() from mp-instance. Add INFO log on kit attach (ROKT_KIT_ATTACHED) and WARNING reports on identity mismatch (IDENTITY_MISMATCH) alongside existing logger.warning calls. Add new error codes to reporting types.
… mocks The identity API client test mocks were missing _ErrorReportingDispatcher, causing a TypeError when report() was called on 5xx errors. Added optional chaining to the call site and added the mock to both test cases.
Merge development into feat/reporting-service-migration-core, resolving conflicts in dist/ bundle files by accepting development's versions (CI will regenerate these after merge).
|
|
||
| this.loggingService?.log({ | ||
| message: 'RoktManager: Kit attached, Rokt is ready', | ||
| code: ErrorCodes.ROKT_KIT_ATTACHED, |
| const accountId = '9876543210'; | ||
| const integrationName = 'test-integration'; | ||
| describe('Logger is decoupled from reporting', () => { | ||
| it('Logger.error() does not trigger any reporting', () => { |
There was a problem hiding this comment.
This test doesn't seem to do what you're claiming it does. I'd remove...all it does is test that no error is thrown. The test below this proves that logger is decoupled from reporting
| it('log() is a no-op when no services are registered', () => { | ||
| // Should not throw | ||
| dispatcher.log({ | ||
| message: 'test', |
There was a problem hiding this comment.
Test name is awkward here. also isn't doing what you are asserting. (There is no assertion). This is also obvious, but how about
const mockService: ILoggingService = { log: jest.fn() };
// Intentionally NOT registering mockService on this dispatcher
dispatcher.log({ message: 'test' });
expect(mockService.log).not.toHaveBeenCalled();
The TODO indicated this cast should be removed once removeCCPAState was removed. Since removeCCPAState is being removed in this PR, the cast is no longer needed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This reverts commit e84e375.
|
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
| UNHANDLED_EXCEPTION: 'UNHANDLED_EXCEPTION', | ||
| IDENTITY_REQUEST: 'IDENTITY_REQUEST', | ||
| IDENTITY_MISMATCH: 'IDENTITY_MISMATCH', | ||
| ROKT_KIT_ATTACHED: 'ROKT_KIT_ATTACHED', |
There was a problem hiding this comment.
Informational event misclassified as an error code
Low Severity
ROKT_KIT_ATTACHED is defined in the ErrorCodes enum but represents a successful informational event ("Kit attached, Rokt is ready"), not an error or warning. It's only used in loggingService?.log(...), the informational logging path. Placing a success event in an enum named ErrorCodes is misleading and could confuse consumers implementing ILoggingService or IErrorReportingService contracts. As the reviewer noted, this doesn't belong in ErrorCodes.
Additional Locations (1)
| value: { userAgent: 'test-user-agent' } | ||
| // Logger.error() should only output to console - no reporting side effects | ||
| // This verifies the decoupling is complete | ||
| expect(() => logger.error('test error')).not.toThrow(); |
There was a problem hiding this comment.
Test asserts no-throw instead of verifying decoupling
Low Severity
The test named "Logger.error() does not trigger any reporting" only asserts not.toThrow(). It creates no mock services and makes no assertions about reporting behavior, so it doesn't actually verify the decoupling claim in its name. The subsequent test already proves the decoupling properly, making this test redundant and misleading.





Summary
IErrorReportingServiceandILoggingServiceinterfaces insrc/reporting/types.tsErrorReportingDispatcherandLoggingDispatcherfor multi-service fan-outLoggerfrom reporting — Logger is now console-onlyReportingLoggerimplementation (moves to Rokt kit)src/logging/tosrc/reporting/registerErrorReportingService()andregisterLoggingService()on mParticle APICompanion kit PR: mparticle-integrations/mparticle-javascript-integration-rokt#70
Test plan
window.mParticle