mozu-node-sdk
Version:
Mozu JavaScript SDK for Node.js and Arc.js environments
81 lines (72 loc) • 2.45 kB
JavaScript
;
var extend = require('./utils/tiny-extend'),
_sub = require('./utils/sub'),
constants = require('./constants'),
makeMethod = require('./utils/make-method'),
getConfig = require('./utils/get-config'),
normalizeContext = require('./utils/normalize-context'),
inMemoryAuthCache = require('./plugins/in-memory-auth-cache'),
serverSidePrerequisites = require('./plugins/server-side-prerequisites'),
expandUriTemplateFromContext = require('./plugins/expand-uritemplate-from-context'),
versionKey = constants.headers.VERSION,
version = constants.version;
var NodeDefaultPlugins = {
authenticationStorage: inMemoryAuthCache,
prerequisiteTasks: serverSidePrerequisites,
urlResolver: expandUriTemplateFromContext
};
function applyDefaultPlugins(client, plugins) {
Object.keys(plugins).forEach(function (n) {
return client[n] = plugins[n](client);
});
}
function makeClient(clientCls) {
return function (cfg) {
return new clientCls(extend({}, this, cfg));
};
}
function cloneContext(ctx) {
var newCtx;
if (!ctx) return {};
try {
newCtx = JSON.parse(JSON.stringify(ctx));
} catch (e) {
throw new Error('Could not serialize context when creating Client. ' + 'Do not assign non-serializable objects to the client.context.');
}
newCtx[versionKey] = newCtx[versionKey] || version;
return newCtx;
}
function isContextSufficient(context) {
return context && context.baseUrl;
}
function Client(cfg) {
cfg = cfg || {};
var context = normalizeContext(cfg.apiContext || cfg.context || {});
if (!isContextSufficient(context)) {
context = context ? extend(getConfig(), context) : getConfig();
}
this.context = cloneContext(context);
this.defaultRequestOptions = extend({}, Client.defaultRequestOptions, cfg.defaultRequestOptions);
// apply the right default plugin config for a server-side environment
// (that is, Node, ArcJS, or perhaps Rhino/Nashorn/WinJS)
if (typeof process !== "undefined") {
applyDefaultPlugins(this, NodeDefaultPlugins);
}
if (cfg.plugins) {
// override plugins if necessary
this.plugins = cfg.plugins.slice();
this.plugins.forEach(function (p) {
p(this);
}.bind(this));
}
}
// statics
extend(Client, {
defaultRequestOptions: {},
method: makeMethod,
sub: function sub(methods) {
return makeClient(_sub(Client, methods));
},
constants: constants
});
module.exports = Client;