|
| 1 | +import { Accounts } from 'meteor/accounts-base'; |
1 | 2 | import { DDPCommon } from 'meteor/ddp-common'; |
2 | 3 | import { Meteor } from 'meteor/meteor'; |
3 | 4 | import { Tracker } from 'meteor/tracker'; |
@@ -233,14 +234,47 @@ queueMicrotask(() => { |
233 | 234 | // ddpSdkCollectionBridge. |
234 | 235 | const sdk = getDdpSdk(); |
235 | 236 | let firstConnectHandled = false; |
| 237 | +let reconnectCount = 0; |
236 | 238 | sdk.connection.on('connected', () => { |
237 | 239 | if (!firstConnectHandled) { |
238 | 240 | firstConnectHandled = true; |
| 241 | + console.warn('[stubMeteorStream] first SDK connected (no reset)'); |
239 | 242 | return; |
240 | 243 | } |
| 244 | + reconnectCount += 1; |
| 245 | + const storedToken = typeof window !== 'undefined' ? window.localStorage.getItem('Meteor.loginToken') : null; |
| 246 | + console.warn(`[stubMeteorStream] SDK reconnect #${reconnectCount} — firing reset`, { |
| 247 | + storedToken: storedToken ? `${storedToken.slice(0, 6)}…` : null, |
| 248 | + userId: (Meteor.connection as unknown as { _userId?: string | null })._userId ?? null, |
| 249 | + }); |
241 | 250 | try { |
242 | 251 | fire('reset'); |
243 | 252 | } catch (err) { |
244 | 253 | console.warn('[stubMeteorStream] reset on SDK reconnect failed', err); |
245 | 254 | } |
246 | 255 | }); |
| 256 | + |
| 257 | +// Diagnostic: wrap _pollStoredLoginToken to log every call so we can see |
| 258 | +// whether the test's loginByUserState actually triggers a login on the |
| 259 | +// failing :87 cycle, or whether it short-circuits because the cached |
| 260 | +// _lastLoginTokenWhenPolled still matches what's in storage. |
| 261 | +{ |
| 262 | + const acc = Accounts as unknown as { |
| 263 | + _pollStoredLoginToken?: () => void; |
| 264 | + _lastLoginTokenWhenPolled?: string | null; |
| 265 | + _storedLoginToken?: () => string | null; |
| 266 | + }; |
| 267 | + const originalPoll = acc._pollStoredLoginToken; |
| 268 | + if (typeof originalPoll === 'function') { |
| 269 | + acc._pollStoredLoginToken = function patchedPoll(this: typeof acc): void { |
| 270 | + const current = acc._storedLoginToken?.() ?? null; |
| 271 | + const last = acc._lastLoginTokenWhenPolled ?? null; |
| 272 | + console.warn('[stubMeteorStream] _pollStoredLoginToken', { |
| 273 | + current: current ? `${current.slice(0, 6)}…` : null, |
| 274 | + last: last ? `${last.slice(0, 6)}…` : null, |
| 275 | + willFire: current !== last, |
| 276 | + }); |
| 277 | + return originalPoll.call(this); |
| 278 | + }; |
| 279 | + } |
| 280 | +} |
0 commit comments