Skip to content

Commit 8494098

Browse files
OnDisconnect Compat (#4727)
1 parent f51cc6e commit 8494098

File tree

6 files changed

+170
-95
lines changed

6 files changed

+170
-95
lines changed

packages/database/exp/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ export {
3737
Reference,
3838
ListenOptions,
3939
Unsubscribe,
40-
ThenableReference,
41-
OnDisconnect
40+
ThenableReference
4241
} from '../src/exp/Reference';
42+
export { OnDisconnect } from '../src/exp/OnDisconnect';
4343
export {
4444
QueryConstraint,
4545
DataSnapshot,

packages/database/src/api/Reference.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {
3333
} from '../core/util/validation';
3434
import { UserCallback } from '../core/view/EventRegistration';
3535
import { QueryParams } from '../core/view/QueryParams';
36+
import { OnDisconnect as ExpOnDisconnect } from '../exp/OnDisconnect';
3637
import {
3738
DataSnapshot as ExpDataSnapshot,
3839
off,
@@ -750,7 +751,9 @@ export class Reference extends Query implements Compat<ReferenceImpl> {
750751

751752
onDisconnect(): OnDisconnect {
752753
validateWritablePath('Reference.onDisconnect', this._delegate._path);
753-
return new OnDisconnect(this._delegate._repo, this._delegate._path);
754+
return new OnDisconnect(
755+
new ExpOnDisconnect(this._delegate._repo, this._delegate._path)
756+
);
754757
}
755758

756759
get key(): string | null {

packages/database/src/api/onDisconnect.ts

+44-78
Original file line numberDiff line numberDiff line change
@@ -15,67 +15,52 @@
1515
* limitations under the License.
1616
*/
1717

18-
import { Deferred, validateArgCount, validateCallback } from '@firebase/util';
18+
import { validateArgCount, validateCallback, Compat } from '@firebase/util';
1919

20-
import {
21-
Repo,
22-
repoOnDisconnectCancel,
23-
repoOnDisconnectSet,
24-
repoOnDisconnectSetWithPriority,
25-
repoOnDisconnectUpdate
26-
} from '../core/Repo';
2720
import { Indexable } from '../core/util/misc';
28-
import { Path } from '../core/util/Path';
2921
import { warn } from '../core/util/util';
30-
import {
31-
validateWritablePath,
32-
validateFirebaseDataArg,
33-
validatePriority,
34-
validateFirebaseMergeDataArg
35-
} from '../core/util/validation';
22+
import { OnDisconnect as ExpOnDisconnect } from '../exp/OnDisconnect';
3623

37-
export class OnDisconnect {
38-
constructor(private repo_: Repo, private path_: Path) {}
24+
export class OnDisconnect implements Compat<ExpOnDisconnect> {
25+
constructor(readonly _delegate: ExpOnDisconnect) {}
3926

4027
cancel(onComplete?: (a: Error | null) => void): Promise<void> {
4128
validateArgCount('OnDisconnect.cancel', 0, 1, arguments.length);
4229
validateCallback('OnDisconnect.cancel', 1, onComplete, true);
43-
const deferred = new Deferred<void>();
44-
repoOnDisconnectCancel(
45-
this.repo_,
46-
this.path_,
47-
deferred.wrapCallback(onComplete)
48-
);
49-
return deferred.promise;
30+
const result = this._delegate.cancel();
31+
if (onComplete) {
32+
result.then(
33+
() => onComplete(null),
34+
error => onComplete(error)
35+
);
36+
}
37+
return result;
5038
}
5139

5240
remove(onComplete?: (a: Error | null) => void): Promise<void> {
5341
validateArgCount('OnDisconnect.remove', 0, 1, arguments.length);
54-
validateWritablePath('OnDisconnect.remove', this.path_);
5542
validateCallback('OnDisconnect.remove', 1, onComplete, true);
56-
const deferred = new Deferred<void>();
57-
repoOnDisconnectSet(
58-
this.repo_,
59-
this.path_,
60-
null,
61-
deferred.wrapCallback(onComplete)
62-
);
63-
return deferred.promise;
43+
const result = this._delegate.remove();
44+
if (onComplete) {
45+
result.then(
46+
() => onComplete(null),
47+
error => onComplete(error)
48+
);
49+
}
50+
return result;
6451
}
6552

6653
set(value: unknown, onComplete?: (a: Error | null) => void): Promise<void> {
6754
validateArgCount('OnDisconnect.set', 1, 2, arguments.length);
68-
validateWritablePath('OnDisconnect.set', this.path_);
69-
validateFirebaseDataArg('OnDisconnect.set', 1, value, this.path_, false);
7055
validateCallback('OnDisconnect.set', 2, onComplete, true);
71-
const deferred = new Deferred<void>();
72-
repoOnDisconnectSet(
73-
this.repo_,
74-
this.path_,
75-
value,
76-
deferred.wrapCallback(onComplete)
77-
);
78-
return deferred.promise;
56+
const result = this._delegate.set(value);
57+
if (onComplete) {
58+
result.then(
59+
() => onComplete(null),
60+
error => onComplete(error)
61+
);
62+
}
63+
return result;
7964
}
8065

8166
setWithPriority(
@@ -84,34 +69,22 @@ export class OnDisconnect {
8469
onComplete?: (a: Error | null) => void
8570
): Promise<void> {
8671
validateArgCount('OnDisconnect.setWithPriority', 2, 3, arguments.length);
87-
validateWritablePath('OnDisconnect.setWithPriority', this.path_);
88-
validateFirebaseDataArg(
89-
'OnDisconnect.setWithPriority',
90-
1,
91-
value,
92-
this.path_,
93-
false
94-
);
95-
validatePriority('OnDisconnect.setWithPriority', 2, priority, false);
9672
validateCallback('OnDisconnect.setWithPriority', 3, onComplete, true);
97-
98-
const deferred = new Deferred<void>();
99-
repoOnDisconnectSetWithPriority(
100-
this.repo_,
101-
this.path_,
102-
value,
103-
priority,
104-
deferred.wrapCallback(onComplete)
105-
);
106-
return deferred.promise;
73+
const result = this._delegate.setWithPriority(value, priority);
74+
if (onComplete) {
75+
result.then(
76+
() => onComplete(null),
77+
error => onComplete(error)
78+
);
79+
}
80+
return result;
10781
}
10882

10983
update(
11084
objectToMerge: Indexable,
11185
onComplete?: (a: Error | null) => void
11286
): Promise<void> {
11387
validateArgCount('OnDisconnect.update', 1, 2, arguments.length);
114-
validateWritablePath('OnDisconnect.update', this.path_);
11588
if (Array.isArray(objectToMerge)) {
11689
const newObjectToMerge: { [k: string]: unknown } = {};
11790
for (let i = 0; i < objectToMerge.length; ++i) {
@@ -123,21 +96,14 @@ export class OnDisconnect {
12396
'existing data, or an Object with integer keys if you really do want to only update some of the children.'
12497
);
12598
}
126-
validateFirebaseMergeDataArg(
127-
'OnDisconnect.update',
128-
1,
129-
objectToMerge,
130-
this.path_,
131-
false
132-
);
13399
validateCallback('OnDisconnect.update', 2, onComplete, true);
134-
const deferred = new Deferred<void>();
135-
repoOnDisconnectUpdate(
136-
this.repo_,
137-
this.path_,
138-
objectToMerge,
139-
deferred.wrapCallback(onComplete)
140-
);
141-
return deferred.promise;
100+
const result = this._delegate.update(objectToMerge);
101+
if (onComplete) {
102+
result.then(
103+
() => onComplete(null),
104+
error => onComplete(error)
105+
);
106+
}
107+
return result;
142108
}
143109
}
+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
/**
2+
* @license
3+
* Copyright 2021 Google LLC
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
import { Deferred } from '@firebase/util';
19+
20+
import {
21+
Repo,
22+
repoOnDisconnectCancel,
23+
repoOnDisconnectSet,
24+
repoOnDisconnectSetWithPriority,
25+
repoOnDisconnectUpdate
26+
} from '../core/Repo';
27+
import { Indexable } from '../core/util/misc';
28+
import { Path } from '../core/util/Path';
29+
import {
30+
validateFirebaseDataArg,
31+
validateFirebaseMergeDataArg,
32+
validatePriority,
33+
validateWritablePath
34+
} from '../core/util/validation';
35+
36+
export class OnDisconnect {
37+
constructor(private _repo: Repo, private _path: Path) {}
38+
39+
cancel(): Promise<void> {
40+
const deferred = new Deferred<void>();
41+
repoOnDisconnectCancel(
42+
this._repo,
43+
this._path,
44+
deferred.wrapCallback(() => {})
45+
);
46+
return deferred.promise;
47+
}
48+
49+
remove(): Promise<void> {
50+
validateWritablePath('OnDisconnect.remove', this._path);
51+
const deferred = new Deferred<void>();
52+
repoOnDisconnectSet(
53+
this._repo,
54+
this._path,
55+
null,
56+
deferred.wrapCallback(() => {})
57+
);
58+
return deferred.promise;
59+
}
60+
61+
set(value: unknown): Promise<void> {
62+
validateWritablePath('OnDisconnect.set', this._path);
63+
validateFirebaseDataArg('OnDisconnect.set', 1, value, this._path, false);
64+
const deferred = new Deferred<void>();
65+
repoOnDisconnectSet(
66+
this._repo,
67+
this._path,
68+
value,
69+
deferred.wrapCallback(() => {})
70+
);
71+
return deferred.promise;
72+
}
73+
74+
setWithPriority(
75+
value: unknown,
76+
priority: number | string | null
77+
): Promise<void> {
78+
validateWritablePath('OnDisconnect.setWithPriority', this._path);
79+
validateFirebaseDataArg(
80+
'OnDisconnect.setWithPriority',
81+
1,
82+
value,
83+
this._path,
84+
false
85+
);
86+
validatePriority('OnDisconnect.setWithPriority', 2, priority, false);
87+
88+
const deferred = new Deferred<void>();
89+
repoOnDisconnectSetWithPriority(
90+
this._repo,
91+
this._path,
92+
value,
93+
priority,
94+
deferred.wrapCallback(() => {})
95+
);
96+
return deferred.promise;
97+
}
98+
99+
update(objectToMerge: Indexable): Promise<void> {
100+
validateWritablePath('OnDisconnect.update', this._path);
101+
validateFirebaseMergeDataArg(
102+
'OnDisconnect.update',
103+
1,
104+
objectToMerge,
105+
this._path,
106+
false
107+
);
108+
const deferred = new Deferred<void>();
109+
repoOnDisconnectUpdate(
110+
this._repo,
111+
this._path,
112+
objectToMerge,
113+
deferred.wrapCallback(() => {})
114+
);
115+
return deferred.promise;
116+
}
117+
}

packages/database/src/exp/Reference.ts

-11
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,6 @@ export interface Reference extends Query {
3131
readonly parent: Reference | null;
3232
}
3333

34-
export interface OnDisconnect {
35-
cancel(): Promise<void>;
36-
remove(): Promise<void>;
37-
set(value: unknown): Promise<void>;
38-
setWithPriority(
39-
value: unknown,
40-
priority: number | string | null
41-
): Promise<void>;
42-
update(values: object): Promise<void>;
43-
}
44-
4534
export interface ThenableReference
4635
extends Reference,
4736
Pick<Promise<Reference>, 'then' | 'catch'> {}

packages/database/src/exp/Reference_impl.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ import {
8585
} from '../core/view/QueryParams';
8686

8787
import { FirebaseDatabase } from './Database';
88+
import { OnDisconnect } from './OnDisconnect';
8889
import {
8990
ListenOptions,
90-
OnDisconnect,
9191
Query as Query,
9292
Reference as Reference,
9393
Unsubscribe
@@ -390,8 +390,8 @@ export function child(ref: Reference, path: string): ReferenceImpl {
390390
}
391391

392392
export function onDisconnect(ref: Reference): OnDisconnect {
393-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
394-
return {} as any;
393+
ref = getModularInstance(ref) as ReferenceImpl;
394+
return new OnDisconnect(ref._repo, ref._path);
395395
}
396396

397397
export interface ThenableReferenceImpl

0 commit comments

Comments
 (0)