Skip to content

Commit e9d8785

Browse files
committed
move Defer to new file to break circular dependency
Signed-off-by: jackyalbo <jacky.albo@gmail.com>
1 parent 1a81264 commit e9d8785

File tree

11 files changed

+75
-65
lines changed

11 files changed

+75
-65
lines changed

src/rpc/ice.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module.exports = Ice;
66

77
const _ = require('lodash');
88
const P = require('../util/promise');
9+
const Defer = require('../util/defer');
910
const os = require('os');
1011
const net = require('net');
1112
const tls = require('tls');
@@ -1341,7 +1342,7 @@ function IceSession(local, remote, packet, udp) {
13411342
self.state = 'init';
13421343
js_utils.self_bind(self, 'run_udp_request_loop');
13431344
js_utils.self_bind(self, 'run_udp_indication_loop');
1344-
self.defer = new P.Defer();
1345+
self.defer = new Defer();
13451346
self.defer.promise.catch(_.noop); // to ignore 'Unhandled rejection' printouts
13461347
// set session timeout
13471348
self.ready_timeout = setTimeout(function() {

src/rpc/rpc.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const assert = require('assert');
1111
const EventEmitter = require('events').EventEmitter;
1212

1313
const P = require('../util/promise');
14+
const Defer = require('../util/defer');
1415
const js_utils = require('../util/js_utils');
1516
const dbg = require('../util/debug_module')(__filename);
1617
const config = require('../../config');
@@ -191,7 +192,7 @@ class RPC extends EventEmitter {
191192

192193
// initialize the request
193194
req._new_request(api, method_api, params, options.auth_token);
194-
req._response_defer = new P.Defer();
195+
req._response_defer = new Defer();
195196
req._response_defer.promise.catch(_.noop); // to prevent error log of unhandled rejection
196197

197198
if (options.tracker) {

src/rpc/rpc_base_conn.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ const _ = require('lodash');
77
const events = require('events');
88

99
const P = require('../util/promise');
10+
const Defer = require('../util/defer');
11+
1012
const dbg = require('../util/debug_module')(__filename);
1113
const config = require('../../config');
1214
const time_utils = require('../util/time_utils');
@@ -38,7 +40,7 @@ class RpcBaseConnection extends events.EventEmitter {
3840
this._state = STATE_INIT;
3941

4042
// the connecting_defer is used by connect() to wait for the connected event
41-
this.connecting_defer = new P.Defer();
43+
this.connecting_defer = new Defer();
4244
this._connect_promise = events.once(this, 'connect');
4345
this._connect_promise.catch(_.noop); // to prevent error log of unhandled rejection
4446

src/rpc/rpc_http.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const _ = require('lodash');
55
const http = require('http');
66
const https = require('https');
77

8-
const P = require('../util/promise');
8+
const Defer = require('../util/defer');
99
const dbg = require('../util/debug_module')(__filename);
1010
const buffer_utils = require('../util/buffer_utils');
1111
const http_utils = require('../util/http_utils');
@@ -145,7 +145,7 @@ class RpcHttpConnection extends RpcBaseConnection {
145145

146146
dbg.log3('HTTP request', http_req.method, http_req.path, http_req._headers);
147147

148-
const send_defer = new P.Defer();
148+
const send_defer = new Defer();
149149

150150
// reject on send errors
151151
http_req.on('error', send_defer.reject);

src/rpc/rpc_request.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
'use strict';
33

44
/** @typedef {import('./rpc_base_conn')} RpcBaseConnection */
5-
/** @typedef {import('../util/promise').Defer} Defer */
5+
/** @typedef {import('../util/defer')} Defer */
66

77
const _ = require('lodash');
88
const RpcMessage = require('./rpc_message');

src/test/unit_tests/test_promise_utils.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
'use strict';
33

44
const P = require('../../util/promise');
5+
const Defer = require('../../util/defer');
56
const mocha = require('mocha');
67
const assert = require('assert');
78

@@ -91,22 +92,22 @@ mocha.describe('promise utils', function() {
9192

9293
mocha.describe('P.defer', function() {
9394
mocha.it('resolves immediately', /** @this {Mocha.Context} */ async function() {
94-
const defer = new P.Defer();
95+
const defer = new Defer();
9596
defer.resolve(this.test.title);
9697
assert.strictEqual(await defer.promise, this.test.title);
9798
});
9899
mocha.it('resolves later', /** @this {Mocha.Context} */ async function() {
99-
const defer = new P.Defer();
100+
const defer = new Defer();
100101
setTimeout(() => defer.resolve(this.test.title), 12);
101102
assert.strictEqual(await defer.promise, this.test.title);
102103
});
103104
mocha.it('rejects immediately', /** @this {Mocha.Context} */ async function() {
104-
const defer = new P.Defer();
105+
const defer = new Defer();
105106
defer.reject(new Error(this.test.title));
106107
assert.rejects(defer.promise);
107108
});
108109
mocha.it('rejects later', /** @this {Mocha.Context} */ async function() {
109-
const defer = new P.Defer();
110+
const defer = new Defer();
110111
setTimeout(() => defer.reject(new Error(this.test.title)), 12);
111112
assert.rejects(defer.promise);
112113
});

src/util/barrier.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
const _ = require('lodash');
55
const P = require('../util/promise');
6+
const Defer = require('../util/defer');
67

78
module.exports = Barrier;
89

@@ -49,7 +50,7 @@ Barrier.prototype.call = function(item) {
4950

5051
// add the item to the pending barrier and assign a defer
5152
// that will be resolved/rejected per this item.
52-
const defer = new P.Defer();
53+
const defer = new Defer();
5354
self.barrier.items.push(item);
5455
self.barrier.defers.push(defer);
5556

src/util/defer.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/* Copyright (C) 2016 NooBaa */
2+
'use strict';
3+
4+
/**
5+
* @deprecated LEGACY PROMISE UTILS - DEPRECATED IN FAVOR OF ASYNC-AWAIT
6+
*/
7+
class Defer {
8+
9+
constructor() {
10+
this.isPending = true;
11+
this.isResolved = false;
12+
this.isRejected = false;
13+
this.promise = new Promise((resolve, reject) => {
14+
this._promise_resolve = resolve;
15+
this._promise_reject = reject;
16+
});
17+
Object.seal(this);
18+
}
19+
20+
// setting resolve and reject to assert that the current code assumes
21+
// the Promise ctor is calling the callback synchronously and not deferring it,
22+
// otherwise we might have weird cases that we miss the caller's resolve/reject
23+
// events, so we throw to assert
24+
25+
/**
26+
* @param {any} [res]
27+
* @returns {void}
28+
*/
29+
resolve(res) {
30+
if (!this.isPending) {
31+
return;
32+
}
33+
this.isPending = false;
34+
this.isResolved = true;
35+
Object.freeze(this);
36+
this._promise_resolve(res);
37+
}
38+
39+
/**
40+
* @param {Error} err
41+
* @returns {void}
42+
*/
43+
reject(err) {
44+
if (!this.isPending) {
45+
return;
46+
}
47+
this.isPending = false;
48+
this.isRejected = true;
49+
Object.freeze(this);
50+
this._promise_reject(err);
51+
}
52+
}
53+
54+
module.exports = Defer; // 13 occurrences

src/util/keys_lock.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
const _ = require('lodash');
55
const P = require('../util/promise');
6+
const Defer = require('../util/defer');
67
const LinkedList = require('./linked_list');
78

89
class KeysLock {
@@ -43,7 +44,7 @@ class KeysLock {
4344
return P.resolve();
4445
}
4546

46-
const defer = new P.Defer();
47+
const defer = new Defer();
4748
lock_item.defer = defer;
4849
this._wait_list.push_back(lock_item);
4950
return defer.promise;

src/util/promise.js

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -209,56 +209,6 @@ async function retry({ attempts, delay_ms, func, error_logger }) {
209209
/////////////////////////////////////
210210
/////////////////////////////////////
211211

212-
/**
213-
* @deprecated LEGACY PROMISE UTILS - DEPRECATED IN FAVOR OF ASYNC-AWAIT
214-
*/
215-
class Defer {
216-
217-
constructor() {
218-
this.isPending = true;
219-
this.isResolved = false;
220-
this.isRejected = false;
221-
this.promise = new Promise((resolve, reject) => {
222-
this._promise_resolve = resolve;
223-
this._promise_reject = reject;
224-
});
225-
Object.seal(this);
226-
}
227-
228-
// setting resolve and reject to assert that the current code assumes
229-
// the Promise ctor is calling the callback synchronously and not deferring it,
230-
// otherwise we might have weird cases that we miss the caller's resolve/reject
231-
// events, so we throw to assert
232-
233-
/**
234-
* @param {any} [res]
235-
* @returns {void}
236-
*/
237-
resolve(res) {
238-
if (!this.isPending) {
239-
return;
240-
}
241-
this.isPending = false;
242-
this.isResolved = true;
243-
Object.freeze(this);
244-
this._promise_resolve(res);
245-
}
246-
247-
/**
248-
* @param {Error} err
249-
* @returns {void}
250-
*/
251-
reject(err) {
252-
if (!this.isPending) {
253-
return;
254-
}
255-
this.isPending = false;
256-
this.isRejected = true;
257-
Object.freeze(this);
258-
this._promise_reject(err);
259-
}
260-
}
261-
262212
/**
263213
* Callback is a template typedef to help propagate types correctly
264214
* when using nodejs callback functions.
@@ -366,5 +316,4 @@ exports.fromCallback = fromCallback; // 44 occurrences
366316
exports.fcall = fcall; // 59 occurrences
367317
exports.ninvoke = ninvoke; // 30 occurrences
368318
exports.wait_until = wait_until; // 20 occurrences
369-
exports.Defer = Defer; // 13 occurrences
370319
exports.pwhile = pwhile; // 15 occurrences

0 commit comments

Comments
 (0)