MCPcopy
hub / github.com/angular/angularfire / ɵzoneWrap

Function ɵzoneWrap

src/zones.ts:124–193  ·  view source on GitHub ↗
(it: T, blockUntilFirst: boolean, logLevel?: LogLevel)

Source from the content-addressed store, hash-verified

122};
123
124export const ɵzoneWrap = <T= unknown>(it: T, blockUntilFirst: boolean, logLevel?: LogLevel): T => {
125 logLevel ||= blockUntilFirst ? LogLevel.WARN : LogLevel.VERBOSE;
126 // function() is needed for the arguments object
127 return function () {
128 let taskDone: VoidFunction | undefined;
129 const _arguments = arguments;
130 let schedulers: ɵAngularFireSchedulers;
131 let pendingTasks: PendingTasks;
132 let injector: EnvironmentInjector;
133 try {
134 schedulers = inject(ɵAngularFireSchedulers);
135 pendingTasks = inject(PendingTasks);
136 injector = inject(EnvironmentInjector);
137 } catch(e) {
138 warnOutsideInjectionContext(it, logLevel);
139 return (it as any).apply(this, _arguments);
140 }
141 // if this is a callback function, e.g, onSnapshot, we should create a pending task and complete it
142 // only once one of the callback functions is tripped.
143 for (let i = 0; i < arguments.length; i++) {
144 if (typeof _arguments[i] === 'function') {
145 if (blockUntilFirst) {
146 taskDone ||= run(() => pendingTasks.add());
147 }
148 // TODO create a microtask to track callback functions
149 _arguments[i] = zoneWrapFn(_arguments[i], taskDone, injector);
150 }
151 }
152 const ret = runOutsideAngular(() => (it as any).apply(this, _arguments));
153 if (!blockUntilFirst) {
154 if (ret instanceof Observable) {
155 return ret.pipe(
156 subscribeOn(schedulers.outsideAngular),
157 observeOn(schedulers.insideAngular),
158 );
159 } else {
160 return run(() => ret);
161 }
162 }
163 if (ret instanceof Observable) {
164 return ret.pipe(
165 subscribeOn(schedulers.outsideAngular),
166 observeOn(schedulers.insideAngular),
167 pendingUntilEvent(injector),
168 );
169 } else if (ret instanceof Promise) {
170 // eslint-disable-next-line @typescript-eslint/no-misused-promises
171 return run(
172 () => {
173 const removeTask = pendingTasks.add();
174 return new Promise((resolve, reject) => {
175 ret.then(
176 (it) => runInInjectionContext(injector, () => run(() => resolve(it))),
177 (reason) => runInInjectionContext(injector, () => run(() => reject(reason)))
178 ).finally(removeTask);
179 });
180 });
181 } else if (typeof ret === 'function' && taskDone) {

Callers 15

auth.component.tsFile · 0.85
firebase.tsFile · 0.85
rxfire.tsFile · 0.85
firebase.tsFile · 0.85
rxfire.tsFile · 0.85
firebase.tsFile · 0.85
firebase.tsFile · 0.85
rxfire.tsFile · 0.85
firebase.tsFile · 0.85
rxfire.tsFile · 0.85
firebase.tsFile · 0.85
rxfire.tsFile · 0.85

Calls 6

runFunction · 0.85
zoneWrapFnFunction · 0.85
runOutsideAngularFunction · 0.85
addMethod · 0.80
thenMethod · 0.80

Tested by

no test coverage detected