sockethub 4.1.0 → 5.0.0-alpha.0

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 (71) hide show
  1. package/bin/sockethub +23 -20
  2. package/coverage/tmp/coverage-15699-1646422276150-0.json +1 -0
  3. package/dist/bootstrap/init.js +1 -1
  4. package/dist/bootstrap/init.js.map +1 -1
  5. package/dist/bootstrap/platforms.js +14 -18
  6. package/dist/janitor.js +11 -5
  7. package/dist/janitor.js.map +1 -1
  8. package/dist/middleware/create-activity-object.js.map +1 -1
  9. package/dist/middleware/expand-activity-stream.js +33 -0
  10. package/dist/middleware/expand-activity-stream.js.map +1 -0
  11. package/dist/middleware/expand-activity-stream.test.data.js +360 -0
  12. package/dist/middleware/expand-activity-stream.test.data.js.map +1 -0
  13. package/dist/middleware/store-credentials.js +1 -1
  14. package/dist/middleware/store-credentials.js.map +1 -1
  15. package/dist/middleware/validate.js +30 -104
  16. package/dist/middleware/validate.js.map +1 -1
  17. package/dist/middleware/validate.test.data.js +151 -111
  18. package/dist/middleware/validate.test.data.js.map +1 -1
  19. package/dist/middleware.js +47 -77
  20. package/dist/middleware.js.map +1 -1
  21. package/dist/platform-instance.js +47 -54
  22. package/dist/platform-instance.js.map +1 -1
  23. package/dist/platform.js +29 -10
  24. package/dist/platform.js.map +1 -1
  25. package/dist/process-manager.js +5 -2
  26. package/dist/process-manager.js.map +1 -1
  27. package/dist/routes.js +3 -5
  28. package/dist/routes.js.map +1 -1
  29. package/dist/sockethub-client.js +2604 -0
  30. package/dist/sockethub-client.js.map +1 -0
  31. package/dist/sockethub-client.min.js +2 -0
  32. package/dist/sockethub-client.min.js.LICENSE.txt +24 -0
  33. package/dist/sockethub.js +67 -36
  34. package/dist/sockethub.js.map +1 -1
  35. package/package.json +40 -36
  36. package/src/bootstrap/init.ts +6 -2
  37. package/src/bootstrap/platforms.js +14 -18
  38. package/src/crypto.ts +3 -3
  39. package/src/janitor.ts +18 -10
  40. package/src/middleware/create-activity-object.ts +1 -2
  41. package/src/middleware/expand-activity-stream.test.data.ts +365 -0
  42. package/src/middleware/expand-activity-stream.test.ts +78 -0
  43. package/src/middleware/expand-activity-stream.ts +27 -0
  44. package/src/middleware/store-credentials.test.ts +12 -12
  45. package/src/middleware/store-credentials.ts +4 -4
  46. package/src/middleware/validate.test.data.ts +154 -120
  47. package/src/middleware/validate.test.ts +7 -10
  48. package/src/middleware/validate.ts +30 -123
  49. package/src/middleware.test.ts +59 -26
  50. package/src/middleware.ts +44 -76
  51. package/src/platform-instance.test.ts +8 -10
  52. package/src/platform-instance.ts +58 -57
  53. package/src/platform.ts +30 -14
  54. package/src/process-manager.ts +7 -4
  55. package/src/routes.ts +3 -6
  56. package/src/serve.ts +1 -1
  57. package/src/sockethub-client.test.ts +235 -0
  58. package/src/sockethub-client.ts +164 -0
  59. package/src/sockethub.ts +75 -68
  60. package/views/examples/dummy.ejs +6 -6
  61. package/views/examples/feeds.ejs +8 -8
  62. package/views/examples/irc.ejs +64 -58
  63. package/views/examples/shared.js +31 -29
  64. package/views/examples/xmpp.ejs +48 -57
  65. package/webpack.minified.config.js +14 -0
  66. package/webpack.normal.config.js +14 -0
  67. package/coverage/tmp/coverage-24546-1630615250805-0.json +0 -1
  68. package/dist/client/sockethub-client.js +0 -171
  69. package/dist/client/sockethub-client.js.map +0 -1
  70. package/src/client/sockethub-client.js +0 -178
  71. package/test/middleware-suite.js +0 -101
@@ -1,38 +1,62 @@
1
1
  export default [
2
+ {
3
+ "name": "mismatched types",
4
+ "valid": false,
5
+ "type": "credentials",
6
+ "input":{
7
+ "id":"blah",
8
+ "type":"send",
9
+ "context":"dummy",
10
+ "actor":{
11
+ "id":"dood@irc.freenode.net",
12
+ "type":"person",
13
+ "name":"dood"
14
+ },
15
+ "target":{
16
+ "id":"irc.freenode.net/sockethub",
17
+ "type":"person",
18
+ "name":"sockethub"
19
+ },
20
+ "object":{
21
+ "type":"credentials",
22
+ "user": 'foo',
23
+ "pass": 'bar'
24
+ }
25
+ },
26
+ 'error': "Error: credential activity streams must have credentials set as type"
27
+ },
2
28
  {
3
29
  "name": "basic",
4
30
  "valid":true,
5
31
  "type":"credentials",
6
32
  "input":{
7
- "@id":"blah",
8
- "@type":"send",
33
+ "id":"blah",
34
+ "type":"credentials",
9
35
  "context":"dummy",
10
36
  "actor":{
11
- "@id":"dood@irc.freenode.net",
12
- "@type":"person",
13
- "displayName":"dood"
14
- },
15
- "target":{
16
- "@id":"irc.freenode.net/sockethub",
17
- "@type":"person",
18
- "displayName":"sockethub"
37
+ "id":"dood@irc.freenode.net",
38
+ "type":"person",
39
+ "name":"dood"
19
40
  },
20
41
  "object":{
21
- "@type":"credentials"
42
+ 'type': 'credentials',
43
+ "user": 'foo',
44
+ "pass": 'bar'
22
45
  }
23
46
  },
24
47
  "output":"same"
25
48
  },
26
49
  {
27
- "name":"new format",
50
+ "name":"irc credentials",
28
51
  "valid":true,
29
52
  "type":"credentials",
30
53
  "input":{
31
54
  "context":"irc",
55
+ "type":"credentials",
32
56
  "actor":{
33
- "@id":"sh-9K3Vk@irc.freenode.net",
34
- "@type":"person",
35
- "displayName":"sh-9K3Vk",
57
+ "id":"sh-9K3Vk@irc.freenode.net",
58
+ "type":"person",
59
+ "name":"sh-9K3Vk",
36
60
  "image":{
37
61
  "height":250,
38
62
  "mediaType":"image/jpeg",
@@ -42,7 +66,7 @@ export default [
42
66
  "url":"http://sockethub.org"
43
67
  },
44
68
  "object":{
45
- "@type":"credentials",
69
+ "type":"credentials",
46
70
  "nick":"sh-9K3Vk",
47
71
  "port":6667,
48
72
  "secure":false,
@@ -51,6 +75,36 @@ export default [
51
75
  },
52
76
  "output":"same"
53
77
  },
78
+ {
79
+ "name":"bad irc credentials: user/nick host/server",
80
+ "valid":false,
81
+ "type":"credentials",
82
+ "input":{
83
+ "context":"irc",
84
+ "type":"credentials",
85
+ "actor":{
86
+ "id":"sh-9K3Vk@irc.freenode.net",
87
+ "type":"person",
88
+ "name":"sh-9K3Vk",
89
+ "image":{
90
+ "height":250,
91
+ "mediaType":"image/jpeg",
92
+ "url":"http://example.org/image.jpg",
93
+ "width":250
94
+ },
95
+ "url":"http://sockethub.org"
96
+ },
97
+ "object":{
98
+ "type":"credentials",
99
+ "user":"sh-9K3Vk",
100
+ "port":6667,
101
+ "secure":false,
102
+ "host":"irc.freenode.net"
103
+ }
104
+ },
105
+ "error":
106
+ "Error: /object: must NOT have additional properties"
107
+ },
54
108
  {
55
109
  "name":"no type specified",
56
110
  "valid":false,
@@ -65,16 +119,17 @@ export default [
65
119
  "port":5222,
66
120
  "resource":"laptop"
67
121
  }
68
- }
122
+ },
123
+ "error": "Error: credential activity streams must have credentials set as type"
69
124
  },
70
125
  {
71
- "name":"person",
126
+ "name":"basic person",
72
127
  "type":"activity-object",
73
128
  "valid":true,
74
129
  "input":{
75
- "@id":"blah",
76
- "@type":"person",
77
- "displayName":"dood"
130
+ "id":"blah",
131
+ "type":"person",
132
+ "name":"dood"
78
133
  },
79
134
  "output":"same"
80
135
  },
@@ -83,9 +138,9 @@ export default [
83
138
  "valid":true,
84
139
  "type":"activity-object",
85
140
  "input":{
86
- "@id":"blah",
87
- "@type":"person",
88
- "displayName":"bob",
141
+ "id":"blah",
142
+ "type":"person",
143
+ "name":"bob",
89
144
  "hello":"there",
90
145
  "i":[
91
146
  "am",
@@ -99,33 +154,38 @@ export default [
99
154
  "valid":false,
100
155
  "type":"activity-object",
101
156
  "input":{
102
- "@type":"credentials",
157
+ "type":"credentials",
103
158
  "nick":"sh-9K3Vk",
104
159
  "port":6667,
105
160
  "secure":false,
106
161
  "server":"irc.freenode.net"
107
- }
162
+ },
163
+ "error":
164
+ "Error: /object: must match exactly one schema in oneOf: " +
165
+ "credentials, feed, message, me, person, room, service, website, " +
166
+ "attendance, presence, relationship, topic, address"
108
167
  },
109
168
  {
110
169
  "name":"alone credentials (as credentials)",
111
170
  "valid":false,
112
171
  "type":"credentials",
113
172
  "input":{
114
- "@type":"credentials",
173
+ "type":"credentials",
115
174
  "nick":"sh-9K3Vk",
116
175
  "port":6667,
117
176
  "secure":false,
118
177
  "server":"irc.freenode.net"
119
- }
178
+ },
179
+ "error": "Error: platform context undefined not registered with this sockethub instance."
120
180
  },
121
181
  {
122
182
  "name":"new person",
123
183
  "valid":true,
124
184
  "type":"activity-object",
125
185
  "input":{
126
- "@id":"sh-9K3Vk@irc.freenode.net",
127
- "@type":"person",
128
- "displayName":"sh-9K3Vk",
186
+ "id":"sh-9K3Vk@irc.freenode.net",
187
+ "type":"person",
188
+ "name":"sh-9K3Vk",
129
189
  "image":{
130
190
  "height":250,
131
191
  "mediaType":"image/jpeg",
@@ -141,9 +201,9 @@ export default [
141
201
  "valid":true,
142
202
  "type":"activity-object",
143
203
  "input":{
144
- "@id":"irc://sh-9K3Vk@irc.freenode.net",
145
- "@type":"person",
146
- "displayName":"sh-9K3Vk",
204
+ "id":"irc://sh-9K3Vk@irc.freenode.net",
205
+ "type":"person",
206
+ "name":"sh-9K3Vk",
147
207
  "url":"http://sockethub.org"
148
208
  },
149
209
  "output":"same"
@@ -151,7 +211,7 @@ export default [
151
211
  {
152
212
  "name":"bad parent object",
153
213
  "valid":false,
154
- "type":"activity-object",
214
+ "type":"activity-stream",
155
215
  "input":{
156
216
  "string":"this is a string",
157
217
  "array":[
@@ -162,125 +222,99 @@ export default [
162
222
  }
163
223
  ],
164
224
  "as":{
165
- "@id":"blah",
166
- "@type":"send",
225
+ "id":"blah",
226
+ "type":"send",
167
227
  "context":"hello",
168
228
  "actor":{
169
- "displayName":"dood"
229
+ "name":"dood"
170
230
  },
171
231
  "target":{
172
- "@type":"person",
173
- "displayName":"bob"
232
+ "type":"person",
233
+ "name":"bob"
174
234
  },
175
235
  "object":{
176
- "@type":"credentials"
236
+ "type":"credentials"
177
237
  }
178
238
  },
179
239
  "noId":{
180
- "displayName":"dood"
240
+ "name":"dood"
181
241
  },
182
242
  "noId2":{
183
- "@type":"person",
184
- "displayName":"bob"
243
+ "type":"person",
244
+ "name":"bob"
185
245
  },
186
246
  "noDisplayName":{
187
- "@id":"larg"
247
+ "id":"larg"
188
248
  }
189
- }
249
+ },
250
+ "error": "Error: platform context undefined not registered with this sockethub instance."
190
251
  },
191
252
  {
192
- "name":"expand actor and target of unknowns",
193
- "valid":true,
253
+ "name":"unexpected AS",
254
+ "valid":false,
194
255
  "type":"message",
195
256
  "input":{
196
257
  "actor":"irc://uuu@localhost",
197
- "@type":"join",
258
+ "type":"join",
198
259
  "context":"irc",
199
260
  "target":"irc://irc.dooder.net/a-room"
200
261
  },
201
- "output":{
202
- "actor":{
203
- "@id":"irc://uuu@localhost",
204
- "displayName":"uuu"
205
- },
206
- "@type":"join",
262
+ "error": "Error: /actor: must be object"
263
+ },
264
+ {
265
+ "name":"missing type property",
266
+ "valid":false,
267
+ "type":"message",
268
+ "input":{
269
+ "actor": { "id": "irc://uuu@localhost", "type": "person" },
207
270
  "context":"irc",
208
- "target":{
209
- "@id":"irc://irc.dooder.net/a-room",
210
- "displayName":"/a-room"
211
- }
212
- }
271
+ "target": { "id": "irc://irc.dooder.net/a-room", "type": "room" }
272
+ },
273
+ "error": "Error: activity stream: must have required property \'type\'"
213
274
  },
214
275
  {
215
- "name":"expand actor and target of unknowns",
216
- "valid":true,
276
+ "name":"invalid context property",
277
+ "valid":false,
217
278
  "type":"message",
218
279
  "input":{
219
- "actor":"hyper_rau@localhost",
220
- "@type":"join",
221
- "context":"xmpp",
222
- "object":{
223
-
224
- },
225
- "target":"dooder"
280
+ "actor": { "id": "irc://uuu@localhost", "type": "person" },
281
+ "type":"foo",
282
+ "context": "foobar",
283
+ "target": { "id": "irc://irc.dooder.net/a-room", "type": "room" }
226
284
  },
227
- "output":{
228
- "actor":{
229
- "@id":"hyper_rau@localhost",
230
- "displayName":"hyper_rau@localhost"
231
- },
232
- "@type":"join",
233
- "context":"xmpp",
234
- "object":{
235
-
236
- },
237
- "target":{
238
- "@id":"dooder",
239
- "displayName":"dooder"
240
- }
241
- }
285
+ "error": "Error: platform context foobar not registered with this sockethub instance."
242
286
  },
243
287
  {
244
- "name":"expand known person",
245
- "valid":true,
288
+ "name":"missing actor property",
289
+ "valid":false,
246
290
  "type":"message",
247
291
  "input":{
248
- "actor":"sh-9K3Vk@irc.freenode.net",
249
- "target":"blah",
250
- "@type":"send",
292
+ "type": "foo",
251
293
  "context":"irc",
252
- "object":{
253
-
254
- }
294
+ "target": { "id": "irc://irc.dooder.net/a-room", "type": "room" }
255
295
  },
256
- "output":{
257
- "actor":{
258
- "@id":"sh-9K3Vk@irc.freenode.net",
259
- "@type":"person",
260
- "displayName":"sh-9K3Vk",
261
- "image":{
262
- "height":250,
263
- "mediaType":"image/jpeg",
264
- "url":"http://example.org/image.jpg",
265
- "width":250
266
- },
267
- "url":"http://sockethub.org"
268
- },
269
- "target":{
270
- "@id":"blah",
271
- "@type":"person",
272
- "displayName":"bob",
273
- "hello":"there",
274
- "i":[
275
- "am",
276
- "extras"
277
- ]
278
- },
279
- "@type":"send",
280
- "context":"irc",
281
- "object":{
282
-
283
- }
296
+ "error": "Error: activity stream: must have required property \'actor\'"
297
+ },
298
+ {
299
+ "name":"traditional message",
300
+ "valid":true,
301
+ "type":"message",
302
+ "input":{
303
+ "type": "update",
304
+ "context": "irc",
305
+ "actor": { "id": "irc://uuu@localhost", "type": "person" }
284
306
  }
307
+ },
308
+ {
309
+ "name":"message with wrong type",
310
+ "valid":false,
311
+ "type":"message",
312
+ "input":{
313
+ "type": "foorg",
314
+ "context": "irc",
315
+ "actor": { "id": "irc://uuu@localhost", "type": "person" }
316
+ },
317
+ "error": "Error: platform type foorg not supported by irc platform. " +
318
+ "(types: credentials, connect, update, join, leave, send, query, announce)"
285
319
  }
286
320
  ];
@@ -17,9 +17,6 @@ const validateMod = proxyquire('./validate', {
17
17
  const validate = validateMod.default;
18
18
 
19
19
  import asObjects from "./validate.test.data";
20
- import ActivityStreams from 'activity-streams';
21
-
22
- const activity = ActivityStreams();
23
20
 
24
21
  describe('Middleware: Validate', () => {
25
22
  describe('AS object validations', () => {
@@ -29,18 +26,18 @@ describe('Middleware: Validate', () => {
29
26
  validate(obj.type, 'tests')(obj.input, (msg) => {
30
27
  if (obj.output) {
31
28
  if (obj.output === 'same') {
32
- expect(obj.input).to.eql(msg);
29
+ expect(msg).to.eql(obj.input);
33
30
  } else {
34
- expect(obj.output).to.eql(msg);
31
+ expect(msg).to.eql(obj.output);
35
32
  }
36
33
  }
37
34
  if (obj.valid) {
38
- expect(msg instanceof Error).to.be.false;
35
+ expect(msg).to.not.be.instanceof(Error);
39
36
  } else {
40
- expect(msg instanceof Error).to.be.true;
41
- }
42
- if ((obj.valid) && (obj.type === 'activity-object')) {
43
- activity.Object.create(msg);
37
+ expect(msg).to.be.instanceof(Error);
38
+ if (obj.error) {
39
+ expect(msg.toString()).to.equal(obj.error);
40
+ }
44
41
  }
45
42
  done();
46
43
  });
@@ -1,142 +1,49 @@
1
1
  /**
2
2
  * responsible for handling the validation and expansion (when applicable) of all incoming objects
3
3
  */
4
- import tv4 from 'tv4';
5
4
  import debug from 'debug';
6
- import URI from 'urijs';
7
- import ActivityStreams from 'activity-streams';
8
- import * as SockethubSchemas from 'sockethub-schemas';
5
+ import * as Schemas from 'sockethub-schemas';
6
+ import { ActivityStream } from "../sockethub";
9
7
 
10
- import init from '../bootstrap/init';
11
- import config from '../config';
12
- import {ActivityObject} from "../sockethub";
8
+ // @ts-ignore
9
+ import init from "../bootstrap/init";
13
10
 
14
- const activity = ActivityStreams(config.get('activity-streams:opts'));
15
-
16
- // load sockethub-activity-stream schema and register it with tv4
17
- // http://sockethub.org/schemas/v0/activity-stream#
18
- tv4.addSchema(SockethubSchemas.ActivityStream.id, SockethubSchemas.ActivityStream);
19
- // load sockethub-activity-object schema and register it with tv4
20
- // http://sockethub.org/schemas/v0/activity-object#
21
- tv4.addSchema(SockethubSchemas.ActivityObject.id, SockethubSchemas.ActivityObject);
22
-
23
- // educated guess on what the displayName is, if it's not defined
24
- // since we know the @id is a URI, we prioritize by username, then fragment (no case yet for path)
25
- function ensureDisplayName(msg: any) {
26
- if ((msg['@id']) && (! msg.displayName)) {
27
- const uri = new URI(msg['@id']);
28
- return uri.username() || getUriFragment(uri) || uri.path();
29
- }
30
- return msg.displayName;
31
- }
32
-
33
- function ensureObject(msg: any) {
34
- return !((typeof msg !== 'object') || (Array.isArray(msg)));
35
- }
36
-
37
- // expand given prop to full object if they are just strings
38
- // FIXME are we sure this works? What's propName for?
39
- function expandProp(propName, prop) {
40
- return (typeof prop === 'string') ? activity.Object.get(prop, true) : prop;
41
- }
42
-
43
- function expandStream(msg) {
44
- msg.actor.displayName = ensureDisplayName(msg.actor);
45
- if (msg.target) {
46
- msg.target.displayName = ensureDisplayName(msg.target);
47
- }
48
- return msg;
49
- }
50
-
51
- function getUriFragment(uri: any) {
52
- const frag = uri.fragment();
53
- return (frag) ? '#' + frag : undefined;
54
- }
55
-
56
- function processActivityObject(msg: any, done: Function) {
57
- if (! validateActivityObject(msg)) {
58
- return done(new Error(
59
- `activity-object schema validation failed: ${tv4.error.dataPath} = ${tv4.error.message}`));
60
- }
61
- msg.displayName = ensureDisplayName(msg);
62
- return done(msg); // passed validation, on to next handler in middleware chain
63
- }
64
-
65
- function processActivityStream(msg: any, done: Function) {
66
- let stream;
67
- try { // expands the AS object to a full object with the expected properties
68
- stream = activity.Stream(msg);
69
- } catch (e) {
70
- return done(new Error(e));
71
- }
72
- msg = stream; // overwrite message with expanded as object stream
73
-
74
- if (! validateActivityStream(msg)) {
75
- return done(new Error(
76
- `actvity-stream schema validation failed: ${tv4.error.dataPath}: ${tv4.error.message}`));
77
- }
78
- // passed validation, on to next handler in middleware chain
79
- return done(expandStream(msg));
80
- }
81
-
82
- function processCredentials(msg: any, done: Function) {
83
- msg.actor = expandProp('actor', msg.actor);
84
- msg.target = expandProp('target', msg.target);
85
- let credentialsSchema = tv4.getSchema(
86
- `http://sockethub.org/schemas/v0/context/${msg.context}/credentials`);
87
- if (! credentialsSchema) {
88
- return done(new Error(`no credentials schema found for ${msg.context} context`));
89
- }
90
-
91
- if (! validateCredentials(msg, credentialsSchema)) {
92
- return done(new Error(
93
- `credentials schema validation failed: ${tv4.error.dataPath} = ${tv4.error.message}`));
94
- }
95
- // passed validation, on to next handler in middleware chain
96
- return done(expandStream(msg));
97
- }
98
-
99
- function validateActivityObject(msg: any) {
100
- return tv4.validate({ object: msg }, SockethubSchemas.ActivityObject);
101
- }
102
-
103
- function validateCredentials(msg: any, schema: any) {
104
- return tv4.validate(msg, schema);
105
- }
106
-
107
- function validateActivityStream(msg: any) {
108
- // TODO figure out a way to allow for special objects from platforms, without
109
- // ignoring failed activity stream schema checks
110
- if (! tv4.validate(msg, SockethubSchemas.ActivityStream)) {
111
- return tv4.getSchema(`http://sockethub.org/schemas/v0/context/${msg.context}/messages`);
112
- }
113
- return true;
114
- }
11
+ init.platforms.forEach((platform) => {
12
+ Object.keys(platform.schemas).forEach((key) => {
13
+ if (! platform.schemas[key]) { return; }
14
+ Schemas.validator.addPlatformSchema(platform.schemas[key], `${platform.id}/${key}`);
15
+ });
16
+ });
115
17
 
116
18
  // called when registered with the middleware function, define the type of validation
117
19
  // that will be called when the middleware eventually does.
118
20
  export default function validate(type: string, sockethubId: string) {
119
21
  const sessionLog = debug(`sockethub:validate:${sockethubId}`);
120
- // called by the middleware with the message and the next (callback) in the chain
121
- return (msg: ActivityObject, done: Function) => {
22
+ return (msg: ActivityStream, done: Function) => {
122
23
  sessionLog('applying schema validation for ' + type);
123
-
124
- if (! ensureObject(msg)) {
125
- done(new Error(`message received is not an object.`));
126
- } else if (type === 'activity-object') {
127
- processActivityObject(msg, done);
128
- } else if (typeof msg.context !== 'string') {
129
- done(new Error('message must contain a context property'));
24
+ if (type === 'activity-object') {
25
+ const err = Schemas.validator.validateActivityObject(msg);
26
+ err ? done(new Error(err)) : done(msg);
130
27
  } else if (! init.platforms.has(msg.context)) {
131
- done(
28
+ return done(
132
29
  new Error(`platform context ${msg.context} not registered with this sockethub instance.`)
133
30
  );
134
- } else if ((type === 'message') && (typeof msg['@type'] !== 'string')) {
135
- done(new Error('message must contain a @type property.'));
136
31
  } else if (type === 'credentials') {
137
- processCredentials(msg, done);
32
+ const err = Schemas.validator.validateCredentials(msg);
33
+ err ? done(new Error(err)) : done(msg);
138
34
  } else {
139
- processActivityStream(msg, done);
35
+ const err = Schemas.validator.validateActivityStream(msg);
36
+ if (err) {
37
+ done(new Error(err));
38
+ } else {
39
+ const platformMeta = init.platforms.get(msg.context);
40
+ if (!platformMeta.types.includes(msg.type)) {
41
+ return done(new Error(`platform type ${msg.type} not supported by ${msg.context} ` +
42
+ `platform. (types: ${platformMeta.types.join(', ')})`));
43
+ } else {
44
+ done(msg);
45
+ }
46
+ }
140
47
  }
141
48
  };
142
- };
49
+ };