jsforce2 1.11.1 → 5.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of jsforce2 might be problematic. Click here for more details.
- package/index.js +46 -1
- package/package.json +7 -105
- package/LICENSE +0 -22
- package/README.md +0 -74
- package/bin/jsforce +0 -3
- package/bower.json +0 -30
- package/build/jsforce-api-analytics.js +0 -393
- package/build/jsforce-api-analytics.min.js +0 -2
- package/build/jsforce-api-analytics.min.js.map +0 -1
- package/build/jsforce-api-apex.js +0 -183
- package/build/jsforce-api-apex.min.js +0 -2
- package/build/jsforce-api-apex.min.js.map +0 -1
- package/build/jsforce-api-bulk.js +0 -1054
- package/build/jsforce-api-bulk.min.js +0 -2
- package/build/jsforce-api-bulk.min.js.map +0 -1
- package/build/jsforce-api-chatter.js +0 -320
- package/build/jsforce-api-chatter.min.js +0 -2
- package/build/jsforce-api-chatter.min.js.map +0 -1
- package/build/jsforce-api-metadata.js +0 -3020
- package/build/jsforce-api-metadata.min.js +0 -2
- package/build/jsforce-api-metadata.min.js.map +0 -1
- package/build/jsforce-api-soap.js +0 -403
- package/build/jsforce-api-soap.min.js +0 -2
- package/build/jsforce-api-soap.min.js.map +0 -1
- package/build/jsforce-api-streaming.js +0 -3479
- package/build/jsforce-api-streaming.min.js +0 -2
- package/build/jsforce-api-streaming.min.js.map +0 -1
- package/build/jsforce-api-tooling.js +0 -319
- package/build/jsforce-api-tooling.min.js +0 -2
- package/build/jsforce-api-tooling.min.js.map +0 -1
- package/build/jsforce-core.js +0 -25250
- package/build/jsforce-core.min.js +0 -2
- package/build/jsforce-core.min.js.map +0 -1
- package/build/jsforce.js +0 -31637
- package/build/jsforce.min.js +0 -2
- package/build/jsforce.min.js.map +0 -1
- package/core.js +0 -1
- package/lib/VERSION.js +0 -2
- package/lib/_required.js +0 -29
- package/lib/api/analytics.js +0 -387
- package/lib/api/apex.js +0 -177
- package/lib/api/bulk.js +0 -862
- package/lib/api/chatter.js +0 -314
- package/lib/api/index.js +0 -8
- package/lib/api/metadata.js +0 -848
- package/lib/api/soap.js +0 -397
- package/lib/api/streaming-extension.js +0 -136
- package/lib/api/streaming.js +0 -270
- package/lib/api/tooling.js +0 -313
- package/lib/browser/canvas.js +0 -90
- package/lib/browser/client.js +0 -241
- package/lib/browser/core.js +0 -5
- package/lib/browser/jsforce.js +0 -6
- package/lib/browser/jsonp.js +0 -52
- package/lib/browser/request.js +0 -70
- package/lib/cache.js +0 -252
- package/lib/cli/cli.js +0 -431
- package/lib/cli/repl.js +0 -337
- package/lib/connection.js +0 -1881
- package/lib/core.js +0 -16
- package/lib/csv.js +0 -50
- package/lib/date.js +0 -163
- package/lib/http-api.js +0 -300
- package/lib/jsforce.js +0 -10
- package/lib/logger.js +0 -52
- package/lib/oauth2.js +0 -206
- package/lib/process.js +0 -275
- package/lib/promise.js +0 -164
- package/lib/query.js +0 -881
- package/lib/quick-action.js +0 -90
- package/lib/record-stream.js +0 -305
- package/lib/record.js +0 -107
- package/lib/registry/file-registry.js +0 -48
- package/lib/registry/index.js +0 -3
- package/lib/registry/registry.js +0 -111
- package/lib/require.js +0 -14
- package/lib/soap.js +0 -207
- package/lib/sobject.js +0 -558
- package/lib/soql-builder.js +0 -236
- package/lib/transport.js +0 -233
package/lib/core.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file JSforce Core
|
|
3
|
-
* @author Shinichi Tomita <shinichi.tomita@gmail.com>
|
|
4
|
-
*/
|
|
5
|
-
'use strict';
|
|
6
|
-
|
|
7
|
-
var EventEmitter = require('events').EventEmitter;
|
|
8
|
-
|
|
9
|
-
var jsforce = module.exports = new EventEmitter();
|
|
10
|
-
jsforce.VERSION = require('./VERSION');
|
|
11
|
-
jsforce.Connection = require('./connection');
|
|
12
|
-
jsforce.OAuth2 = require('./oauth2');
|
|
13
|
-
jsforce.Date = jsforce.SfDate = require("./date");
|
|
14
|
-
jsforce.RecordStream = require('./record-stream');
|
|
15
|
-
jsforce.Promise = require('./promise');
|
|
16
|
-
jsforce.require = require('./require');
|
package/lib/csv.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var _ = require('lodash/core'),
|
|
4
|
-
csvParse = require('csv-parse/lib/es5'),
|
|
5
|
-
csvParseSync = require('csv-parse/lib/es5/sync'),
|
|
6
|
-
csvStringify = require('csv-stringify'),
|
|
7
|
-
csvStringifySync = require('csv-stringify/lib/sync');
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* @private
|
|
11
|
-
*/
|
|
12
|
-
function parseCSV(str, options) {
|
|
13
|
-
options = _.extend({}, options, { columns: true });
|
|
14
|
-
return csvParseSync(str, options);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* @private
|
|
19
|
-
*/
|
|
20
|
-
function toCSV(records, options) {
|
|
21
|
-
options = _.extend({}, options, { header: true });
|
|
22
|
-
return csvStringifySync(records, options);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* @private
|
|
27
|
-
*/
|
|
28
|
-
function parseCSVStream(options) {
|
|
29
|
-
options = _.extend({}, options, { columns: true });
|
|
30
|
-
return csvParse(options);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* @private
|
|
35
|
-
*/
|
|
36
|
-
function serializeCSVStream(options) {
|
|
37
|
-
options = _.extend({}, options, { header: true });
|
|
38
|
-
return csvStringify(options);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* @protected
|
|
44
|
-
*/
|
|
45
|
-
module.exports = {
|
|
46
|
-
parseCSV: parseCSV,
|
|
47
|
-
toCSV: toCSV,
|
|
48
|
-
parseCSVStream: parseCSVStream,
|
|
49
|
-
serializeCSVStream: serializeCSVStream
|
|
50
|
-
};
|
package/lib/date.js
DELETED
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var _ = require('lodash/core');
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* A date object to keep Salesforce date literal
|
|
7
|
-
*
|
|
8
|
-
* @class
|
|
9
|
-
* @constructor
|
|
10
|
-
* @see http://www.salesforce.com/us/developer/docs/soql_sosl/Content/sforce_api_calls_soql_select_dateformats.htm
|
|
11
|
-
*/
|
|
12
|
-
var SfDate = module.exports = function(literal) {
|
|
13
|
-
this._literal = literal;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Returns literal when converted to string
|
|
18
|
-
*
|
|
19
|
-
* @override
|
|
20
|
-
*/
|
|
21
|
-
SfDate.prototype.toString =
|
|
22
|
-
SfDate.prototype.toJSON = function() { return this._literal; };
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
/** @private **/
|
|
26
|
-
function zeropad(n) { return (n<10 ? "0" : "") + n; }
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Convert JavaScript date object to ISO8601 Date format (e.g. 2012-10-31)
|
|
30
|
-
*
|
|
31
|
-
* @param {String|Number|Date} date - Input date
|
|
32
|
-
* @returns {SfDate} - Salesforce date literal with ISO8601 date format
|
|
33
|
-
*/
|
|
34
|
-
SfDate.toDateLiteral = function(date) {
|
|
35
|
-
if (_.isNumber(date)) {
|
|
36
|
-
date = new Date(date);
|
|
37
|
-
} else if (_.isString(date)) {
|
|
38
|
-
date = SfDate.parseDate(date);
|
|
39
|
-
}
|
|
40
|
-
var yy = date.getFullYear();
|
|
41
|
-
var mm = date.getMonth()+1;
|
|
42
|
-
var dd = date.getDate();
|
|
43
|
-
var dstr = [ yy, zeropad(mm), zeropad(dd) ].join("-");
|
|
44
|
-
return new SfDate(dstr);
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Convert JavaScript date object to ISO8601 DateTime format
|
|
49
|
-
* (e.g. 2012-10-31T12:34:56Z)
|
|
50
|
-
*
|
|
51
|
-
* @param {String|Number|Date} date - Input date
|
|
52
|
-
* @returns {SfDate} - Salesforce date literal with ISO8601 datetime format
|
|
53
|
-
*/
|
|
54
|
-
SfDate.toDateTimeLiteral = function(date) {
|
|
55
|
-
if (_.isNumber(date)) {
|
|
56
|
-
date = new Date(date);
|
|
57
|
-
} else if (_.isString(date)) {
|
|
58
|
-
date = SfDate.parseDate(date);
|
|
59
|
-
}
|
|
60
|
-
var yy = date.getUTCFullYear();
|
|
61
|
-
var mm = date.getUTCMonth()+1;
|
|
62
|
-
var dd = date.getUTCDate();
|
|
63
|
-
var hh = date.getUTCHours();
|
|
64
|
-
var mi = date.getUTCMinutes();
|
|
65
|
-
var ss = date.getUTCSeconds();
|
|
66
|
-
var dtstr =
|
|
67
|
-
[ yy, zeropad(mm), zeropad(dd) ].join("-") + "T" +
|
|
68
|
-
[ zeropad(hh), zeropad(mi), zeropad(ss) ].join(":") + "Z";
|
|
69
|
-
return new SfDate(dtstr);
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Parse IS08601 date(time) formatted string and return date instance
|
|
74
|
-
*
|
|
75
|
-
* @param {String} str
|
|
76
|
-
* @returns {Date}
|
|
77
|
-
*/
|
|
78
|
-
SfDate.parseDate = function(str) {
|
|
79
|
-
var d = new Date();
|
|
80
|
-
var regexp = /^([\d]{4})-?([\d]{2})-?([\d]{2})(T([\d]{2}):?([\d]{2}):?([\d]{2})(.([\d]{3}))?(Z|([\+\-])([\d]{2}):?([\d]{2})))?$/;
|
|
81
|
-
var m = str.match(regexp);
|
|
82
|
-
if (m) {
|
|
83
|
-
d = new Date(0);
|
|
84
|
-
if (!m[4]) {
|
|
85
|
-
d.setFullYear(parseInt(m[1], 10));
|
|
86
|
-
d.setDate(parseInt(m[3], 10));
|
|
87
|
-
d.setMonth(parseInt(m[2], 10) - 1);
|
|
88
|
-
d.setHours(0);
|
|
89
|
-
d.setMinutes(0);
|
|
90
|
-
d.setSeconds(0);
|
|
91
|
-
d.setMilliseconds(0);
|
|
92
|
-
} else {
|
|
93
|
-
d.setUTCFullYear(parseInt(m[1], 10));
|
|
94
|
-
d.setUTCDate(parseInt(m[3], 10));
|
|
95
|
-
d.setUTCMonth(parseInt(m[2], 10) - 1);
|
|
96
|
-
d.setUTCHours(parseInt(m[5], 10));
|
|
97
|
-
d.setUTCMinutes(parseInt(m[6], 10));
|
|
98
|
-
d.setUTCSeconds(parseInt(m[7], 10));
|
|
99
|
-
d.setUTCMilliseconds(parseInt(m[9] || '0', 10));
|
|
100
|
-
if (m[10] && m[10] !== 'Z') {
|
|
101
|
-
var offset = parseInt(m[12],10) * 60 + parseInt(m[13], 10);
|
|
102
|
-
d.setTime((m[11] === '+' ? -1 : 1) * offset * 60 * 1000 +d.getTime());
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return d;
|
|
106
|
-
} else {
|
|
107
|
-
throw new Error("Invalid date format is specified : " + str);
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
/*
|
|
112
|
-
* Pre-defined Salesforce Date Literals
|
|
113
|
-
*/
|
|
114
|
-
var SfDateLiterals = {
|
|
115
|
-
YESTERDAY: 1,
|
|
116
|
-
TODAY: 1,
|
|
117
|
-
TOMORROW: 1,
|
|
118
|
-
LAST_WEEK: 1,
|
|
119
|
-
THIS_WEEK: 1,
|
|
120
|
-
NEXT_WEEK: 1,
|
|
121
|
-
LAST_MONTH: 1,
|
|
122
|
-
THIS_MONTH: 1,
|
|
123
|
-
NEXT_MONTH: 1,
|
|
124
|
-
LAST_90_DAYS: 1,
|
|
125
|
-
NEXT_90_DAYS: 1,
|
|
126
|
-
LAST_N_DAYS: 2,
|
|
127
|
-
NEXT_N_DAYS: 2,
|
|
128
|
-
NEXT_N_WEEKS: 2,
|
|
129
|
-
LAST_N_WEEKS: 2,
|
|
130
|
-
NEXT_N_MONTHS: 2,
|
|
131
|
-
LAST_N_MONTHS: 2,
|
|
132
|
-
THIS_QUARTER: 1,
|
|
133
|
-
LAST_QUARTER: 1,
|
|
134
|
-
NEXT_QUARTER: 1,
|
|
135
|
-
NEXT_N_QUARTERS: 2,
|
|
136
|
-
LAST_N_QUARTERS: 2,
|
|
137
|
-
THIS_YEAR: 1,
|
|
138
|
-
LAST_YEAR: 1,
|
|
139
|
-
NEXT_YEAR: 1,
|
|
140
|
-
NEXT_N_YEARS: 2,
|
|
141
|
-
LAST_N_YEARS: 2,
|
|
142
|
-
THIS_FISCAL_QUARTER: 1,
|
|
143
|
-
LAST_FISCAL_QUARTER: 1,
|
|
144
|
-
NEXT_FISCAL_QUARTER: 1,
|
|
145
|
-
NEXT_N_FISCAL_QUARTERS:2,
|
|
146
|
-
LAST_N_FISCAL_QUARTERS:2,
|
|
147
|
-
THIS_FISCAL_YEAR:1,
|
|
148
|
-
LAST_FISCAL_YEAR:1,
|
|
149
|
-
NEXT_FISCAL_YEAR:1,
|
|
150
|
-
NEXT_N_FISCAL_YEARS: 2,
|
|
151
|
-
LAST_N_FISCAL_YEARS: 2
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
for (var literal in SfDateLiterals) {
|
|
155
|
-
var type = SfDateLiterals[literal];
|
|
156
|
-
SfDate[literal] =
|
|
157
|
-
type === 1 ? new SfDate(literal) : createLiteralBuilder(literal);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/** @private **/
|
|
161
|
-
function createLiteralBuilder(literal) {
|
|
162
|
-
return function(num) { return new SfDate(literal + ":" + num); };
|
|
163
|
-
}
|
package/lib/http-api.js
DELETED
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var inherits = require('inherits'),
|
|
4
|
-
events = require('events'),
|
|
5
|
-
_ = require('lodash/core'),
|
|
6
|
-
Promise = require('./promise');
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* HTTP based API class with authorization hook
|
|
10
|
-
*
|
|
11
|
-
* @constructor
|
|
12
|
-
* @extends events.EventEmitter
|
|
13
|
-
* @param {Connection} conn - Connection object
|
|
14
|
-
* @param {Object} [options] - Http API Options
|
|
15
|
-
* @param {String} [options.responseType] - Overriding content mime-type in response
|
|
16
|
-
* @param {Transport} [options.transport] - Transport for http api
|
|
17
|
-
* @param {Object} [options.noContentResponse] - Alternative response when no content returned in response (= HTTP 204)
|
|
18
|
-
*/
|
|
19
|
-
var HttpApi = function(conn, options) {
|
|
20
|
-
options = options || {};
|
|
21
|
-
this._conn = conn;
|
|
22
|
-
this.on('resume', function(err) { conn.emit('resume', err); });
|
|
23
|
-
this._responseType = options.responseType;
|
|
24
|
-
this._transport = options.transport || conn._transport;
|
|
25
|
-
this._noContentResponse = options.noContentResponse;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
inherits(HttpApi, events.EventEmitter);
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Callout to API endpoint using http
|
|
32
|
-
*
|
|
33
|
-
* @param {Object} request - Http Request object
|
|
34
|
-
* @param {String} request.url - Endpoint URL to request
|
|
35
|
-
* @param {String} request.method - Http method for request
|
|
36
|
-
* @param {Object} [request.headers] - Http request headers in hash object
|
|
37
|
-
* @param {Callback.<Object>} callback - Callback function
|
|
38
|
-
* @returns {Promise.<Object>} -
|
|
39
|
-
*/
|
|
40
|
-
HttpApi.prototype.request = function(request, callback) {
|
|
41
|
-
var self = this;
|
|
42
|
-
var conn = this._conn;
|
|
43
|
-
var logger = conn._logger;
|
|
44
|
-
var refreshDelegate = this.getRefreshDelegate();
|
|
45
|
-
// remember previous instance url in case it changes after a refresh
|
|
46
|
-
var lastInstanceUrl = conn.instanceUrl;
|
|
47
|
-
|
|
48
|
-
var deferred = Promise.defer();
|
|
49
|
-
|
|
50
|
-
var onResume = function(err) {
|
|
51
|
-
if (err) {
|
|
52
|
-
deferred.reject(err);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
// check to see if the token refresh has changed the instance url
|
|
56
|
-
if(lastInstanceUrl !== conn.instanceUrl){
|
|
57
|
-
// if the instance url has changed
|
|
58
|
-
// then replace the current request urls instance url fragment
|
|
59
|
-
// with the updated instance url
|
|
60
|
-
request.url = request.url.replace(lastInstanceUrl,conn.instanceUrl);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
self.request(request).then(function(response) {
|
|
64
|
-
deferred.resolve(response);
|
|
65
|
-
}, function(err) {
|
|
66
|
-
deferred.reject(err);
|
|
67
|
-
});
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
if (refreshDelegate && refreshDelegate._refreshing) {
|
|
71
|
-
refreshDelegate.once('resume', onResume);
|
|
72
|
-
return deferred.promise.thenCall(callback);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// hook before sending
|
|
76
|
-
self.beforeSend(request);
|
|
77
|
-
|
|
78
|
-
self.emit('request', request);
|
|
79
|
-
logger.debug("<request> method=" + request.method + ", url=" + request.url);
|
|
80
|
-
var requestTime = Date.now();
|
|
81
|
-
|
|
82
|
-
return this._transport.httpRequest(request).then(function(response) {
|
|
83
|
-
var responseTime = Date.now();
|
|
84
|
-
logger.debug("elapsed time : " + (responseTime - requestTime) + "msec");
|
|
85
|
-
logger.debug("<response> status=" + response.statusCode + ", url=" + request.url);
|
|
86
|
-
|
|
87
|
-
self.emit('response', response);
|
|
88
|
-
// Refresh token if session has been expired and requires authentication
|
|
89
|
-
// when session refresh delegate is available
|
|
90
|
-
if (self.isSessionExpired(response) && refreshDelegate) {
|
|
91
|
-
refreshDelegate.refresh(requestTime, onResume);
|
|
92
|
-
return deferred.promise;
|
|
93
|
-
}
|
|
94
|
-
if (self.isErrorResponse(response)) {
|
|
95
|
-
var err = self.getError(response);
|
|
96
|
-
throw err;
|
|
97
|
-
}
|
|
98
|
-
return self.getResponseBody(response);
|
|
99
|
-
}, function(err) {
|
|
100
|
-
var responseTime = Date.now();
|
|
101
|
-
logger.debug("elapsed time : " + (responseTime - requestTime) + "msec");
|
|
102
|
-
logger.error(err);
|
|
103
|
-
throw err;
|
|
104
|
-
})
|
|
105
|
-
.thenCall(callback);
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* @protected
|
|
110
|
-
*/
|
|
111
|
-
HttpApi.prototype.getRefreshDelegate = function() {
|
|
112
|
-
return this._conn._refreshDelegate;
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
*
|
|
117
|
-
* @protected
|
|
118
|
-
*/
|
|
119
|
-
HttpApi.prototype.beforeSend = function(request) {
|
|
120
|
-
request.headers = request.headers || {};
|
|
121
|
-
if (this._conn.accessToken) {
|
|
122
|
-
request.headers.Authorization = "Bearer " + this._conn.accessToken;
|
|
123
|
-
}
|
|
124
|
-
if (this._conn.callOptions) {
|
|
125
|
-
var callOptions = [];
|
|
126
|
-
for (var name in this._conn.callOptions) {
|
|
127
|
-
callOptions.push(name + "=" + this._conn.callOptions[name]);
|
|
128
|
-
}
|
|
129
|
-
request.headers["Sforce-Call-Options"] = callOptions.join(', ');
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Detect response content mime-type
|
|
135
|
-
* @protected
|
|
136
|
-
*/
|
|
137
|
-
HttpApi.prototype.getResponseContentType = function(response) {
|
|
138
|
-
return this._responseType || response.headers && response.headers["content-type"];
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
*
|
|
143
|
-
*/
|
|
144
|
-
HttpApi.prototype.parseResponseBody = function(response) {
|
|
145
|
-
var contentType = this.getResponseContentType(response);
|
|
146
|
-
var parseBody = /^(text|application)\/xml(;|$)/.test(contentType) ? parseXML :
|
|
147
|
-
/^application\/json(;|$)/.test(contentType) ? parseJSON :
|
|
148
|
-
/^text\/csv(;|$)/.test(contentType) ? parseCSV :
|
|
149
|
-
parseText;
|
|
150
|
-
try {
|
|
151
|
-
return parseBody(response.body);
|
|
152
|
-
} catch(e) {
|
|
153
|
-
return response.body;
|
|
154
|
-
}
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Get response body
|
|
159
|
-
* @protected
|
|
160
|
-
*/
|
|
161
|
-
HttpApi.prototype.getResponseBody = function(response) {
|
|
162
|
-
if (response.statusCode === 204) { // No Content
|
|
163
|
-
return this._noContentResponse;
|
|
164
|
-
}
|
|
165
|
-
var body = this.parseResponseBody(response);
|
|
166
|
-
var err;
|
|
167
|
-
if (this.hasErrorInResponseBody(body)) {
|
|
168
|
-
err = this.getError(response, body);
|
|
169
|
-
throw err;
|
|
170
|
-
}
|
|
171
|
-
if (response.statusCode === 300) { // Multiple Choices
|
|
172
|
-
err = new Error('Multiple records found');
|
|
173
|
-
err.name = "MULTIPLE_CHOICES";
|
|
174
|
-
err.content = body;
|
|
175
|
-
throw err;
|
|
176
|
-
}
|
|
177
|
-
return body;
|
|
178
|
-
};
|
|
179
|
-
|
|
180
|
-
/** @private */
|
|
181
|
-
function parseJSON(str) {
|
|
182
|
-
return JSON.parse(str);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/** @private */
|
|
186
|
-
function parseXML(str) {
|
|
187
|
-
var ret = {};
|
|
188
|
-
require('xml2js').parseString(str, { explicitArray: false }, function(err, result) {
|
|
189
|
-
ret = { error: err, result : result };
|
|
190
|
-
});
|
|
191
|
-
if (ret.error) { throw ret.error; }
|
|
192
|
-
return ret.result;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/** @private */
|
|
196
|
-
function parseCSV(str) {
|
|
197
|
-
return require('./csv').parseCSV(str);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/** @private */
|
|
201
|
-
function parseText(str) { return str; }
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Detect session expiry
|
|
206
|
-
* @protected
|
|
207
|
-
*/
|
|
208
|
-
HttpApi.prototype.isSessionExpired = function(response) {
|
|
209
|
-
return response.statusCode === 401;
|
|
210
|
-
};
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Detect error response
|
|
214
|
-
* @protected
|
|
215
|
-
*/
|
|
216
|
-
HttpApi.prototype.isErrorResponse = function(response) {
|
|
217
|
-
return response.statusCode >= 400;
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Detect error in response body
|
|
222
|
-
* @protected
|
|
223
|
-
*/
|
|
224
|
-
HttpApi.prototype.hasErrorInResponseBody = function(body) {
|
|
225
|
-
return false;
|
|
226
|
-
};
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Parsing error message in response
|
|
230
|
-
* @protected
|
|
231
|
-
*/
|
|
232
|
-
HttpApi.prototype.parseError = function(body) {
|
|
233
|
-
var errors = body;
|
|
234
|
-
return _.isArray(errors) ? errors[0] : errors;
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* Get error message in response
|
|
239
|
-
* @protected
|
|
240
|
-
*/
|
|
241
|
-
HttpApi.prototype.getError = function(response, body) {
|
|
242
|
-
var error;
|
|
243
|
-
try {
|
|
244
|
-
error = this.parseError(body || this.parseResponseBody(response));
|
|
245
|
-
} catch(e) {}
|
|
246
|
-
error = _.isObject(error) && _.isString(error.message) ? error : {
|
|
247
|
-
errorCode: 'ERROR_HTTP_' + response.statusCode,
|
|
248
|
-
message : response.body
|
|
249
|
-
};
|
|
250
|
-
var err = new Error(error.message);
|
|
251
|
-
err.name = error.errorCode;
|
|
252
|
-
for (var key in error) { err[key] = error[key]; }
|
|
253
|
-
return err;
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
/*-------------------------------------------------------------------------*/
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* @protected
|
|
260
|
-
*/
|
|
261
|
-
var SessionRefreshDelegate = function(conn, refreshFn) {
|
|
262
|
-
this._conn = conn;
|
|
263
|
-
this._refreshFn = refreshFn;
|
|
264
|
-
this._refreshing = false;
|
|
265
|
-
};
|
|
266
|
-
|
|
267
|
-
inherits(SessionRefreshDelegate, events.EventEmitter);
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Refresh access token
|
|
271
|
-
* @private
|
|
272
|
-
*/
|
|
273
|
-
SessionRefreshDelegate.prototype.refresh = function(since, callback) {
|
|
274
|
-
// Callback immediately When refreshed after designated time
|
|
275
|
-
if (this._lastRefreshedAt > since) { return callback(); }
|
|
276
|
-
var self = this;
|
|
277
|
-
var conn = this._conn;
|
|
278
|
-
var logger = conn._logger;
|
|
279
|
-
self.once('resume', callback);
|
|
280
|
-
if (self._refreshing) { return; }
|
|
281
|
-
logger.debug("<refresh token>");
|
|
282
|
-
self._refreshing = true;
|
|
283
|
-
return self._refreshFn(conn, function(err, accessToken, res) {
|
|
284
|
-
if (!err) {
|
|
285
|
-
logger.debug("Connection refresh completed.");
|
|
286
|
-
conn.accessToken = accessToken;
|
|
287
|
-
conn.emit("refresh", accessToken, res);
|
|
288
|
-
}
|
|
289
|
-
self._lastRefreshedAt = Date.now();
|
|
290
|
-
self._refreshing = false;
|
|
291
|
-
self.emit('resume', err);
|
|
292
|
-
});
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
*
|
|
298
|
-
*/
|
|
299
|
-
HttpApi.SessionRefreshDelegate = SessionRefreshDelegate;
|
|
300
|
-
module.exports = HttpApi;
|
package/lib/jsforce.js
DELETED
package/lib/logger.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @protected
|
|
5
|
-
* @class
|
|
6
|
-
* @constructor
|
|
7
|
-
* @param {String|Number} logLevel - Log level
|
|
8
|
-
*/
|
|
9
|
-
var Logger = module.exports = function(logLevel) {
|
|
10
|
-
if (typeof logLevel === 'string') {
|
|
11
|
-
logLevel = LogLevels[logLevel];
|
|
12
|
-
}
|
|
13
|
-
if (!logLevel) {
|
|
14
|
-
logLevel = LogLevels.INFO;
|
|
15
|
-
}
|
|
16
|
-
this._logLevel = logLevel;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* @memberof Logger
|
|
21
|
-
*/
|
|
22
|
-
var LogLevels = Logger.LogLevels = {
|
|
23
|
-
"DEBUG" : 1,
|
|
24
|
-
"INFO" : 2,
|
|
25
|
-
"WARN" : 3,
|
|
26
|
-
"ERROR" : 4,
|
|
27
|
-
"FATAL" : 5
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Output log
|
|
32
|
-
*
|
|
33
|
-
* @param {String} level - Logging target level
|
|
34
|
-
* @param {String} message - Message to log
|
|
35
|
-
*/
|
|
36
|
-
Logger.prototype.log = function(level, message) {
|
|
37
|
-
if (this._logLevel <= level) {
|
|
38
|
-
if (level < LogLevels.ERROR) {
|
|
39
|
-
console.log(message);
|
|
40
|
-
} else {
|
|
41
|
-
console.error(message);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
for (var level in LogLevels) {
|
|
47
|
-
Logger.prototype[level.toLowerCase()] = createLoggerFunction(LogLevels[level]);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function createLoggerFunction(level) {
|
|
51
|
-
return function(message) { this.log(level, message); };
|
|
52
|
-
}
|