@knocklabs/client 0.4.5-rc.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.
Files changed (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +174 -0
  3. package/dist/cjs/api.js +165 -0
  4. package/dist/cjs/api.js.map +1 -0
  5. package/dist/cjs/clients/feed/feed.js +557 -0
  6. package/dist/cjs/clients/feed/feed.js.map +1 -0
  7. package/dist/cjs/clients/feed/index.js +43 -0
  8. package/dist/cjs/clients/feed/index.js.map +1 -0
  9. package/dist/cjs/clients/feed/interfaces.js +2 -0
  10. package/dist/cjs/clients/feed/interfaces.js.map +1 -0
  11. package/dist/cjs/clients/feed/store.js +115 -0
  12. package/dist/cjs/clients/feed/store.js.map +1 -0
  13. package/dist/cjs/clients/feed/types.js +2 -0
  14. package/dist/cjs/clients/feed/types.js.map +1 -0
  15. package/dist/cjs/clients/feed/utils.js +31 -0
  16. package/dist/cjs/clients/feed/utils.js.map +1 -0
  17. package/dist/cjs/clients/preferences/index.js +406 -0
  18. package/dist/cjs/clients/preferences/index.js.map +1 -0
  19. package/dist/cjs/clients/preferences/interfaces.js +2 -0
  20. package/dist/cjs/clients/preferences/interfaces.js.map +1 -0
  21. package/dist/cjs/index.js +108 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/interfaces.js +2 -0
  24. package/dist/cjs/interfaces.js.map +1 -0
  25. package/dist/cjs/knock.js +86 -0
  26. package/dist/cjs/knock.js.map +1 -0
  27. package/dist/cjs/networkStatus.js +21 -0
  28. package/dist/cjs/networkStatus.js.map +1 -0
  29. package/dist/esm/api.js +119 -0
  30. package/dist/esm/api.js.map +1 -0
  31. package/dist/esm/clients/feed/feed.js +337 -0
  32. package/dist/esm/clients/feed/feed.js.map +1 -0
  33. package/dist/esm/clients/feed/index.js +20 -0
  34. package/dist/esm/clients/feed/index.js.map +1 -0
  35. package/dist/esm/clients/feed/interfaces.js +2 -0
  36. package/dist/esm/clients/feed/interfaces.js.map +1 -0
  37. package/dist/esm/clients/feed/store.js +91 -0
  38. package/dist/esm/clients/feed/store.js.map +1 -0
  39. package/dist/esm/clients/feed/types.js +2 -0
  40. package/dist/esm/clients/feed/types.js.map +1 -0
  41. package/dist/esm/clients/feed/utils.js +18 -0
  42. package/dist/esm/clients/feed/utils.js.map +1 -0
  43. package/dist/esm/clients/preferences/index.js +176 -0
  44. package/dist/esm/clients/preferences/index.js.map +1 -0
  45. package/dist/esm/clients/preferences/interfaces.js +2 -0
  46. package/dist/esm/clients/preferences/interfaces.js.map +1 -0
  47. package/dist/esm/index.js +10 -0
  48. package/dist/esm/index.js.map +1 -0
  49. package/dist/esm/interfaces.js +2 -0
  50. package/dist/esm/interfaces.js.map +1 -0
  51. package/dist/esm/knock.js +69 -0
  52. package/dist/esm/knock.js.map +1 -0
  53. package/dist/esm/networkStatus.js +13 -0
  54. package/dist/esm/networkStatus.js.map +1 -0
  55. package/dist/types/api.d.ts +28 -0
  56. package/dist/types/api.d.ts.map +1 -0
  57. package/dist/types/clients/feed/feed.d.ts +46 -0
  58. package/dist/types/clients/feed/feed.d.ts.map +1 -0
  59. package/dist/types/clients/feed/index.d.ts +11 -0
  60. package/dist/types/clients/feed/index.d.ts.map +1 -0
  61. package/dist/types/clients/feed/interfaces.d.ts +50 -0
  62. package/dist/types/clients/feed/interfaces.d.ts.map +1 -0
  63. package/dist/types/clients/feed/store.d.ts +3 -0
  64. package/dist/types/clients/feed/store.d.ts.map +1 -0
  65. package/dist/types/clients/feed/types.d.ts +25 -0
  66. package/dist/types/clients/feed/types.d.ts.map +1 -0
  67. package/dist/types/clients/feed/utils.d.ts +4 -0
  68. package/dist/types/clients/feed/utils.d.ts.map +1 -0
  69. package/dist/types/clients/preferences/index.d.ts +18 -0
  70. package/dist/types/clients/preferences/index.d.ts.map +1 -0
  71. package/dist/types/clients/preferences/interfaces.d.ts +26 -0
  72. package/dist/types/clients/preferences/interfaces.d.ts.map +1 -0
  73. package/dist/types/index.d.ts +10 -0
  74. package/dist/types/index.d.ts.map +1 -0
  75. package/dist/types/interfaces.d.ts +27 -0
  76. package/dist/types/interfaces.d.ts.map +1 -0
  77. package/dist/types/knock.d.ts +19 -0
  78. package/dist/types/knock.d.ts.map +1 -0
  79. package/dist/types/networkStatus.d.ts +8 -0
  80. package/dist/types/networkStatus.d.ts.map +1 -0
  81. package/package.json +66 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/clients/preferences/index.ts"],"names":["DEFAULT_PREFERENCE_SET_ID","buildUpdateParam","param","subscribed","Preferences","instance","client","makeRequest","method","url","userId","result","handleResponse","options","preferenceSetId","preferenceSet","data","channelTypePreferences","channelType","setting","workflowPreferences","workflowKey","params","categoryPreferences","categoryKey","response","statusCode","Error","error","body"],"mappings":"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","sourcesContent":["import { ApiResponse } from \"../../api\";\nimport Knock from \"../../knock\";\nimport {\n ChannelTypePreferences,\n ChannelType,\n PreferenceOptions,\n SetPreferencesProperties,\n WorkflowPreferenceSetting,\n WorkflowPreferences,\n PreferenceSet,\n} from \"./interfaces\";\n\nconst DEFAULT_PREFERENCE_SET_ID = \"default\";\n\nfunction buildUpdateParam(param: WorkflowPreferenceSetting) {\n if (typeof param === \"object\") {\n return param;\n }\n\n return { subscribed: param };\n}\n\nclass Preferences {\n private instance: Knock;\n\n constructor(instance: Knock) {\n this.instance = instance;\n }\n\n async getAll() {\n const result = await this.instance.client().makeRequest({\n method: \"GET\",\n url: `/v1/users/${this.instance.userId}/preferences`,\n });\n\n return this.handleResponse(result);\n }\n\n async get(options: PreferenceOptions = {}) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"GET\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}`,\n });\n\n return this.handleResponse(result);\n }\n\n async set(\n preferenceSet: SetPreferencesProperties,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}`,\n data: preferenceSet,\n });\n\n return this.handleResponse(result);\n }\n\n async setChannelTypes(\n channelTypePreferences: ChannelTypePreferences,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}/channel_types`,\n data: channelTypePreferences,\n });\n\n return this.handleResponse(result);\n }\n\n async setChannelType(\n channelType: ChannelType,\n setting: boolean,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}/channel_types/${channelType}`,\n data: { subscribed: setting },\n });\n\n return this.handleResponse(result);\n }\n\n async setWorkflows(\n workflowPreferences: WorkflowPreferences,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}/workflows`,\n data: workflowPreferences,\n });\n\n return this.handleResponse(result);\n }\n\n async setWorkflow(\n workflowKey: string,\n setting: WorkflowPreferenceSetting,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n const params = buildUpdateParam(setting);\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}/workflows/${workflowKey}`,\n data: params,\n });\n\n return this.handleResponse(result);\n }\n\n async setCategories(\n categoryPreferences: WorkflowPreferences,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}/categories`,\n data: categoryPreferences,\n });\n\n return this.handleResponse(result);\n }\n\n async setCategory(\n categoryKey: string,\n setting: WorkflowPreferenceSetting,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n const params = buildUpdateParam(setting);\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}/categories/${categoryKey}`,\n data: params,\n });\n\n return this.handleResponse(result);\n }\n\n private handleResponse(response: ApiResponse) {\n if (response.statusCode === \"error\") {\n throw new Error(response.error || response.body);\n }\n\n return response.body as PreferenceSet;\n }\n}\n\nexport default Preferences;\n"],"file":"index.js"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"interfaces.js"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ var _exportNames = {
11
+ FeedClient: true,
12
+ Feed: true
13
+ };
14
+ Object.defineProperty(exports, "FeedClient", {
15
+ enumerable: true,
16
+ get: function get() {
17
+ return _feed["default"];
18
+ }
19
+ });
20
+ Object.defineProperty(exports, "Feed", {
21
+ enumerable: true,
22
+ get: function get() {
23
+ return _feed.Feed;
24
+ }
25
+ });
26
+ exports["default"] = void 0;
27
+
28
+ var _knock = _interopRequireDefault(require("./knock"));
29
+
30
+ var _feed = _interopRequireWildcard(require("./clients/feed"));
31
+
32
+ var _interfaces = require("./interfaces");
33
+
34
+ Object.keys(_interfaces).forEach(function (key) {
35
+ if (key === "default" || key === "__esModule") return;
36
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
37
+ if (key in exports && exports[key] === _interfaces[key]) return;
38
+ Object.defineProperty(exports, key, {
39
+ enumerable: true,
40
+ get: function get() {
41
+ return _interfaces[key];
42
+ }
43
+ });
44
+ });
45
+
46
+ var _types = require("./clients/feed/types");
47
+
48
+ Object.keys(_types).forEach(function (key) {
49
+ if (key === "default" || key === "__esModule") return;
50
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
51
+ if (key in exports && exports[key] === _types[key]) return;
52
+ Object.defineProperty(exports, key, {
53
+ enumerable: true,
54
+ get: function get() {
55
+ return _types[key];
56
+ }
57
+ });
58
+ });
59
+
60
+ var _interfaces2 = require("./clients/feed/interfaces");
61
+
62
+ Object.keys(_interfaces2).forEach(function (key) {
63
+ if (key === "default" || key === "__esModule") return;
64
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
65
+ if (key in exports && exports[key] === _interfaces2[key]) return;
66
+ Object.defineProperty(exports, key, {
67
+ enumerable: true,
68
+ get: function get() {
69
+ return _interfaces2[key];
70
+ }
71
+ });
72
+ });
73
+
74
+ var _interfaces3 = require("./clients/preferences/interfaces");
75
+
76
+ Object.keys(_interfaces3).forEach(function (key) {
77
+ if (key === "default" || key === "__esModule") return;
78
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
79
+ if (key in exports && exports[key] === _interfaces3[key]) return;
80
+ Object.defineProperty(exports, key, {
81
+ enumerable: true,
82
+ get: function get() {
83
+ return _interfaces3[key];
84
+ }
85
+ });
86
+ });
87
+
88
+ var _networkStatus = require("./networkStatus");
89
+
90
+ Object.keys(_networkStatus).forEach(function (key) {
91
+ if (key === "default" || key === "__esModule") return;
92
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
93
+ if (key in exports && exports[key] === _networkStatus[key]) return;
94
+ Object.defineProperty(exports, key, {
95
+ enumerable: true,
96
+ get: function get() {
97
+ return _networkStatus[key];
98
+ }
99
+ });
100
+ });
101
+
102
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
103
+
104
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
105
+
106
+ var _default = _knock["default"];
107
+ exports["default"] = _default;
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts"],"names":["Knock"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAEA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;eAEeA,iB","sourcesContent":["import Knock from \"./knock\";\nimport FeedClient, { Feed } from \"./clients/feed\";\n\nexport * from \"./interfaces\";\nexport * from \"./clients/feed/types\";\nexport * from \"./clients/feed/interfaces\";\nexport * from \"./clients/preferences/interfaces\";\nexport * from \"./networkStatus\";\n\nexport default Knock;\nexport { Feed, FeedClient };\n"],"file":"index.js"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"interfaces.js"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+
16
+ var _api = _interopRequireDefault(require("./api"));
17
+
18
+ var _feed = _interopRequireDefault(require("./clients/feed"));
19
+
20
+ var _preferences = _interopRequireDefault(require("./clients/preferences"));
21
+
22
+ var DEFAULT_HOST = "https://api.knock.app";
23
+
24
+ var Knock = /*#__PURE__*/function () {
25
+ function Knock(apiKey) {
26
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
27
+ (0, _classCallCheck2["default"])(this, Knock);
28
+ this.apiKey = apiKey;
29
+ (0, _defineProperty2["default"])(this, "host", void 0);
30
+ (0, _defineProperty2["default"])(this, "userToken", void 0);
31
+ (0, _defineProperty2["default"])(this, "apiClient", null);
32
+ (0, _defineProperty2["default"])(this, "userId", void 0);
33
+ (0, _defineProperty2["default"])(this, "feeds", new _feed["default"](this));
34
+ (0, _defineProperty2["default"])(this, "preferences", new _preferences["default"](this));
35
+ this.host = options.host || DEFAULT_HOST; // Fail loudly if we're using the wrong API key
36
+
37
+ if (this.apiKey && this.apiKey.startsWith("sk_")) {
38
+ throw new Error("[Knock] You are using your secret API key on the client. Please use the public key.");
39
+ }
40
+ }
41
+
42
+ (0, _createClass2["default"])(Knock, [{
43
+ key: "client",
44
+ value: function client() {
45
+ if (!this.userId && !this.userToken) {
46
+ console.warn("[Knock] You must call authenticate(userId, userToken) first before trying to make a request.\n Typically you'll see this message when you're creating a feed instance before having called\n authenticate with a user Id and token. That means we won't know who to issue the request\n to Knock on behalf of.\n ");
47
+ } // Initiate a new API client if we don't have one yet
48
+
49
+
50
+ if (!this.apiClient) {
51
+ this.apiClient = new _api["default"]({
52
+ apiKey: this.apiKey,
53
+ host: this.host,
54
+ userToken: this.userToken
55
+ });
56
+ }
57
+
58
+ return this.apiClient;
59
+ }
60
+ /*
61
+ Authenticates the current user. In non-sandbox environments
62
+ the userToken must be specified.
63
+ */
64
+
65
+ }, {
66
+ key: "authenticate",
67
+ value: function authenticate(userId, userToken) {
68
+ this.userId = userId;
69
+ this.userToken = userToken;
70
+ return;
71
+ } // Used to teardown any connected instances
72
+
73
+ }, {
74
+ key: "teardown",
75
+ value: function teardown() {
76
+ if (this.apiClient) {
77
+ this.apiClient.disconnectSocket();
78
+ }
79
+ }
80
+ }]);
81
+ return Knock;
82
+ }();
83
+
84
+ var _default = Knock;
85
+ exports["default"] = _default;
86
+ //# sourceMappingURL=knock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/knock.ts"],"names":["DEFAULT_HOST","Knock","apiKey","options","FeedClient","Preferences","host","startsWith","Error","userId","userToken","console","warn","apiClient","ApiClient","disconnectSocket"],"mappings":";;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AAGA,IAAMA,YAAY,GAAG,uBAArB;;IAEMC,K;AASJ,iBAAqBC,MAArB,EAAiE;AAAA,QAA5BC,OAA4B,uEAAJ,EAAI;AAAA;AAAA,SAA5CD,MAA4C,GAA5CA,MAA4C;AAAA;AAAA;AAAA,wDAN3B,IAM2B;AAAA;AAAA,oDAHhD,IAAIE,gBAAJ,CAAe,IAAf,CAGgD;AAAA,0DAF1C,IAAIC,uBAAJ,CAAgB,IAAhB,CAE0C;AAC/D,SAAKC,IAAL,GAAYH,OAAO,CAACG,IAAR,IAAgBN,YAA5B,CAD+D,CAG/D;;AACA,QAAI,KAAKE,MAAL,IAAe,KAAKA,MAAL,CAAYK,UAAZ,CAAuB,KAAvB,CAAnB,EAAkD;AAChD,YAAM,IAAIC,KAAJ,CACJ,qFADI,CAAN;AAGD;AACF;;;;WAED,kBAAS;AACP,UAAI,CAAC,KAAKC,MAAN,IAAgB,CAAC,KAAKC,SAA1B,EAAqC;AACnCC,QAAAA,OAAO,CAACC,IAAR;AAOD,OATM,CAWP;;;AACA,UAAI,CAAC,KAAKC,SAAV,EAAqB;AACnB,aAAKA,SAAL,GAAiB,IAAIC,eAAJ,CAAc;AAC7BZ,UAAAA,MAAM,EAAE,KAAKA,MADgB;AAE7BI,UAAAA,IAAI,EAAE,KAAKA,IAFkB;AAG7BI,UAAAA,SAAS,EAAE,KAAKA;AAHa,SAAd,CAAjB;AAKD;;AAED,aAAO,KAAKG,SAAZ;AACD;AAED;AACF;AACA;AACA;;;;WACE,sBAAaJ,MAAb,EAA6BC,SAA7B,EAAiD;AAC/C,WAAKD,MAAL,GAAcA,MAAd;AACA,WAAKC,SAAL,GAAiBA,SAAjB;AAEA;AACD,K,CAED;;;;WACA,oBAAW;AACT,UAAI,KAAKG,SAAT,EAAoB;AAClB,aAAKA,SAAL,CAAeE,gBAAf;AACD;AACF;;;;;eAGYd,K","sourcesContent":["import ApiClient from \"./api\";\nimport FeedClient from \"./clients/feed\";\nimport Preferences from \"./clients/preferences\";\nimport { KnockOptions } from \"./interfaces\";\n\nconst DEFAULT_HOST = \"https://api.knock.app\";\n\nclass Knock {\n private host: string;\n private userToken: string | undefined;\n private apiClient: ApiClient | null = null;\n public userId: string | undefined;\n\n readonly feeds = new FeedClient(this);\n readonly preferences = new Preferences(this);\n\n constructor(readonly apiKey: string, options: KnockOptions = {}) {\n this.host = options.host || DEFAULT_HOST;\n\n // Fail loudly if we're using the wrong API key\n if (this.apiKey && this.apiKey.startsWith(\"sk_\")) {\n throw new Error(\n \"[Knock] You are using your secret API key on the client. Please use the public key.\",\n );\n }\n }\n\n client() {\n if (!this.userId && !this.userToken) {\n console.warn(\n `[Knock] You must call authenticate(userId, userToken) first before trying to make a request.\n Typically you'll see this message when you're creating a feed instance before having called\n authenticate with a user Id and token. That means we won't know who to issue the request\n to Knock on behalf of.\n `,\n );\n }\n\n // Initiate a new API client if we don't have one yet\n if (!this.apiClient) {\n this.apiClient = new ApiClient({\n apiKey: this.apiKey,\n host: this.host,\n userToken: this.userToken,\n });\n }\n\n return this.apiClient;\n }\n\n /*\n Authenticates the current user. In non-sandbox environments\n the userToken must be specified.\n */\n authenticate(userId: string, userToken?: string) {\n this.userId = userId;\n this.userToken = userToken;\n\n return;\n }\n\n // Used to teardown any connected instances\n teardown() {\n if (this.apiClient) {\n this.apiClient.disconnectSocket();\n }\n }\n}\n\nexport default Knock;\n"],"file":"knock.js"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isRequestInFlight = isRequestInFlight;
7
+ exports.NetworkStatus = void 0;
8
+ var NetworkStatus;
9
+ exports.NetworkStatus = NetworkStatus;
10
+
11
+ (function (NetworkStatus) {
12
+ NetworkStatus["loading"] = "loading";
13
+ NetworkStatus["fetchMore"] = "fetchMore";
14
+ NetworkStatus["ready"] = "ready";
15
+ NetworkStatus["error"] = "error";
16
+ })(NetworkStatus || (exports.NetworkStatus = NetworkStatus = {}));
17
+
18
+ function isRequestInFlight(networkStatus) {
19
+ return [NetworkStatus.loading, NetworkStatus.fetchMore].includes(networkStatus);
20
+ }
21
+ //# sourceMappingURL=networkStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/networkStatus.ts"],"names":["NetworkStatus","isRequestInFlight","networkStatus","loading","fetchMore","includes"],"mappings":";;;;;;;IAAYA,a;;;WAAAA,a;AAAAA,EAAAA,a;AAAAA,EAAAA,a;AAAAA,EAAAA,a;AAAAA,EAAAA,a;GAAAA,a,6BAAAA,a;;AAcL,SAASC,iBAAT,CAA2BC,aAA3B,EAAkE;AACvE,SAAO,CAACF,aAAa,CAACG,OAAf,EAAwBH,aAAa,CAACI,SAAtC,EAAiDC,QAAjD,CACLH,aADK,CAAP;AAGD","sourcesContent":["export enum NetworkStatus {\n // Performing a top level loading operation\n loading = \"loading\",\n\n // Performing a fetch more on some already loaded data\n fetchMore = \"fetchMore\",\n\n // No operation is currently in progress\n ready = \"ready\",\n\n // The last operation failed with an error\n error = \"error\",\n}\n\nexport function isRequestInFlight(networkStatus: NetworkStatus): boolean {\n return [NetworkStatus.loading, NetworkStatus.fetchMore].includes(\n networkStatus,\n );\n}\n"],"file":"networkStatus.js"}
@@ -0,0 +1,119 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import axios from "axios";
4
+ import axiosRetry from "axios-retry";
5
+ import { Socket } from "phoenix";
6
+
7
+ class ApiClient {
8
+ constructor(options) {
9
+ _defineProperty(this, "host", void 0);
10
+
11
+ _defineProperty(this, "apiKey", void 0);
12
+
13
+ _defineProperty(this, "userToken", void 0);
14
+
15
+ _defineProperty(this, "axiosClient", void 0);
16
+
17
+ _defineProperty(this, "socket", void 0);
18
+
19
+ _defineProperty(this, "socketConnected", false);
20
+
21
+ this.host = options.host;
22
+ this.apiKey = options.apiKey;
23
+ this.userToken = options.userToken || null; // Create a retryable axios client
24
+
25
+ this.axiosClient = axios.create({
26
+ baseURL: this.host,
27
+ headers: {
28
+ Accept: "application/json",
29
+ "Content-Type": "application/json",
30
+ Authorization: "Bearer ".concat(this.apiKey),
31
+ "X-Knock-User-Token": this.userToken
32
+ }
33
+ });
34
+ this.socket = new Socket("".concat(this.host.replace("http", "ws"), "/ws/v1"), {
35
+ params: {
36
+ user_token: this.userToken,
37
+ api_key: this.apiKey
38
+ }
39
+ });
40
+ axiosRetry(this.axiosClient, {
41
+ retries: 3,
42
+ retryCondition: this.canRetryRequest,
43
+ retryDelay: axiosRetry.exponentialDelay
44
+ });
45
+ }
46
+
47
+ connectSocket() {
48
+ if (this.socketConnected) {
49
+ return;
50
+ }
51
+
52
+ this.socket.connect();
53
+ this.socket.onOpen(() => {
54
+ this.socketConnected = true;
55
+ });
56
+ }
57
+
58
+ disconnectSocket() {
59
+ this.socket.disconnect();
60
+ return;
61
+ }
62
+
63
+ createChannel(name, params) {
64
+ return this.socket.channel(name, params);
65
+ }
66
+
67
+ makeRequest(req) {
68
+ var _this = this;
69
+
70
+ return _asyncToGenerator(function* () {
71
+ try {
72
+ var result = yield _this.axiosClient(req);
73
+ return {
74
+ statusCode: result.status < 300 ? "ok" : "error",
75
+ body: result.data,
76
+ error: undefined,
77
+ status: result.status
78
+ };
79
+ } catch (e) {
80
+ // tslint:disable-next-line
81
+ console.error(e);
82
+ return {
83
+ statusCode: "error",
84
+ status: 500,
85
+ body: undefined,
86
+ error: e
87
+ };
88
+ }
89
+ })();
90
+ }
91
+
92
+ canRetryRequest(error) {
93
+ // Retry Network Errors.
94
+ if (axiosRetry.isNetworkError(error)) {
95
+ return true;
96
+ }
97
+
98
+ if (!error.response) {
99
+ // Cannot determine if the request can be retried
100
+ return false;
101
+ } // Retry Server Errors (5xx).
102
+
103
+
104
+ if (error.response.status >= 500 && error.response.status <= 599) {
105
+ return true;
106
+ } // Retry if rate limited.
107
+
108
+
109
+ if (error.response.status === 429) {
110
+ return true;
111
+ }
112
+
113
+ return false;
114
+ }
115
+
116
+ }
117
+
118
+ export default ApiClient;
119
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/api.ts"],"names":["axios","axiosRetry","Socket","ApiClient","constructor","options","host","apiKey","userToken","axiosClient","create","baseURL","headers","Accept","Authorization","socket","replace","params","user_token","api_key","retries","retryCondition","canRetryRequest","retryDelay","exponentialDelay","connectSocket","socketConnected","connect","onOpen","disconnectSocket","disconnect","createChannel","name","channel","makeRequest","req","result","statusCode","status","body","data","error","undefined","e","console","isNetworkError","response"],"mappings":"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","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig } from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport { Socket } from \"phoenix\";\nimport { AxiosError } from \"axios\";\n\ntype ApiClientOptions = {\n host: string;\n apiKey: string;\n userToken: string | undefined;\n};\n\nexport interface ApiResponse {\n error?: any;\n body?: any;\n statusCode: \"ok\" | \"error\";\n status: number;\n}\n\nclass ApiClient {\n private host: string;\n private apiKey: string;\n private userToken: string | null;\n private axiosClient: AxiosInstance;\n private socket: Socket;\n public socketConnected: boolean = false;\n\n constructor(options: ApiClientOptions) {\n this.host = options.host;\n this.apiKey = options.apiKey;\n this.userToken = options.userToken || null;\n\n // Create a retryable axios client\n this.axiosClient = axios.create({\n baseURL: this.host,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-Knock-User-Token\": this.userToken,\n },\n });\n\n this.socket = new Socket(`${this.host.replace(\"http\", \"ws\")}/ws/v1`, {\n params: {\n user_token: this.userToken,\n api_key: this.apiKey,\n },\n });\n\n axiosRetry(this.axiosClient, {\n retries: 3,\n retryCondition: this.canRetryRequest,\n retryDelay: axiosRetry.exponentialDelay,\n });\n }\n\n connectSocket() {\n if (this.socketConnected) {\n return;\n }\n\n this.socket.connect();\n this.socket.onOpen(() => {\n this.socketConnected = true;\n });\n }\n\n disconnectSocket() {\n this.socket.disconnect();\n return;\n }\n\n createChannel(name: string, params?: object) {\n return this.socket.channel(name, params);\n }\n\n async makeRequest(req: AxiosRequestConfig): Promise<ApiResponse> {\n try {\n const result = await this.axiosClient(req);\n\n return {\n statusCode: result.status < 300 ? \"ok\" : \"error\",\n body: result.data,\n error: undefined,\n status: result.status,\n };\n } catch (e) {\n // tslint:disable-next-line\n console.error(e);\n\n return {\n statusCode: \"error\",\n status: 500,\n body: undefined,\n error: e,\n };\n }\n }\n\n private canRetryRequest(error: AxiosError) {\n // Retry Network Errors.\n if (axiosRetry.isNetworkError(error)) {\n return true;\n }\n\n if (!error.response) {\n // Cannot determine if the request can be retried\n return false;\n }\n\n // Retry Server Errors (5xx).\n if (error.response.status >= 500 && error.response.status <= 599) {\n return true;\n }\n\n // Retry if rate limited.\n if (error.response.status === 429) {\n return true;\n }\n\n return false;\n }\n}\n\nexport default ApiClient;\n"],"file":"api.js"}
@@ -0,0 +1,337 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+
4
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
5
+
6
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
7
+
8
+ import EventEmitter from "eventemitter3";
9
+ import createStore from "./store";
10
+ import { isRequestInFlight, NetworkStatus } from "../../networkStatus";
11
+
12
+ class Feed {
13
+ // The raw store instance, used for binding in React and other environments
14
+ constructor(knock, feedId, options) {
15
+ this.knock = knock;
16
+ this.feedId = feedId;
17
+
18
+ _defineProperty(this, "apiClient", void 0);
19
+
20
+ _defineProperty(this, "userFeedId", void 0);
21
+
22
+ _defineProperty(this, "channelConnected", false);
23
+
24
+ _defineProperty(this, "channel", void 0);
25
+
26
+ _defineProperty(this, "broadcaster", void 0);
27
+
28
+ _defineProperty(this, "defaultOptions", void 0);
29
+
30
+ _defineProperty(this, "store", void 0);
31
+
32
+ this.apiClient = knock.client();
33
+ this.feedId = feedId;
34
+ this.userFeedId = this.buildUserFeedId();
35
+ this.store = createStore();
36
+ this.broadcaster = new EventEmitter();
37
+ this.defaultOptions = options; // Try and connect to the socket
38
+
39
+ this.apiClient.connectSocket();
40
+ this.channel = this.apiClient.createChannel("feeds:".concat(this.userFeedId), this.defaultOptions);
41
+ }
42
+ /*
43
+ Returns a socket to listen for feed updates
44
+ */
45
+
46
+
47
+ listenForUpdates() {
48
+ if (!this.channelConnected) {
49
+ this.channel.join().receive("ok", () => {
50
+ this.channelConnected = true;
51
+ });
52
+ this.channel.on("new-message", resp => this.onNewMessageReceived(resp));
53
+ }
54
+
55
+ return () => {
56
+ try {
57
+ this.channel.leave();
58
+ } catch (e) {
59
+ // tslint:disable-next-line
60
+ console.error("error while leaving channel", e);
61
+ }
62
+ };
63
+ }
64
+ /* Binds a handler to be invoked when event occurs */
65
+
66
+
67
+ on(eventName, callback) {
68
+ this.broadcaster.on(eventName, callback);
69
+ }
70
+
71
+ off(eventName, callback) {
72
+ this.broadcaster.off(eventName, callback);
73
+ }
74
+
75
+ getState() {
76
+ return this.store.getState();
77
+ }
78
+
79
+ markAsSeen(itemOrItems) {
80
+ var _this = this;
81
+
82
+ return _asyncToGenerator(function* () {
83
+ var now = new Date().toISOString();
84
+
85
+ _this.optimisticallyPerformStatusUpdate(itemOrItems, "seen", {
86
+ seen_at: now
87
+ }, "unseen_count");
88
+
89
+ return _this.makeStatusUpdate(itemOrItems, "seen");
90
+ })();
91
+ }
92
+
93
+ markAsUnseen(itemOrItems) {
94
+ var _this2 = this;
95
+
96
+ return _asyncToGenerator(function* () {
97
+ _this2.optimisticallyPerformStatusUpdate(itemOrItems, "unseen", {
98
+ seen_at: null
99
+ }, "unseen_count");
100
+
101
+ return _this2.makeStatusUpdate(itemOrItems, "unseen");
102
+ })();
103
+ }
104
+
105
+ markAsRead(itemOrItems) {
106
+ var _this3 = this;
107
+
108
+ return _asyncToGenerator(function* () {
109
+ var now = new Date().toISOString();
110
+
111
+ _this3.optimisticallyPerformStatusUpdate(itemOrItems, "read", {
112
+ read_at: now
113
+ }, "unread_count");
114
+
115
+ return _this3.makeStatusUpdate(itemOrItems, "read");
116
+ })();
117
+ }
118
+
119
+ markAsUnread(itemOrItems) {
120
+ var _this4 = this;
121
+
122
+ return _asyncToGenerator(function* () {
123
+ _this4.optimisticallyPerformStatusUpdate(itemOrItems, "unread", {
124
+ read_at: null
125
+ }, "unread_count");
126
+
127
+ return _this4.makeStatusUpdate(itemOrItems, "unread");
128
+ })();
129
+ }
130
+
131
+ markAsArchived(itemOrItems) {
132
+ var _this5 = this;
133
+
134
+ return _asyncToGenerator(function* () {
135
+ var now = new Date().toISOString();
136
+
137
+ _this5.optimisticallyPerformStatusUpdate(itemOrItems, "archived", {
138
+ archived_at: now
139
+ });
140
+
141
+ return _this5.makeStatusUpdate(itemOrItems, "archived");
142
+ })();
143
+ }
144
+
145
+ markAsUnarchived(itemOrItems) {
146
+ var _this6 = this;
147
+
148
+ return _asyncToGenerator(function* () {
149
+ _this6.optimisticallyPerformStatusUpdate(itemOrItems, "unarchived", {
150
+ archived_at: null
151
+ });
152
+
153
+ return _this6.makeStatusUpdate(itemOrItems, "unarchived");
154
+ })();
155
+ }
156
+ /* Fetches the feed content, appending it to the store */
157
+
158
+
159
+ fetch() {
160
+ var _arguments = arguments,
161
+ _this7 = this;
162
+
163
+ return _asyncToGenerator(function* () {
164
+ var options = _arguments.length > 0 && _arguments[0] !== undefined ? _arguments[0] : {};
165
+ var {
166
+ setState,
167
+ getState
168
+ } = _this7.store;
169
+ var {
170
+ networkStatus
171
+ } = getState(); // If there's an existing request in flight, then do nothing
172
+
173
+ if (isRequestInFlight(networkStatus)) {
174
+ return;
175
+ } // Set the loading type based on the request type it is
176
+
177
+
178
+ setState(store => {
179
+ var _options$__loadingTyp;
180
+
181
+ return store.setNetworkStatus((_options$__loadingTyp = options.__loadingType) !== null && _options$__loadingTyp !== void 0 ? _options$__loadingTyp : NetworkStatus.loading);
182
+ }); // Always include the default params, if they have been set
183
+
184
+ var queryParams = _objectSpread(_objectSpread({}, _this7.defaultOptions), options);
185
+
186
+ var result = yield _this7.apiClient.makeRequest({
187
+ method: "GET",
188
+ url: "/v1/users/".concat(_this7.knock.userId, "/feeds/").concat(_this7.feedId),
189
+ params: queryParams
190
+ });
191
+
192
+ if (result.statusCode === "error") {
193
+ setState(store => store.setNetworkStatus(NetworkStatus.error));
194
+ return {
195
+ status: result.statusCode,
196
+ data: result.error || result.body
197
+ };
198
+ }
199
+
200
+ var response = {
201
+ entries: result.body.entries,
202
+ meta: result.body.meta,
203
+ page_info: result.body.page_info
204
+ };
205
+
206
+ if (options.before) {
207
+ var opts = {
208
+ shouldSetPage: false,
209
+ shouldAppend: true
210
+ };
211
+ setState(state => state.setResult(response, opts));
212
+ } else if (options.after) {
213
+ var _opts = {
214
+ shouldSetPage: true,
215
+ shouldAppend: true
216
+ };
217
+ setState(state => state.setResult(response, _opts));
218
+ } else {
219
+ setState(state => state.setResult(response));
220
+ }
221
+
222
+ _this7.broadcast("messages.new", response);
223
+
224
+ return {
225
+ data: response,
226
+ status: result.statusCode
227
+ };
228
+ })();
229
+ }
230
+
231
+ fetchNextPage() {
232
+ var _this8 = this;
233
+
234
+ return _asyncToGenerator(function* () {
235
+ // Attempts to fetch the next page of results (if we have any)
236
+ var {
237
+ getState
238
+ } = _this8.store;
239
+ var {
240
+ pageInfo
241
+ } = getState();
242
+
243
+ if (!pageInfo.after) {
244
+ // Nothing more to fetch
245
+ return;
246
+ }
247
+
248
+ _this8.fetch({
249
+ after: pageInfo.after,
250
+ __loadingType: NetworkStatus.fetchMore
251
+ });
252
+ })();
253
+ }
254
+
255
+ broadcast(eventName, data) {
256
+ this.broadcaster.emit(eventName, data);
257
+ } // Invoked when a new real-time message comes in from the socket
258
+
259
+
260
+ onNewMessageReceived(_ref) {
261
+ var _this9 = this;
262
+
263
+ return _asyncToGenerator(function* () {
264
+ var {
265
+ metadata
266
+ } = _ref;
267
+ // Handle the new message coming in
268
+ var {
269
+ getState,
270
+ setState
271
+ } = _this9.store;
272
+ var currentHead = getState().items[0]; // Optimistically set the badge counts
273
+
274
+ setState(state => state.setMetadata(metadata)); // Fetch the items before the current head (if it exists)
275
+
276
+ _this9.fetch({
277
+ before: currentHead === null || currentHead === void 0 ? void 0 : currentHead.__cursor
278
+ });
279
+ })();
280
+ }
281
+
282
+ buildUserFeedId() {
283
+ return "".concat(this.feedId, ":").concat(this.knock.userId);
284
+ }
285
+
286
+ optimisticallyPerformStatusUpdate(itemOrItems, type, attrs, badgeCountAttr) {
287
+ var {
288
+ getState,
289
+ setState
290
+ } = this.store;
291
+ var itemIds = Array.isArray(itemOrItems) ? itemOrItems.map(item => item.id) : [itemOrItems.id];
292
+
293
+ if (badgeCountAttr) {
294
+ var {
295
+ metadata
296
+ } = getState(); // Tnis is a hack to determine the direction of whether we're
297
+ // adding or removing from the badge count
298
+
299
+ var direction = type.startsWith("un") ? itemIds.length : -itemIds.length;
300
+ setState(store => store.setMetadata(_objectSpread(_objectSpread({}, metadata), {}, {
301
+ [badgeCountAttr]: Math.max(0, metadata[badgeCountAttr] + direction)
302
+ })));
303
+ } // Update the items with the given attributes
304
+
305
+
306
+ setState(store => store.setItemAttrs(itemIds, attrs));
307
+ }
308
+
309
+ makeStatusUpdate(itemOrItems, type) {
310
+ var _this10 = this;
311
+
312
+ return _asyncToGenerator(function* () {
313
+ // If we're interacting with an array, then we want to send this as a batch
314
+ if (Array.isArray(itemOrItems)) {
315
+ var itemIds = itemOrItems.map(item => item.id);
316
+ return yield _this10.apiClient.makeRequest({
317
+ method: "POST",
318
+ url: "/v1/messages/batch/".concat(type),
319
+ data: {
320
+ message_ids: itemIds
321
+ }
322
+ });
323
+ } // If its a single then we can just call the regular endpoint
324
+
325
+
326
+ var result = yield _this10.apiClient.makeRequest({
327
+ method: type.startsWith("un") ? "DELETE" : "PUT",
328
+ url: "/v1/messages/".concat(itemOrItems.id, "/").concat(type)
329
+ });
330
+ return result;
331
+ })();
332
+ }
333
+
334
+ }
335
+
336
+ export default Feed;
337
+ //# sourceMappingURL=feed.js.map