PageRenderTime 42ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/Resources/dpd.js

https://github.com/deployd/dpd-titanium
JavaScript | 285 lines | 225 code | 47 blank | 13 comment | 46 complexity | a84fc4e44acb7e9315a43428d9f7d2af MD5 | raw file
  1. var root = 'http://localhost:2403' //Default
  2. , BASE_URL = '/'
  3. , _dpd = {}
  4. ;
  5. _dpd.ajax = function (url, options){
  6. var client = Ti.Network.createHTTPClient({
  7. url: url,
  8. onload: function (e) {
  9. options.success(JSON.parse(e.source.responseText));
  10. },
  11. onerror: function (e) {
  12. options.error(JSON.parse(e.source.responseText));
  13. }
  14. });
  15. client.open(options.method || "GET", url);
  16. client.send(options.data);
  17. }
  18. function getHost (url) {
  19. return url.split("://")[1].split(":")[0].split('/')[0];
  20. };
  21. function normalizeArray(parts, allowAboveRoot) {
  22. // if the path tries to go above the root, `up` ends up > 0
  23. var up = 0;
  24. for (var i = parts.length - 1; i >= 0; i--) {
  25. var last = parts[i];
  26. if (last == '.') {
  27. parts.splice(i, 1);
  28. } else if (last === '..') {
  29. parts.splice(i, 1);
  30. up++;
  31. } else if (up) {
  32. parts.splice(i, 1);
  33. up--;
  34. }
  35. }
  36. // if the path is allowed to go above the root, restore leading ..
  37. if (allowAboveRoot) {
  38. for (; up--; up) {
  39. parts.unshift('..');
  40. }
  41. }
  42. return parts;
  43. }
  44. function filterArray(list, fn) {
  45. if (Array.prototype.filter) return Array.prototype.filter.call(list, fn);
  46. var newList = [];
  47. for (var i = 0; i < list.length; i++) {
  48. if (fn(list[i])) {
  49. newList.push(list[i]);
  50. }
  51. }
  52. return newList;
  53. }
  54. function joinPath() {
  55. var paths = Array.prototype.slice.call(arguments, 0);
  56. paths = paths.join('/').split('/');
  57. return '/' + filterArray(paths, function(p, index) {
  58. return p && typeof p === 'string';
  59. }).join('/');
  60. }
  61. function isComplex(obj) {
  62. if (obj) {
  63. for (var k in obj) {
  64. if (obj.hasOwnProperty(k)) {
  65. if (typeof obj[k] !== 'string') {
  66. return true;
  67. }
  68. }
  69. }
  70. }
  71. return false;
  72. }
  73. function createQueryString(query) {
  74. var parts = [];
  75. for (var k in query) {
  76. if (query.hasOwnProperty(k)) {
  77. parts.push(Ti.Network.encodeURIComponent(k) + "=" + Ti.Network.encodeURIComponent(query[k]));
  78. }
  79. }
  80. return parts.join('&');
  81. }
  82. function encodeIfComplex(query) {
  83. if (isComplex(query)) {
  84. return Ti.Network.encodeURI(JSON.stringify(query));
  85. } else if (query) {
  86. return createQueryString(query);
  87. }
  88. }
  89. function returnSuccess(fn) {
  90. return function(data) {
  91. if (typeof fn === 'function') fn(data);
  92. };
  93. }
  94. function returnError(fn) {
  95. return function(data) {
  96. if (typeof fn === 'function') fn(null, data);
  97. };
  98. }
  99. var baseMethods = {
  100. get: function(options, fn) {
  101. var query = encodeIfComplex(options.query);
  102. return _dpd.ajax(root + joinPath(BASE_URL, options.path), {
  103. method: "GET"
  104. , query: query
  105. , success: returnSuccess(fn)
  106. , error: returnError(fn)
  107. });
  108. }
  109. , del: function(options, fn) {
  110. var query = encodeIfComplex(options.query);
  111. return _dpd.ajax(root + joinPath(BASE_URL, options.path), {
  112. method: "DELETE"
  113. , query: query
  114. , success: returnSuccess(fn)
  115. , error: returnError(fn)
  116. });
  117. }
  118. , requestWithBody: function(method, options, fn) {
  119. var query = encodeIfComplex(options.query);
  120. if (query) query = '?' + query;
  121. else query = '';
  122. return _dpd.ajax(root + joinPath(BASE_URL, options.path) + query, {
  123. method: method
  124. , contentType: options.body && "application/json"
  125. , data: options.body || {}
  126. , success: returnSuccess(fn)
  127. , error: returnError(fn)
  128. });
  129. }
  130. };
  131. baseMethods.post = function(options, fn) {
  132. return baseMethods.requestWithBody("POST", options, fn);
  133. };
  134. baseMethods.put = function(options, fn) {
  135. return baseMethods.requestWithBody("PUT", options, fn);
  136. };
  137. function isString(arg) {
  138. return typeof arg === 'string' || typeof arg === 'number';
  139. }
  140. function toString(arg) {
  141. return arg ? arg.toString() : null;
  142. }
  143. function parseGetSignature(args) {
  144. var settings = {}
  145. , i = 0;
  146. // path/func
  147. if (isString(args[i]) || !args[i]) {
  148. settings.path = toString(args[i]);
  149. i++;
  150. }
  151. // join path to func
  152. if (isString(args[i]) || !args[i]) {
  153. settings.path = joinPath(settings.path, toString(args[i]));
  154. i++;
  155. }
  156. // query
  157. if (typeof args[i] === 'object' || !args[i]) { // IE considers console.log to be an object.
  158. settings.query = args[i];
  159. i++;
  160. }
  161. if (typeof args[i] === 'function') {
  162. settings.fn = args[i];
  163. }
  164. return settings;
  165. }
  166. function parsePostSignature(args) {
  167. var settings = {}
  168. , i = 0;
  169. //path
  170. if (isString(args[i]) || !args[i]) {
  171. settings.path = toString(args[i]);
  172. i++;
  173. }
  174. // body
  175. if (typeof args[i] === 'object' || !args[i]) {
  176. settings.body = args[i];
  177. i++;
  178. }
  179. // query - if this exists the LAST obj was query and the new one is body
  180. if (typeof args[i] === 'object') {
  181. settings.query = settings.body;
  182. settings.body = args[i];
  183. i++;
  184. }
  185. if (typeof args[i] === 'function') {
  186. settings.fn = args[i];
  187. }
  188. return settings;
  189. }
  190. module.exports = function(resource) {
  191. var r = {
  192. get: function(func, path, query, fn) {
  193. var settings = parseGetSignature(arguments);
  194. settings.path = joinPath(resource, settings.path);
  195. return baseMethods.get(settings, settings.fn);
  196. }
  197. , post: function(path, query, body, fn) {
  198. var settings = parsePostSignature(arguments);
  199. settings.path = joinPath(resource, settings.path);
  200. return baseMethods.post(settings, settings.fn);
  201. }
  202. , put: function(path, query, body, fn) {
  203. var settings = parsePostSignature(arguments);
  204. settings.path = joinPath(resource, settings.path);
  205. return baseMethods.put(settings, settings.fn);
  206. }, del: function(path, query, fn) {
  207. var settings = parseGetSignature(arguments);
  208. settings.path = joinPath(resource, settings.path);
  209. return baseMethods.del(settings, settings.fn);
  210. }
  211. };
  212. r.exec = function(func, path, body, fn) {
  213. var settings = {}
  214. , i = 0;
  215. settings.func = arguments[i];
  216. i++;
  217. // path
  218. if (isString(arguments[i])) {
  219. settings.path = arguments[i];
  220. i++;
  221. }
  222. // body
  223. if (typeof arguments[i] === 'object') {
  224. settings.body = arguments[i];
  225. i++;
  226. }
  227. fn = arguments[i];
  228. settings.path = joinPath(resource, settings.func, settings.path);
  229. return baseMethods.post(settings, fn);
  230. };
  231. return r;
  232. };
  233. module.exports.init = function (options, fn) {
  234. /*
  235. root: string, server including protocol, host, port
  236. */
  237. root = options.root || root;
  238. }