Skip to content

Commit 9822e12

Browse files
Fix experimentalAutoDetectLongPolling and add logging (#4078)
1 parent 27438f1 commit 9822e12

File tree

7 files changed

+100
-43
lines changed

7 files changed

+100
-43
lines changed

.changeset/proud-pigs-work.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@firebase/firestore": patch
3+
"@firebase/webchannel-wrapper": patch
4+
---
5+
6+
Fix an issue that prevented `experimentalAutoDetectLongPolling` from working correctly.

packages/firestore/src/platform/browser/webchannel_connection.ts

+24-8
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@ import {
2222
WebChannel,
2323
WebChannelError,
2424
WebChannelOptions,
25-
XhrIo
25+
XhrIo,
26+
getStatEventTarget,
27+
EventTarget,
28+
StatEvent,
29+
Event,
30+
Stat
2631
} from '@firebase/webchannel-wrapper';
2732

2833
import {
@@ -164,6 +169,7 @@ export class WebChannelConnection extends RestConnection {
164169
'/channel'
165170
];
166171
const webchannelTransport = createWebChannelTransport();
172+
const requestStats = getStatEventTarget();
167173
const request: WebChannelOptions = {
168174
// Required for backend stickiness, routing behavior is based on this
169175
// parameter.
@@ -257,12 +263,13 @@ export class WebChannelConnection extends RestConnection {
257263
// Note that eventually this function could go away if we are confident
258264
// enough the code is exception free.
259265
const unguardedEventListen = <T>(
260-
type: string,
261-
fn: (param?: T) => void
266+
target: EventTarget,
267+
type: string | number,
268+
fn: (param: T) => void
262269
): void => {
263270
// TODO(dimond): closure typing seems broken because WebChannel does
264271
// not implement goog.events.Listenable
265-
channel.listen(type, (param: unknown) => {
272+
target.listen(type, (param: unknown) => {
266273
try {
267274
fn(param as T);
268275
} catch (e) {
@@ -273,21 +280,21 @@ export class WebChannelConnection extends RestConnection {
273280
});
274281
};
275282

276-
unguardedEventListen(WebChannel.EventType.OPEN, () => {
283+
unguardedEventListen(channel, WebChannel.EventType.OPEN, () => {
277284
if (!closed) {
278285
logDebug(LOG_TAG, 'WebChannel transport opened.');
279286
}
280287
});
281288

282-
unguardedEventListen(WebChannel.EventType.CLOSE, () => {
289+
unguardedEventListen(channel, WebChannel.EventType.CLOSE, () => {
283290
if (!closed) {
284291
closed = true;
285292
logDebug(LOG_TAG, 'WebChannel transport closed');
286293
streamBridge.callOnClose();
287294
}
288295
});
289296

290-
unguardedEventListen<Error>(WebChannel.EventType.ERROR, err => {
297+
unguardedEventListen<Error>(channel, WebChannel.EventType.ERROR, err => {
291298
if (!closed) {
292299
closed = true;
293300
logWarn(LOG_TAG, 'WebChannel transport errored:', err);
@@ -308,10 +315,11 @@ export class WebChannelConnection extends RestConnection {
308315
}
309316

310317
unguardedEventListen<WebChannelResponse>(
318+
channel,
311319
WebChannel.EventType.MESSAGE,
312320
msg => {
313321
if (!closed) {
314-
const msgData = msg!.data[0];
322+
const msgData = msg.data[0];
315323
hardAssert(!!msgData, 'Got a webchannel message without data.');
316324
// TODO(b/35143891): There is a bug in One Platform that caused errors
317325
// (and only errors) to be wrapped in an extra array. To be forward
@@ -348,6 +356,14 @@ export class WebChannelConnection extends RestConnection {
348356
}
349357
);
350358

359+
unguardedEventListen<StatEvent>(requestStats, Event.STAT_EVENT, event => {
360+
if (event.stat === Stat.PROXY) {
361+
logDebug(LOG_TAG, 'Detected buffering proxy');
362+
} else if (event.stat === Stat.NOPROXY) {
363+
logDebug(LOG_TAG, 'Detected no buffering proxy');
364+
}
365+
});
366+
351367
setTimeout(() => {
352368
// Technically we could/should wait for the WebChannel opened event,
353369
// but because we want to send the first message with the WebChannel

packages/webchannel-wrapper/externs/overrides.js

+13
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,16 @@ goog.net.WebChannel.Options.internalChannelParams;
6464

6565
/** @type {boolean|undefined} */
6666
goog.net.WebChannel.Options.forceLongPolling;
67+
68+
/** @type {boolean|undefined} */
69+
goog.net.WebChannel.Options.detectBufferingProxy;
70+
71+
goog.labs.net.webChannel.requestStats.Event = {};
72+
goog.labs.net.webChannel.requestStats.Event.STAT_EVENT;
73+
74+
goog.labs.net.webChannel.requestStats.StatEvent = {};
75+
goog.labs.net.webChannel.requestStats.StatEvent.stat;
76+
77+
goog.labs.net.webChannel.requestStats.Stat = {};
78+
goog.labs.net.webChannel.requestStats.Stat.PROXY;
79+
goog.labs.net.webChannel.requestStats.Stat.NOPROXY;

packages/webchannel-wrapper/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
},
1717
"license": "Apache-2.0",
1818
"devDependencies": {
19-
"google-closure-compiler": "20200628.0.0",
20-
"google-closure-library": "20200830.0.0",
19+
"google-closure-compiler": "20201102.0.1",
20+
"google-closure-library": "20201006.0.0",
2121
"gulp": "4.0.2",
2222
"gulp-sourcemaps": "2.6.5",
2323
"rollup": "2.33.2",

packages/webchannel-wrapper/src/index.d.ts

+20-2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,15 @@ export namespace WebChannel {
3131
};
3232
}
3333

34+
export var Event: {
35+
STAT_EVENT: string;
36+
};
37+
38+
export var Stat: {
39+
PROXY: number;
40+
NOPROXY: number;
41+
};
42+
3443
export var ErrorCode: {
3544
NO_ERROR: number;
3645
HTTP_ERROR: number;
@@ -100,15 +109,24 @@ export interface WebChannelOptions {
100109
requestRefreshThresholds?: { [key: string]: number };
101110
}
102111

103-
export interface WebChannel {
112+
export interface EventTarget {
113+
listen(type: string | number, cb: (param: unknown) => void): void;
114+
}
115+
116+
export interface WebChannel extends EventTarget {
104117
open(): void;
105118
close(): void;
106-
listen(type: string, cb: (param: unknown) => void): void;
107119
send(msg: unknown): void;
108120
}
109121

122+
export interface StatEvent {
123+
stat: number;
124+
}
125+
110126
export interface WebChannelTransport {
111127
createWebChannel(url: string, options: WebChannelOptions): WebChannel;
112128
}
113129

114130
export function createWebChannelTransport(): WebChannelTransport;
131+
132+
export function getStatEventTarget(): EventTarget;

packages/webchannel-wrapper/src/index.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ goog.provide('firebase.webchannel.wrapper');
2323

2424
// goog.net.WebChannelTransport
2525
goog.require('goog.net.createWebChannelTransport');
26+
goog.require('goog.labs.net.webChannel.requestStats');
2627
goog.require('goog.labs.net.webChannel.WebChannelBaseTransport');
28+
2729
/**
2830
* NOTE: The `createWebChannel` function takes an options object as a second param
2931
* whose properties are typically mangled. We override these in externs/overrides.js
@@ -60,7 +62,6 @@ goog.net.WebChannel.EventType['MESSAGE'] =
6062
goog.events.EventTarget.prototype['listen'] =
6163
goog.events.EventTarget.prototype.listen;
6264

63-
// goog.net.XhrIo
6465
goog.require('goog.net.XhrIo');
6566
goog.net.XhrIo.prototype['listenOnce'] = goog.net.XhrIo.prototype.listenOnce;
6667
goog.net.XhrIo.prototype['getLastError'] =
@@ -76,7 +77,11 @@ goog.net.XhrIo.prototype['send'] = goog.net.XhrIo.prototype.send;
7677

7778
module['exports']['createWebChannelTransport'] =
7879
goog.net.createWebChannelTransport;
80+
module['exports']['getStatEventTarget'] =
81+
goog.labs.net.webChannel.requestStats.getStatEventTarget;
7982
module['exports']['ErrorCode'] = goog.net.ErrorCode;
8083
module['exports']['EventType'] = goog.net.EventType;
84+
module['exports']['Event'] = goog.labs.net.webChannel.requestStats.Event;
85+
module['exports']['Stat'] = goog.labs.net.webChannel.requestStats.Stat;
8186
module['exports']['WebChannel'] = goog.net.WebChannel;
8287
module['exports']['XhrIo'] = goog.net.XhrIo;

yarn.lock

+29-30
Original file line numberDiff line numberDiff line change
@@ -8137,50 +8137,45 @@ google-closure-compiler-java@^20200112.0.0:
81378137
resolved "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20200112.0.0.tgz#2b99f5e2869a573a1b35558ff3b6e6bc054a116f"
81388138
integrity sha512-h/ExDCXAw88nOniQSbbK6et31kOwmaDxl6t52dnETCIzituQtGToPzy21vUel1o8o+FvWUybLoap+dEYBam1pA==
81398139

8140-
google-closure-compiler-java@^20200628.0.0:
8141-
version "20200628.0.0"
8142-
resolved "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20200628.0.0.tgz#cb9138001acd7fb6195b1d0c2d3c6205a85389d1"
8143-
integrity sha512-ikQEHiuaRR8d3w4QWsJqC2baDfoIyw/KqDW7LXyxbq6WpRiJ+ItTAtShVoqzQTyn3IXVL8viUMGb/AxkUv01RA==
8140+
google-closure-compiler-java@^20201102.0.1:
8141+
version "20201102.0.1"
8142+
resolved "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20201102.0.1.tgz#15fa3e0701ee1a756168fdaf3b53fe61425b1b64"
8143+
integrity sha512-pXJIlyqepHhih0HCbShkAZJyViIxdyd4V7MnCUZEXLIIlygw92e2dC+5XiONDQZgRlF93BPmWCy9jr7wYoW1hQ==
81448144

81458145
google-closure-compiler-js@^20200112.0.0:
81468146
version "20200112.0.0"
81478147
resolved "https://registry.npmjs.org/google-closure-compiler-js/-/google-closure-compiler-js-20200112.0.0.tgz#cb9fc1636671f3ce927e668e29db69b65cae6f2d"
81488148
integrity sha512-xW47rSuiRaql6q1YN7+b3FXIW74b1nCcENVwm9cigw1H5gWoBMBJOmpZiXnjMfmYC+MALjPQ8giMzvSeP+2X5A==
81498149

8150-
google-closure-compiler-js@^20200628.0.0:
8151-
version "20200628.0.0"
8152-
resolved "https://registry.npmjs.org/google-closure-compiler-js/-/google-closure-compiler-js-20200628.0.0.tgz#476d50d8b5155dd9d923a1394e0af76bcc8905ec"
8153-
integrity sha512-kGO/fvKDNOawBmzpWEzLW2EMb0ikTc0Y1hZEedLOex/cOm9zc5Cn8w2L0f963ydgFcj4fszzIgAtmZ9CRxqkfg==
8154-
81558150
google-closure-compiler-linux@^20200112.0.0:
81568151
version "20200112.0.0"
81578152
resolved "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20200112.0.0.tgz#e6c7943cc0114046dbe9fc685e4d7d4eb536c1dc"
81588153
integrity sha512-imTfdYP7BVTzzp3y7MuZP+98nEkbX7LZsZtxalNpl56vd+Ysc9/vOHXS14CdSoThaXIVlzX/lfjOlBRqPow+ew==
81598154

8160-
google-closure-compiler-linux@^20200628.0.0:
8161-
version "20200628.0.0"
8162-
resolved "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20200628.0.0.tgz#25de6807f13f066a0329384b39c605f5b03484f2"
8163-
integrity sha512-SSglqHEW+PtHCOXPwhZFxFzRVxXdvyunkfwP0y2FAO2b0xF6lRfrZSgs0/lgkwlcO2RHnJtIhU8y4bzYMn24QQ==
8155+
google-closure-compiler-linux@^20201102.0.1:
8156+
version "20201102.0.1"
8157+
resolved "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20201102.0.1.tgz#a66f18142866c5d3186d0d0c0809538d38f7b998"
8158+
integrity sha512-aRbyTGnQoFXchcpEFNrP1p/WIvYOgN3hYKI+MOHWkvwVJBY2P8gpb07hAigO8fj+QKD/SFCl+2pXP+JniWOEqw==
81648159

81658160
google-closure-compiler-osx@^20200112.0.0:
81668161
version "20200112.0.0"
81678162
resolved "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20200112.0.0.tgz#df7a22c0dc32702b47c8ac4521f79bbe439effad"
81688163
integrity sha512-E3S1KqZw4+Zov0VXCkjomPrYhyuuV6jH9InBchQ7cZfipFJjhQmSRf39u4Mu0sINW7GXfODZbzBwOXhEIquFQw==
81698164

8170-
google-closure-compiler-osx@^20200628.0.0:
8171-
version "20200628.0.0"
8172-
resolved "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20200628.0.0.tgz#d4e8c0a0cfea1fcf935f7af0db46cdcebeabe308"
8173-
integrity sha512-Ntd/kYqjYu7CScvne0yscZGqQV19y7BCu5PXxGtcs9G5KLe7Ep9RxPWznvFGZXky5vPc6Yq9p6E2uOhpA20cIg==
8165+
google-closure-compiler-osx@^20201102.0.1:
8166+
version "20201102.0.1"
8167+
resolved "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20201102.0.1.tgz#5099b29a7db553ded849e06cbbce194ecf9cd231"
8168+
integrity sha512-VguqEAOYI6XYZN6JcLMP8fpsoXk1Z9YuntMjv0IDVydkbZaHYOI4zE39FJhMuWiN7gOzSX2b/BBC6GsSh1F3fw==
81748169

81758170
google-closure-compiler-windows@^20200112.0.0:
81768171
version "20200112.0.0"
81778172
resolved "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20200112.0.0.tgz#8300d1e651f2c84ed565e729ccf40d6ed7e63771"
81788173
integrity sha512-+5+UJFKXH0LGnYEHSVJxWwhtvX/MI6uebkAQkhma0057QsKs8fOToWuHL8/UbJULB4WUPa3DlHy0+Izs5z6lCQ==
81798174

8180-
google-closure-compiler-windows@^20200628.0.0:
8181-
version "20200628.0.0"
8182-
resolved "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20200628.0.0.tgz#6b175fd2e432576c86575248b4634c8c58e738a3"
8183-
integrity sha512-Il4NIhzvemgEk2kC33tDj9HVpqXEU8SmS1f3AmkLMAUbSI5FdBBzTqjLRa8Y/ucEz4nTRqvpTvbOG3vhIVUUWw==
8175+
google-closure-compiler-windows@^20201102.0.1:
8176+
version "20201102.0.1"
8177+
resolved "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20201102.0.1.tgz#8b6c5c3f7050a738b71c59f9dd9863fb6cca282a"
8178+
integrity sha512-LlynipQi/iP76mjkOu6Rc1mCRuxTAhRvLjq10aGfVjKwpbCAF0Jq2a5k2ygr4xYiINNi2/L2qUw6ObPm9wQCOw==
81848179

81858180
81868181
version "20200112.0.0"
@@ -8198,27 +8193,31 @@ [email protected]:
81988193
google-closure-compiler-osx "^20200112.0.0"
81998194
google-closure-compiler-windows "^20200112.0.0"
82008195

8201-
google-closure-compiler@20200628.0.0:
8202-
version "20200628.0.0"
8203-
resolved "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20200628.0.0.tgz#939e8be9b27fb4504d051263ef0b96d75e444a57"
8204-
integrity sha512-ZMhFmlzNCWdL43UbTHzdFa4fgAfBR37TbAOKLSLUATT3RvCNu0AvX0rQBuJNzmI21ySsM9T3r5WXPBwiL0Hn4g==
8196+
google-closure-compiler@20201102.0.1:
8197+
version "20201102.0.1"
8198+
resolved "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20201102.0.1.tgz#372670b1b047969d12de663698593e31944ad1bf"
8199+
integrity sha512-Cz+1jOswH0MwMVPu1rRH1xD4KYuY5XW2ox5aXwqaAxevqmirhr36f8wgKPHuVRSovFejW640r6UFwyrOT6U0CA==
82058200
dependencies:
82068201
chalk "2.x"
8207-
google-closure-compiler-java "^20200628.0.0"
8208-
google-closure-compiler-js "^20200628.0.0"
8202+
google-closure-compiler-java "^20201102.0.1"
82098203
minimist "1.x"
82108204
vinyl "2.x"
82118205
vinyl-sourcemaps-apply "^0.2.0"
82128206
optionalDependencies:
8213-
google-closure-compiler-linux "^20200628.0.0"
8214-
google-closure-compiler-osx "^20200628.0.0"
8215-
google-closure-compiler-windows "^20200628.0.0"
8207+
google-closure-compiler-linux "^20201102.0.1"
8208+
google-closure-compiler-osx "^20201102.0.1"
8209+
google-closure-compiler-windows "^20201102.0.1"
82168210

82178211
82188212
version "20200830.0.0"
82198213
resolved "https://registry.npmjs.org/google-closure-library/-/google-closure-library-20200830.0.0.tgz#9f3807e5a4af55ebf2c8a22853d53b8da39a48e8"
82208214
integrity sha512-s4ma73K+FTeVywSMjVOxQ435t6kPfSlxEtIflq7Gabp2fxAnc9i8vUpvT8ZP/GH89LwSJReIaBGtrn72rfNC5Q==
82218215

8216+
8217+
version "20201006.0.0"
8218+
resolved "https://registry.npmjs.org/google-closure-library/-/google-closure-library-20201006.0.0.tgz#5b2f325309566a63b97e22e57c71263fa98f22b4"
8219+
integrity sha512-jYTKvUBUkTFCO+PJLcqJrh4BNMHlInzPYpijg8lty/HIF1rH+qutHchlFdiSNad8HBVKIlMf3UzXRPXvmujrIg==
8220+
82228221
google-gax@^1.14.2:
82238222
version "1.15.3"
82248223
resolved "https://registry.npmjs.org/google-gax/-/google-gax-1.15.3.tgz#e88cdcbbd19c7d88cc5fd7d7b932c4d1979a5aca"

0 commit comments

Comments
 (0)