Skip to content

Commit c873f5d

Browse files
author
Greg Soltis
committed
Fix merge from master
2 parents bad151c + 950499d commit c873f5d

31 files changed

+321
-76
lines changed

integration/browserify/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"test": "karma start --single-run"
88
},
99
"dependencies": {
10-
"firebase": "5.5.1"
10+
"firebase": "5.5.2"
1111
},
1212
"devDependencies": {
1313
"@babel/core": "7.0.0-beta.47",

integration/firebase-typings/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"test": "tsc index.ts --outDir dist"
77
},
88
"dependencies": {
9-
"firebase": "5.5.1"
9+
"firebase": "5.5.2"
1010
},
1111
"devDependencies": {
1212
"typescript": "2.8.1"

integration/messaging/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"test:manual": "mocha --exit"
99
},
1010
"dependencies": {
11-
"firebase": "5.5.1"
11+
"firebase": "5.5.2"
1212
},
1313
"devDependencies": {
1414
"chai": "4.1.2",

integration/typescript/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"test": "karma start --single-run"
77
},
88
"dependencies": {
9-
"firebase": "5.5.1"
9+
"firebase": "5.5.2"
1010
},
1111
"devDependencies": {
1212
"@babel/core": "7.0.0-beta.47",

integration/webpack/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"test": "karma start --single-run"
88
},
99
"dependencies": {
10-
"firebase": "5.5.1"
10+
"firebase": "5.5.2"
1111
},
1212
"devDependencies": {
1313
"@babel/core": "7.0.0-beta.47",

packages/auth/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@firebase/auth",
3-
"version": "0.7.6",
3+
"version": "0.7.7",
44
"main": "dist/auth.js",
55
"module": "dist/auth.esm.js",
66
"description": "Javascript library for Firebase Auth SDK",

packages/auth/src/error_auth.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ fireauth.authenum.Error = {
174174
QUOTA_EXCEEDED: 'quota-exceeded',
175175
REDIRECT_CANCELLED_BY_USER: 'redirect-cancelled-by-user',
176176
REDIRECT_OPERATION_PENDING: 'redirect-operation-pending',
177+
REJECTED_CREDENTIAL: 'rejected-credential',
177178
TIMEOUT: 'timeout',
178179
TOKEN_EXPIRED: 'user-token-expired',
179180
TOO_MANY_ATTEMPTS_TRY_LATER: 'too-many-requests',
@@ -368,6 +369,8 @@ fireauth.AuthError.MESSAGES_[
368369
fireauth.AuthError.MESSAGES_[
369370
fireauth.authenum.Error.REDIRECT_OPERATION_PENDING] =
370371
'A redirect sign-in operation is already pending.';
372+
fireauth.AuthError.MESSAGES_[fireauth.authenum.Error.REJECTED_CREDENTIAL] =
373+
'The request contains malformed or mismatching credentials.';
371374
fireauth.AuthError.MESSAGES_[fireauth.authenum.Error.TIMEOUT] =
372375
'The operation has timed out.';
373376
fireauth.AuthError.MESSAGES_[

packages/auth/src/rpchandler.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ fireauth.RpcHandler.ServerError = {
226226
PASSWORD_LOGIN_DISABLED: 'PASSWORD_LOGIN_DISABLED',
227227
QUOTA_EXCEEDED: 'QUOTA_EXCEEDED',
228228
RESET_PASSWORD_EXCEED_LIMIT: 'RESET_PASSWORD_EXCEED_LIMIT',
229+
REJECTED_CREDENTIAL: 'REJECTED_CREDENTIAL',
229230
SESSION_EXPIRED: 'SESSION_EXPIRED',
230231
TOKEN_EXPIRED: 'TOKEN_EXPIRED',
231232
TOO_MANY_ATTEMPTS_TRY_LATER: 'TOO_MANY_ATTEMPTS_TRY_LATER',
@@ -2306,6 +2307,8 @@ fireauth.RpcHandler.getDeveloperError_ =
23062307
fireauth.authenum.Error.QUOTA_EXCEEDED;
23072308
errorMap[fireauth.RpcHandler.ServerError.SESSION_EXPIRED] =
23082309
fireauth.authenum.Error.CODE_EXPIRED;
2310+
errorMap[fireauth.RpcHandler.ServerError.REJECTED_CREDENTIAL] =
2311+
fireauth.authenum.Error.REJECTED_CREDENTIAL;
23092312

23102313
// Other action code errors when additional settings passed.
23112314
errorMap[fireauth.RpcHandler.ServerError.INVALID_CONTINUE_URI] =

packages/auth/test/rpchandler_test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5573,6 +5573,8 @@ function testSendVerificationCode_caughtServerError() {
55735573
fireauth.authenum.Error.MISSING_PHONE_NUMBER;
55745574
errorMap[fireauth.RpcHandler.ServerError.QUOTA_EXCEEDED] =
55755575
fireauth.authenum.Error.QUOTA_EXCEEDED;
5576+
errorMap[fireauth.RpcHandler.ServerError.REJECTED_CREDENTIAL] =
5577+
fireauth.authenum.Error.REJECTED_CREDENTIAL;
55765578

55775579
assertServerErrorsAreHandled(function() {
55785580
return rpcHandler.sendVerificationCode(requestBody);
@@ -5779,6 +5781,8 @@ function testVerifyPhoneNumber_caughtServerError() {
57795781
fireauth.authenum.Error.MISSING_SESSION_INFO;
57805782
errorMap[fireauth.RpcHandler.ServerError.SESSION_EXPIRED] =
57815783
fireauth.authenum.Error.CODE_EXPIRED;
5784+
errorMap[fireauth.RpcHandler.ServerError.REJECTED_CREDENTIAL] =
5785+
fireauth.authenum.Error.REJECTED_CREDENTIAL;
57825786

57835787
assertServerErrorsAreHandled(function() {
57845788
return rpcHandler.verifyPhoneNumber(requestBody);

packages/firebase/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ declare namespace firebase {
105105

106106
function app(name?: string): firebase.app.App;
107107

108-
var apps: (firebase.app.App | null)[];
108+
var apps: firebase.app.App[];
109109

110110
function auth(app?: firebase.app.App): firebase.auth.Auth;
111111

packages/firebase/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "firebase",
3-
"version": "5.5.1",
3+
"version": "5.5.2",
44
"description": "Firebase JavaScript library for web and Node.js",
55
"author": "Firebase <[email protected]> (https://firebase.google.com/)",
66
"license": "Apache-2.0",
@@ -36,9 +36,9 @@
3636
"react-native": "dist/index.rn.cjs.js",
3737
"dependencies": {
3838
"@firebase/app": "0.3.4",
39-
"@firebase/auth": "0.7.6",
39+
"@firebase/auth": "0.7.7",
4040
"@firebase/database": "0.3.6",
41-
"@firebase/firestore": "0.8.1",
41+
"@firebase/firestore": "0.8.2",
4242
"@firebase/functions": "0.3.1",
4343
"@firebase/messaging": "0.3.6",
4444
"@firebase/polyfill": "0.3.3",

packages/firestore/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@firebase/firestore",
3-
"version": "0.8.1",
3+
"version": "0.8.2",
44
"description": "",
55
"author": "Firebase <[email protected]> (https://firebase.google.com/)",
66
"scripts": {
@@ -27,7 +27,7 @@
2727
"dependencies": {
2828
"@firebase/firestore-types": "0.7.0",
2929
"@firebase/logger": "0.1.1",
30-
"@firebase/webchannel-wrapper": "0.2.9",
30+
"@firebase/webchannel-wrapper": "0.2.10",
3131
"grpc": "1.13.1",
3232
"tslib": "1.9.0"
3333
},

packages/firestore/src/core/sync_engine.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,7 @@ export class SyncEngine implements RemoteSyncer, SharedClientStateSyncer {
684684
queryView.targetId
685685
);
686686
this.limboDocumentRefs.removeReferencesForId(queryView.targetId);
687-
await PersistencePromise.forEach(limboKeys.toArray(), limboKey => {
687+
await PersistencePromise.forEach(limboKeys, limboKey => {
688688
return this.limboDocumentRefs
689689
.containsKey(null, limboKey)
690690
.next(isReferenced => {

packages/firestore/src/local/indexeddb_persistence.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ import { DatabaseInfo } from '../core/database_info';
1919
import { ListenSequence, SequenceNumberSyncer } from '../core/listen_sequence';
2020
import { ListenSequenceNumber, TargetId } from '../core/types';
2121
import { DocumentKey } from '../model/document_key';
22+
import { Platform } from '../platform/platform';
2223
import { JsonProtoSerializer } from '../remote/serializer';
2324
import { assert, fail } from '../util/assert';
25+
import { AsyncQueue, TimerId } from '../util/async_queue';
2426
import { Code, FirestoreError } from '../util/error';
2527
import * as log from '../util/log';
26-
27-
import { Platform } from '../platform/platform';
28-
import { AsyncQueue, TimerId } from '../util/async_queue';
2928
import { CancelablePromise } from '../util/promise';
29+
3030
import { decode, encode, EncodedResourcePath } from './encoded_resource_path';
3131
import {
3232
IndexedDbMutationQueue,

packages/firestore/src/local/persistence_promise.ts

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -170,49 +170,70 @@ export class PersistencePromise<T> {
170170

171171
static waitFor(
172172
// tslint:disable-next-line:no-any Accept all Promise types in waitFor().
173-
all: Array<PersistencePromise<any>>
173+
all: Iterable<PersistencePromise<any>>
174174
): PersistencePromise<void> {
175-
const expectedCount = all.length;
176-
if (expectedCount === 0) {
177-
return PersistencePromise.resolve();
178-
}
179-
180-
let resolvedCount = 0;
175+
const it = all[Symbol.iterator]();
181176
return new PersistencePromise<void>((resolve, reject) => {
182-
for (const promise of all) {
183-
promise.next(
177+
let expectedCount = 0;
178+
let resolvedCount = 0;
179+
180+
let result = it.next();
181+
while (!result.done) {
182+
++expectedCount;
183+
result.value.next(
184184
() => {
185185
++resolvedCount;
186-
if (resolvedCount === expectedCount) {
186+
if (result.done && resolvedCount === expectedCount) {
187187
resolve();
188188
}
189189
},
190190
err => reject(err)
191191
);
192+
result = it.next();
193+
}
194+
195+
if (resolvedCount === expectedCount) {
196+
resolve();
192197
}
193198
});
194199
}
195200

196-
static map<R>(all: Array<PersistencePromise<R>>): PersistencePromise<R[]> {
201+
static map<R>(all: Iterable<PersistencePromise<R>>): PersistencePromise<R[]> {
197202
const results: R[] = [];
198203
const promises: Array<PersistencePromise<void>> = [];
199-
for (let i = 0; i < all.length; ++i) {
200-
promises[i] = all[i].next(result => {
201-
results[i] = result;
202-
});
204+
205+
const it = all[Symbol.iterator]();
206+
let result = it.next();
207+
let count = 0;
208+
while (!result.done) {
209+
const value = result.value;
210+
const index = count;
211+
212+
promises.push(
213+
value.next(val => {
214+
results[index] = val;
215+
})
216+
);
217+
218+
result = it.next();
219+
++count;
203220
}
204-
return PersistencePromise.waitFor(promises).next(() => {
205-
return results;
206-
});
221+
222+
return PersistencePromise.waitFor(promises).next(() => results);
207223
}
208224

209225
static forEach<T>(
210-
elements: T[],
211-
callback: (T) => PersistencePromise<void>
226+
all: Iterable<T>,
227+
callback: (elem: T) => PersistencePromise<void>
212228
): PersistencePromise<void> {
229+
const it = all[Symbol.iterator]();
230+
213231
let p = PersistencePromise.resolve();
214-
for (const element of elements) {
215-
p = p.next(() => callback(element));
232+
let result = it.next();
233+
while (!result.done) {
234+
const value = result.value;
235+
p = p.next(() => callback(value));
236+
result = it.next();
216237
}
217238
return p;
218239
}

packages/firestore/src/model/document.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ export class NoDocument extends MaybeDocument {
141141
isEqual(other: MaybeDocument | null | undefined): boolean {
142142
return (
143143
other instanceof NoDocument &&
144+
other.hasCommittedMutations === this.hasCommittedMutations &&
144145
other.version.isEqual(this.version) &&
145146
other.key.isEqual(this.key)
146147
);

packages/firestore/src/util/sorted_map.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,21 @@ export class SortedMap<K, V> {
168168
getReverseIteratorFrom(key: K): SortedMapIterator<K, V> {
169169
return new SortedMapIterator<K, V>(this.root, key, this.comparator, true);
170170
}
171+
172+
[Symbol.iterator](): Iterator<Entry<K, V>> {
173+
const it = this.getIterator();
174+
return {
175+
next(): IteratorResult<Entry<K, V>> {
176+
if (it.hasNext()) {
177+
return { done: false, value: it.getNext() };
178+
} else {
179+
// The TypeScript typings don't allow `undefined` for Iterator<T>,
180+
// so we return an empty object instead.
181+
return { done: true, value: {} as Entry<K, V> };
182+
}
183+
}
184+
};
185+
}
171186
} // end SortedMap
172187

173188
// An iterator over an LLRBNode.

packages/firestore/src/util/sorted_set.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,21 @@ export class SortedSet<T> {
154154
return 'SortedSet(' + result.toString() + ')';
155155
}
156156

157+
[Symbol.iterator](): Iterator<T> {
158+
const it = this.data.getIterator();
159+
return {
160+
next(): IteratorResult<T> {
161+
if (it.hasNext()) {
162+
return { done: false, value: it.getNext().key };
163+
} else {
164+
// The TypeScript typings don't allow `undefined` for Iterator<T>,
165+
// so we return an empty object instead.
166+
return { done: true, value: {} as T };
167+
}
168+
}
169+
};
170+
}
171+
157172
private copy(data: SortedMap<T, boolean>): SortedSet<T> {
158173
const result = new SortedSet(this.comparator);
159174
result.data = data;
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/**
2+
* Copyright 2018 Google Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
import * as firestore from '@firebase/firestore-types';
18+
import { expect } from 'chai';
19+
import { EventsAccumulator } from './util/events_accumulator';
20+
import { withTestDoc } from './util/helpers';
21+
22+
// Firestore databases can be subject to a ~30s "cold start" delay if they have not been used
23+
// recently, so before any tests run we "prime" the backend.
24+
25+
const PRIMING_TIMEOUT_MS = 45000;
26+
27+
before(
28+
'Prime backend by waiting for a write to show up in the watch stream',
29+
function(): Promise<void> {
30+
this.timeout(PRIMING_TIMEOUT_MS);
31+
32+
return withTestDoc(/*persistence=*/ false, async doc => {
33+
const accumulator = new EventsAccumulator<firestore.DocumentSnapshot>();
34+
const unsubscribe = doc.onSnapshot(accumulator.storeEvent);
35+
36+
// Wait for watch to initialize and deliver first event.
37+
await accumulator.awaitRemoteEvent();
38+
39+
// Use a transaction to perform a write without triggering any local events.
40+
await doc.firestore.runTransaction(async txn => {
41+
txn.set(doc, { value: 'done' });
42+
});
43+
44+
// Wait to see the write on the watch stream.
45+
const docSnap = await accumulator.awaitRemoteEvent();
46+
expect(docSnap.get('value')).to.equal('done');
47+
48+
unsubscribe();
49+
});
50+
}
51+
);

packages/firestore/test/unit/local/indexeddb_persistence.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ describe('IndexedDbSchema: createOrUpgradeDb', () => {
416416
return PersistencePromise.forEach(testMutation.mutations, write => {
417417
const indexKey = DbDocumentMutation.key(
418418
testMutation.userId,
419-
path(write.update.name, 5),
419+
path(write.update!.name!, 5),
420420
testMutation.batchId
421421
);
422422
return documentMutationStore.put(

0 commit comments

Comments
 (0)