« index

Coverage for /Users/kris/q-io/http-apps/json.js : 72%

75 lines | 54 run | 21 missing | 0 partial | 18 blocks | 0 blocks run | 18 blocks missing

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

  var Q = require("q");
  
  exports.HandleJsonResponses = function (app, reviver, tab) {
      return function (request) {
          request.handleJsonResponse = exports.handleJsonResponse;
          return Q.fcall(app, request)
          .then(function (response) {
              if (response.data !== void 0) {
                  return Q.fcall(exports.handleJsonResponse, response, reviver, tab);
              } else {
                  return response;
              }
          });
      };
  };
  
  exports.handleJsonResponse = function (response, revivier, tab) {
      response.headers["content-type"] = "application/json";
      response.body = {
          forEach: function (write) {
              write(JSON.stringify(response.data, revivier, tab));
          }
      };
      return response;
  };
  
  /**
   * Wraps a Q-JSGI application such that the child application may
   * simply return an object, which will in turn be serialized into a
   * Q-JSGI response.
   *
   * @param {Function(Request):Object} app an application that accepts a
   * request and returns a JSON serializable object.
   * @returns {App}
   */
  exports.Json = function (app, reviver, tabs) {
      return function (request, response) {
          return Q.when(app(request, response), function (object) {
              return exports.json(object, reviver, tabs);
          });
      };
  };
  
  /**
   * @param {Object} content data to serialize as JSON
   * @param {Function} reviver
   * @param {Number|String} tabs
   * @returns {Response}
   */
  exports.json = function (content, reviver, tabs) {
      try {
          var json = JSON.stringify(content, reviver, tabs);
      } catch (exception) {
          return Q.reject(exception);
      }
      return exports.ok([json]);
  };
  
  /**
   * @param {Function(Request, Object):Response} app
   * @param {App} badRequest
   * @returns {App}
   */
  exports.JsonRequest = function (app, badRequest) {
      if (!badRequest)
          badRequest = exports.badRequest;
      return exports.ContentRequest(function (content, request, response) {
          try {
              var object = JSON.parse(content);
          } catch (error) {
              return badRequest(request, error);
          }
          return app(object, request, response);
      });
  };
« index | cover.io