@sockethub/server 5.0.0-alpha.3

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 (118) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +136 -0
  3. package/bin/sockethub +3 -0
  4. package/coverage/tmp/coverage-93126-1649152190997-0.json +1 -0
  5. package/dist/bootstrap/init.d.ts +18 -0
  6. package/dist/bootstrap/init.js +63 -0
  7. package/dist/bootstrap/init.js.map +1 -0
  8. package/dist/bootstrap/platforms.js +75 -0
  9. package/dist/common.d.ts +3 -0
  10. package/dist/common.js +20 -0
  11. package/dist/common.js.map +1 -0
  12. package/dist/config.d.ts +6 -0
  13. package/dist/config.js +102 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/crypto.d.ts +10 -0
  16. package/dist/crypto.js +38 -0
  17. package/dist/crypto.js.map +1 -0
  18. package/dist/defaults.json +28 -0
  19. package/dist/index.d.ts +2 -0
  20. package/dist/index.js +25 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/janitor.d.ts +15 -0
  23. package/dist/janitor.js +89 -0
  24. package/dist/janitor.js.map +1 -0
  25. package/dist/listener.d.ts +28 -0
  26. package/dist/listener.js +91 -0
  27. package/dist/listener.js.map +1 -0
  28. package/dist/middleware/create-activity-object.d.ts +6 -0
  29. package/dist/middleware/create-activity-object.js +19 -0
  30. package/dist/middleware/create-activity-object.js.map +1 -0
  31. package/dist/middleware/expand-activity-stream.d.ts +2 -0
  32. package/dist/middleware/expand-activity-stream.js +33 -0
  33. package/dist/middleware/expand-activity-stream.js.map +1 -0
  34. package/dist/middleware/expand-activity-stream.test.data.d.ts +480 -0
  35. package/dist/middleware/expand-activity-stream.test.data.js +360 -0
  36. package/dist/middleware/expand-activity-stream.test.data.js.map +1 -0
  37. package/dist/middleware/store-credentials.d.ts +3 -0
  38. package/dist/middleware/store-credentials.js +19 -0
  39. package/dist/middleware/store-credentials.js.map +1 -0
  40. package/dist/middleware/validate.d.ts +2 -0
  41. package/dist/middleware/validate.js +58 -0
  42. package/dist/middleware/validate.js.map +1 -0
  43. package/dist/middleware/validate.test.data.d.ts +532 -0
  44. package/dist/middleware/validate.test.data.js +263 -0
  45. package/dist/middleware/validate.test.data.js.map +1 -0
  46. package/dist/middleware.d.ts +10 -0
  47. package/dist/middleware.js +54 -0
  48. package/dist/middleware.js.map +1 -0
  49. package/dist/platform-instance.d.ts +77 -0
  50. package/dist/platform-instance.js +211 -0
  51. package/dist/platform-instance.js.map +1 -0
  52. package/dist/platform.d.ts +6 -0
  53. package/dist/platform.js +187 -0
  54. package/dist/platform.js.map +1 -0
  55. package/dist/process-manager.d.ts +11 -0
  56. package/dist/process-manager.js +78 -0
  57. package/dist/process-manager.js.map +1 -0
  58. package/dist/routes.d.ts +13 -0
  59. package/dist/routes.js +83 -0
  60. package/dist/routes.js.map +1 -0
  61. package/dist/sockethub.d.ts +39 -0
  62. package/dist/sockethub.js +119 -0
  63. package/dist/sockethub.js.map +1 -0
  64. package/dist/store.d.ts +5 -0
  65. package/dist/store.js +17 -0
  66. package/dist/store.js.map +1 -0
  67. package/package.json +103 -0
  68. package/sockethub.config.example.json +33 -0
  69. package/src/bootstrap/init.d.ts +8 -0
  70. package/src/bootstrap/init.ts +83 -0
  71. package/src/bootstrap/platforms.js +75 -0
  72. package/src/common.test.ts +54 -0
  73. package/src/common.ts +14 -0
  74. package/src/config.d.ts +2 -0
  75. package/src/config.test.ts +28 -0
  76. package/src/config.ts +94 -0
  77. package/src/crypto.d.ts +5 -0
  78. package/src/crypto.test.ts +41 -0
  79. package/src/crypto.ts +41 -0
  80. package/src/defaults.json +28 -0
  81. package/src/index.ts +28 -0
  82. package/src/janitor.d.ts +8 -0
  83. package/src/janitor.ts +89 -0
  84. package/src/listener.ts +79 -0
  85. package/src/middleware/create-activity-object.test.ts +10 -0
  86. package/src/middleware/create-activity-object.ts +13 -0
  87. package/src/middleware/expand-activity-stream.test.data.ts +365 -0
  88. package/src/middleware/expand-activity-stream.test.ts +78 -0
  89. package/src/middleware/expand-activity-stream.ts +27 -0
  90. package/src/middleware/store-credentials.test.ts +73 -0
  91. package/src/middleware/store-credentials.ts +16 -0
  92. package/src/middleware/validate.d.ts +1 -0
  93. package/src/middleware/validate.test.data.ts +261 -0
  94. package/src/middleware/validate.test.ts +83 -0
  95. package/src/middleware/validate.ts +49 -0
  96. package/src/middleware.d.ts +21 -0
  97. package/src/middleware.test.ts +154 -0
  98. package/src/middleware.ts +52 -0
  99. package/src/platform-instance.test.ts +237 -0
  100. package/src/platform-instance.ts +242 -0
  101. package/src/platform.ts +191 -0
  102. package/src/process-manager.ts +64 -0
  103. package/src/routes.test.ts +100 -0
  104. package/src/routes.ts +98 -0
  105. package/src/sockethub.d.ts +1 -0
  106. package/src/sockethub.ts +165 -0
  107. package/src/store.test.ts +28 -0
  108. package/src/store.ts +17 -0
  109. package/test/init-suite.js +41 -0
  110. package/test/queue.functional.test.js +0 -0
  111. package/test/sockethub-suite.js +25 -0
  112. package/tsconfig.json +18 -0
  113. package/views/examples/dummy.ejs +93 -0
  114. package/views/examples/feeds.ejs +90 -0
  115. package/views/examples/irc.ejs +239 -0
  116. package/views/examples/shared.js +72 -0
  117. package/views/examples/xmpp.ejs +191 -0
  118. package/views/index.ejs +17 -0
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const debug_1 = __importDefault(require("debug"));
7
+ const object_hash_1 = __importDefault(require("object-hash"));
8
+ const bull_1 = __importDefault(require("bull"));
9
+ const common_1 = require("./common");
10
+ const store_1 = require("./store");
11
+ // command-line params
12
+ const parentId = process.argv[2];
13
+ const platformName = process.argv[3];
14
+ let identifier = process.argv[4];
15
+ const loggerPrefix = `sockethub:platform:${platformName}:${identifier}`;
16
+ let logger = (0, debug_1.default)(loggerPrefix);
17
+ const redisConfig = process.env.REDIS_URL ? process.env.REDIS_URL
18
+ : { host: process.env.REDIS_HOST, port: process.env.REDIS_PORT };
19
+ const PlatformModule = require(`@sockethub/platform-${platformName}`);
20
+ let queueStarted = false;
21
+ let parentSecret1, parentSecret2;
22
+ logger(`platform handler initialized for ${platformName} ${identifier}`);
23
+ /**
24
+ * Handle any uncaught errors from the platform by alerting the worker and shutting down.
25
+ */
26
+ process.on('uncaughtException', (err) => {
27
+ console.log('EXCEPTION IN PLATFORM');
28
+ // eslint-disable-next-line security-node/detect-crlf
29
+ console.log(err.stack);
30
+ process.send(['error', err.toString()]);
31
+ process.exit(1);
32
+ });
33
+ /**
34
+ * Incoming messages from the worker to this platform. Data is an array, the first property is the
35
+ * method to call, the rest are params.
36
+ */
37
+ process.on('message', (data) => {
38
+ if (data[0] === 'secrets') {
39
+ parentSecret1 = data[1].parentSecret1;
40
+ parentSecret2 = data[1].parentSecret2;
41
+ startQueueListener();
42
+ }
43
+ });
44
+ /**
45
+ * Initialize platform module
46
+ */
47
+ const platformSession = {
48
+ debug: (0, debug_1.default)(`sockethub:platform:${platformName}:${identifier}`),
49
+ sendToClient: getSendFunction('message'),
50
+ updateActor: updateActor
51
+ };
52
+ const platform = new PlatformModule(platformSession);
53
+ /**
54
+ * Get the credentials stored for this user in this sessions store, if given the correct
55
+ * sessionSecret.
56
+ * @param actorId
57
+ * @param sessionId
58
+ * @param sessionSecret
59
+ * @param cb
60
+ */
61
+ function getCredentials(actorId, sessionId, sessionSecret, cb) {
62
+ if (platform.config.noCredentials) {
63
+ return cb();
64
+ }
65
+ const store = (0, store_1.getSessionStore)(parentId, parentSecret1, sessionId, sessionSecret);
66
+ store.get(actorId, (err, credentials) => {
67
+ if (platform.config.persist) {
68
+ // don't continue if we don't get credentials
69
+ if (err) {
70
+ return cb(err);
71
+ }
72
+ }
73
+ else if (!credentials) {
74
+ // also skip if this is a non-persist platform with no credentials
75
+ return cb();
76
+ }
77
+ if (platform.credentialsHash) {
78
+ if (platform.credentialsHash !== (0, object_hash_1.default)(credentials.object)) {
79
+ return cb('provided credentials do not match existing platform instance for actor '
80
+ + platform.actor.id);
81
+ }
82
+ }
83
+ else {
84
+ platform.credentialsHash = (0, object_hash_1.default)(credentials.object);
85
+ }
86
+ cb(undefined, credentials);
87
+ });
88
+ }
89
+ /**
90
+ * Returns a function used to handle completed jobs from the platform code (the `done` callback).
91
+ * @param secret the secret used to decrypt credentials
92
+ */
93
+ function getJobHandler(secret) {
94
+ return (job, done) => {
95
+ const jobData = (0, common_1.decryptJobData)(job, secret);
96
+ const jobLog = (0, debug_1.default)(`${loggerPrefix}:${jobData.sessionId}`);
97
+ jobLog(`received ${jobData.title} ${jobData.msg.type}`);
98
+ const sessionSecret = jobData.msg.sessionSecret;
99
+ delete jobData.msg.sessionSecret;
100
+ return getCredentials(jobData.msg.actor.id, jobData.sessionId, sessionSecret, (err, credentials) => {
101
+ if (err) {
102
+ return done(new Error(err));
103
+ }
104
+ let jobCallbackCalled = false;
105
+ const doneCallback = (err, result) => {
106
+ if (jobCallbackCalled) {
107
+ return;
108
+ }
109
+ jobCallbackCalled = true;
110
+ if (err) {
111
+ jobLog(`errored ${jobData.title} ${jobData.msg.type}`);
112
+ let errMsg;
113
+ // some error objects (eg. TimeoutError) don't interoplate correctly to human-readable
114
+ // so we have to do this little dance
115
+ try {
116
+ errMsg = err.toString();
117
+ }
118
+ catch (e) {
119
+ errMsg = err;
120
+ }
121
+ done(new Error(errMsg));
122
+ }
123
+ else {
124
+ jobLog(`completed ${jobData.title} ${jobData.msg.type}`);
125
+ done(null, result);
126
+ }
127
+ };
128
+ if ((Array.isArray(platform.config.requireCredentials)) &&
129
+ (platform.config.requireCredentials.includes(jobData.msg.type))) {
130
+ // add the credentials object if this method requires it
131
+ platform[jobData.msg.type](jobData.msg, credentials, doneCallback);
132
+ }
133
+ else if (platform.config.persist) {
134
+ if (platform.initialized) {
135
+ platform[jobData.msg.type](jobData.msg, doneCallback);
136
+ }
137
+ else {
138
+ done(new Error(`${jobData.msg.type} called on uninitialized platform`));
139
+ }
140
+ }
141
+ else {
142
+ platform[jobData.msg.type](jobData.msg, doneCallback);
143
+ }
144
+ });
145
+ };
146
+ }
147
+ /**
148
+ * Get an function which sends a message to the parent thread (PlatformInstance). The platform
149
+ * can call that function to send messages back to the client.
150
+ * @param command string containing the type of command to be sent. 'message' or 'close'
151
+ */
152
+ function getSendFunction(command) {
153
+ return function (msg, special) {
154
+ process.send([command, msg, special]);
155
+ };
156
+ }
157
+ /**
158
+ * When a user changes it's actor name, the channel identifier changes, we need to ensure that
159
+ * both the queue thread (listening on the channel for jobs) and the logging object are updated.
160
+ * @param credentials
161
+ */
162
+ function updateActor(credentials) {
163
+ identifier = (0, common_1.getPlatformId)(platformName, credentials.actor.id);
164
+ logger(`platform actor updated to ${credentials.actor.id} identifier ${identifier}`);
165
+ logger = (0, debug_1.default)(`sockethub:platform:${identifier}`);
166
+ platform.credentialsHash = (0, object_hash_1.default)(credentials.object);
167
+ platform.debug = (0, debug_1.default)(`sockethub:platform:${platformName}:${identifier}`);
168
+ process.send(['updateActor', undefined, identifier]);
169
+ startQueueListener(true);
170
+ }
171
+ /**
172
+ * starts listening on the queue for incoming jobs
173
+ * @param refresh boolean if the param is true, we re-init the queue.process
174
+ * (used when identifier changes)
175
+ */
176
+ function startQueueListener(refresh = false) {
177
+ const secret = parentSecret1 + parentSecret2;
178
+ if ((queueStarted) && (!refresh)) {
179
+ logger('start queue called multiple times, skipping');
180
+ return;
181
+ }
182
+ const queue = new bull_1.default(parentId + identifier, { redis: redisConfig });
183
+ queueStarted = true;
184
+ logger('listening on the queue for incoming jobs');
185
+ queue.process(getJobHandler(secret));
186
+ }
187
+ //# sourceMappingURL=/platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"/","sources":["platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import PlatformInstance from "./platform-instance";
2
+ declare class ProcessManager {
3
+ private readonly parentId;
4
+ private readonly parentSecret1;
5
+ private readonly parentSecret2;
6
+ constructor(parentId: string, parentSecret1: string, parentSecret2: string);
7
+ get(platform: string, actorId: string, sessionId?: string): PlatformInstance;
8
+ private createPlatformInstance;
9
+ private ensureProcess;
10
+ }
11
+ export default ProcessManager;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ const init_1 = __importDefault(require("./bootstrap/init"));
26
+ const platform_instance_1 = __importStar(require("./platform-instance"));
27
+ const common_1 = require("./common");
28
+ class ProcessManager {
29
+ constructor(parentId, parentSecret1, parentSecret2) {
30
+ this.parentId = parentId;
31
+ this.parentSecret1 = parentSecret1;
32
+ this.parentSecret2 = parentSecret2;
33
+ }
34
+ get(platform, actorId, sessionId) {
35
+ const platformDetails = init_1.default.platforms.get(platform);
36
+ let pi;
37
+ if (platformDetails.config.persist) {
38
+ // ensure process is started - one for each actor
39
+ pi = this.ensureProcess(platform, sessionId, actorId);
40
+ }
41
+ else {
42
+ // ensure process is started - one for all jobs
43
+ pi = this.ensureProcess(platform);
44
+ }
45
+ pi.config = platformDetails.config;
46
+ return pi;
47
+ }
48
+ createPlatformInstance(identifier, platform, actor) {
49
+ const secrets = [
50
+ 'secrets', {
51
+ parentSecret1: this.parentSecret1,
52
+ parentSecret2: this.parentSecret2
53
+ }
54
+ ];
55
+ const platformInstanceConfig = {
56
+ identifier: identifier,
57
+ platform: platform,
58
+ parentId: this.parentId,
59
+ actor: actor
60
+ };
61
+ const platformInstance = new platform_instance_1.default(platformInstanceConfig);
62
+ platformInstance.initQueue(this.parentSecret1 + this.parentSecret2);
63
+ platformInstance.process.send(secrets);
64
+ return platformInstance;
65
+ }
66
+ ensureProcess(platform, sessionId, actor) {
67
+ const identifier = (0, common_1.getPlatformId)(platform, actor);
68
+ const platformInstance = platform_instance_1.platformInstances.get(identifier) ||
69
+ this.createPlatformInstance(identifier, platform, actor);
70
+ if (sessionId) {
71
+ platformInstance.registerSession(sessionId);
72
+ }
73
+ platform_instance_1.platformInstances.set(identifier, platformInstance);
74
+ return platformInstance;
75
+ }
76
+ }
77
+ exports.default = ProcessManager;
78
+ //# sourceMappingURL=/process-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager.js","sourceRoot":"/","sources":["process-manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,4DAAoC;AACpC,yEAC4F;AAC5F,qCAAyC;AAEzC,MAAM,cAAc;IAKlB,YAAY,QAAgB,EAAE,aAAqB,EAAE,aAAqB;QACxE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,GAAG,CAAC,QAAgB,EAAE,OAAe,EAAE,SAAkB;QACvD,MAAM,eAAe,GAAG,cAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,EAAE,CAAC;QAEP,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE;YAClC,iDAAiD;YACjD,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;SACvD;aAAM;YACL,+CAA+C;YAC/C,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;SACnC;QACD,EAAE,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,sBAAsB,CAAC,UAAkB,EAAE,QAAgB,EACpC,KAAc;QAC3C,MAAM,OAAO,GAAsB;YACjC,SAAS,EAAE;gBACT,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC;SACF,CAAC;QACF,MAAM,sBAAsB,GAA2B;YACrD,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,KAAK;SACb,CAAC;QACF,MAAM,gBAAgB,GAAG,IAAI,2BAAgB,CAAC,sBAAsB,CAAC,CAAC;QACtE,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;QACpE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEO,aAAa,CAAC,QAAgB,EAAE,SAAkB,EAAE,KAAc;QACxE,MAAM,UAAU,GAAG,IAAA,sBAAa,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,gBAAgB,GAAG,qCAAiB,CAAC,GAAG,CAAC,UAAU,CAAC;YAChD,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnE,IAAI,SAAS,EAAE;YACb,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;SAC7C;QACD,qCAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QACpD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CACF;AAED,kBAAe,cAAc,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface IRoutePaths {
2
+ [key: string]: string;
3
+ }
4
+ export declare const basePaths: IRoutePaths;
5
+ export declare const examplePaths: IRoutePaths;
6
+ export declare const examplePages: IRoutePaths;
7
+ /**
8
+ * Setup
9
+ */
10
+ declare const routes: {
11
+ setup: (app: any, examplesEnabled?: boolean) => void;
12
+ };
13
+ export default routes;
package/dist/routes.js ADDED
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.examplePages = exports.examplePaths = exports.basePaths = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const config_1 = __importDefault(require("./config"));
9
+ const debug_1 = __importDefault(require("debug"));
10
+ const debug_scope = process.env.DEBUG || '', logger = (0, debug_1.default)('sockethub:server:routes'), address = config_1.default.get('public:protocol') + '://' +
11
+ config_1.default.get('public:host') + ':' +
12
+ config_1.default.get('public:port') +
13
+ config_1.default.get('public:path');
14
+ exports.basePaths = {
15
+ '/sockethub-client.js': path_1.default.resolve(`${__dirname}/../node_modules/@sockethub/client/dist/sockethub-client.js`),
16
+ '/sockethub-client.min.js': path_1.default.resolve(`${__dirname}/../node_modules/@sockethub/client/dist/sockethub-client.min.js`),
17
+ '/sockethub-client.js.map': path_1.default.resolve(`${__dirname}/../node_modules/@sockethub/client/dist/sockethub-client.js.map`),
18
+ '/socket.io.js': path_1.default.resolve(`${__dirname}/../node_modules/socket.io/client-dist/socket.io.js`)
19
+ };
20
+ exports.examplePaths = {
21
+ '/jquery.js': path_1.default.resolve(`${__dirname}/../node_modules/jquery/dist/jquery.min.js`),
22
+ '/jquery.min.map': path_1.default.resolve(`${__dirname}/../node_modules/jquery/dist/jquery.min.map`),
23
+ '/examples/shared.js': path_1.default.resolve(`${__dirname}/../views/examples/shared.js`)
24
+ };
25
+ exports.examplePages = {
26
+ '/': path_1.default.resolve(`${__dirname}/../views/index.ejs`),
27
+ '/examples/dummy': path_1.default.resolve(`${__dirname}/../views/examples/dummy.ejs`),
28
+ '/examples/feeds': path_1.default.resolve(`${__dirname}/../views/examples/feeds.ejs`),
29
+ '/examples/irc': path_1.default.resolve(`${__dirname}/../views/examples/irc.ejs`),
30
+ '/examples/xmpp': path_1.default.resolve(`${__dirname}/../views/examples/xmpp.ejs`)
31
+ };
32
+ function prepFileRoutes(pathMap) {
33
+ let _routes = [];
34
+ Object.keys(pathMap).forEach((key) => {
35
+ _routes.push({
36
+ meta: {
37
+ method: 'GET',
38
+ path: key
39
+ },
40
+ route: (req, res) => {
41
+ logger(`serving resource ${req.url}`);
42
+ res.setHeader('Access-Control-Allow-Origin', '*');
43
+ res.sendFile(pathMap[req.url]);
44
+ }
45
+ });
46
+ });
47
+ return _routes;
48
+ }
49
+ const baseRoutes = prepFileRoutes(exports.basePaths);
50
+ const exampleRoutes = prepFileRoutes(exports.examplePaths);
51
+ Object.keys(exports.examplePages).forEach((key) => {
52
+ exampleRoutes.push({
53
+ meta: {
54
+ method: 'GET',
55
+ path: key
56
+ },
57
+ route: (req, res) => {
58
+ logger(`serving page ${req.url}`);
59
+ res.render(exports.examplePages[req.url], {
60
+ debug_scope: debug_scope,
61
+ address: address,
62
+ });
63
+ }
64
+ });
65
+ });
66
+ function addRoute(app) {
67
+ return (route) => {
68
+ app[route.meta.method.toLowerCase()](route.meta.path, route.route);
69
+ };
70
+ }
71
+ /**
72
+ * Setup
73
+ */
74
+ const routes = {
75
+ setup: function (app, examplesEnabled = config_1.default.get('examples:enabled')) {
76
+ baseRoutes.forEach(addRoute(app));
77
+ if (examplesEnabled) {
78
+ exampleRoutes.forEach(addRoute(app));
79
+ }
80
+ }
81
+ };
82
+ exports.default = routes;
83
+ //# sourceMappingURL=/routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"/","sources":["routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { IActivityStream } from "@sockethub/schemas";
2
+ import ProcessManager from "./process-manager";
3
+ export interface JobDataDecrypted {
4
+ title?: string;
5
+ msg: IActivityStream;
6
+ sessionId: string;
7
+ }
8
+ export interface JobDataEncrypted {
9
+ title?: string;
10
+ msg: string;
11
+ sessionId: string;
12
+ }
13
+ export interface JobDecrypted {
14
+ data: JobDataDecrypted;
15
+ remove?: Function;
16
+ }
17
+ export interface JobEncrypted {
18
+ data: JobDataEncrypted;
19
+ remove?: Function;
20
+ }
21
+ declare class Sockethub {
22
+ private readonly parentId;
23
+ private readonly parentSecret1;
24
+ private readonly parentSecret2;
25
+ counter: number;
26
+ platforms: Map<string, object>;
27
+ status: boolean;
28
+ queue: any;
29
+ processManager: ProcessManager;
30
+ constructor();
31
+ /**
32
+ * initialization of Sockethub starts here
33
+ */
34
+ boot(): void;
35
+ removeAllPlatformInstances(): Promise<void>;
36
+ private createJob;
37
+ private handleIncomingConnection;
38
+ }
39
+ export default Sockethub;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const debug_1 = __importDefault(require("debug"));
7
+ const crypto_1 = __importDefault(require("./crypto"));
8
+ const init_1 = __importDefault(require("./bootstrap/init"));
9
+ const middleware_1 = __importDefault(require("./middleware"));
10
+ const create_activity_object_1 = __importDefault(require("./middleware/create-activity-object"));
11
+ const expand_activity_stream_1 = __importDefault(require("./middleware/expand-activity-stream"));
12
+ const store_credentials_1 = __importDefault(require("./middleware/store-credentials"));
13
+ const validate_1 = __importDefault(require("./middleware/validate"));
14
+ const janitor_1 = __importDefault(require("./janitor"));
15
+ const listener_1 = __importDefault(require("./listener"));
16
+ const process_manager_1 = __importDefault(require("./process-manager"));
17
+ const platform_instance_1 = require("./platform-instance");
18
+ const store_1 = require("./store");
19
+ const log = (0, debug_1.default)('sockethub:server:core');
20
+ function attachError(err, msg) {
21
+ if (typeof msg !== 'object') {
22
+ msg = { context: 'error' };
23
+ }
24
+ msg.error = err.toString();
25
+ delete msg.sessionSecret;
26
+ return msg;
27
+ }
28
+ class Sockethub {
29
+ constructor() {
30
+ this.counter = 0;
31
+ this.platforms = init_1.default.platforms;
32
+ this.status = false;
33
+ this.parentId = crypto_1.default.randToken(16);
34
+ this.parentSecret1 = crypto_1.default.randToken(16);
35
+ this.parentSecret2 = crypto_1.default.randToken(16);
36
+ this.processManager = new process_manager_1.default(this.parentId, this.parentSecret1, this.parentSecret2);
37
+ log('session id: ' + this.parentId);
38
+ }
39
+ /**
40
+ * initialization of Sockethub starts here
41
+ */
42
+ boot() {
43
+ if (this.status) {
44
+ return log('Sockethub.boot() called more than once');
45
+ }
46
+ else {
47
+ this.status = true;
48
+ }
49
+ log('active platforms: ', [...init_1.default.platforms.keys()]);
50
+ janitor_1.default.clean(); // start cleanup cycle
51
+ listener_1.default.start(); // start external services
52
+ log('registering handlers');
53
+ listener_1.default.io.on('connection', this.handleIncomingConnection.bind(this));
54
+ }
55
+ async removeAllPlatformInstances() {
56
+ for (let platform of platform_instance_1.platformInstances) {
57
+ await platform[1].destroy();
58
+ }
59
+ }
60
+ createJob(socketId, platformInstance, msg) {
61
+ const title = `${msg.context}-${(msg.id) ? msg.id : this.counter++}`;
62
+ const job = {
63
+ title: title,
64
+ sessionId: socketId,
65
+ msg: crypto_1.default.encrypt(msg, this.parentSecret1 + this.parentSecret2)
66
+ };
67
+ return job;
68
+ }
69
+ ;
70
+ handleIncomingConnection(socket) {
71
+ // session-specific debug messages
72
+ const sessionLog = (0, debug_1.default)('sockethub:server:core:' + socket.id), sessionSecret = crypto_1.default.randToken(16),
73
+ // store instance is session-specific
74
+ store = (0, store_1.getSessionStore)(this.parentId, this.parentSecret1, socket.id, sessionSecret);
75
+ sessionLog(`socket.io connection`);
76
+ socket.on('disconnect', () => {
77
+ sessionLog('disconnect received from client');
78
+ });
79
+ socket.on('credentials', (0, middleware_1.default)('credentials')
80
+ .use(expand_activity_stream_1.default)
81
+ .use((0, validate_1.default)('credentials', socket.id))
82
+ .use((0, store_credentials_1.default)(store, sessionLog))
83
+ .use((err, data, next) => {
84
+ // error handler
85
+ next(attachError(err, data));
86
+ }).use((data, next) => { next(); })
87
+ .done());
88
+ // when new activity objects are created on the client side, an event is
89
+ // fired and we receive a copy on the server side.
90
+ socket.on('activity-object', (0, middleware_1.default)('activity-object')
91
+ .use((0, validate_1.default)('activity-object', socket.id))
92
+ .use(create_activity_object_1.default)
93
+ .use((err, data, next) => {
94
+ next(attachError(err, data));
95
+ }).use((data, next) => { next(); })
96
+ .done());
97
+ socket.on('message', (0, middleware_1.default)('message')
98
+ .use(expand_activity_stream_1.default)
99
+ .use((0, validate_1.default)('message', socket.id))
100
+ .use((msg, next) => {
101
+ // The platform thread must find the credentials on their own using the given
102
+ // sessionSecret, which indicates that this specific session (socket
103
+ // connection) has provided credentials.
104
+ msg.sessionSecret = sessionSecret;
105
+ next(msg);
106
+ }).use((err, data, next) => {
107
+ next(attachError(err, data));
108
+ }).use((msg, next) => {
109
+ const platformInstance = this.processManager.get(msg.context, msg.actor.id, socket.id);
110
+ sessionLog(`queued to channel ${platformInstance.id}`);
111
+ const job = this.createJob(socket.id, platformInstance, msg);
112
+ // job validated and queued, store socket.io callback for when job is completed
113
+ platformInstance.completedJobHandlers.set(job.title, next);
114
+ platformInstance.queue.add(job);
115
+ }).done());
116
+ }
117
+ }
118
+ exports.default = Sockethub;
119
+ //# sourceMappingURL=/sockethub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sockethub.js","sourceRoot":"/","sources":["sockethub.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface ISecureStoreInstance {
2
+ save(id: string, obj: any, cb: Function): any;
3
+ get(id: string, cb: Function): any;
4
+ }
5
+ export declare function getSessionStore(parentId: string, parentSecret: string, sessionId: string, sessionSecret: string): ISecureStoreInstance;
package/dist/store.js ADDED
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getSessionStore = void 0;
7
+ const secure_store_redis_1 = __importDefault(require("secure-store-redis"));
8
+ const config_1 = __importDefault(require("./config"));
9
+ function getSessionStore(parentId, parentSecret, sessionId, sessionSecret) {
10
+ return new secure_store_redis_1.default({
11
+ namespace: 'sockethub:' + parentId + ':session:' + sessionId + ':store',
12
+ secret: parentSecret + sessionSecret,
13
+ redis: config_1.default.get('redis')
14
+ });
15
+ }
16
+ exports.getSessionStore = getSessionStore;
17
+ //# sourceMappingURL=/store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"/","sources":["store.ts"],"names":[],"mappings":";;;;;;AAAA,4EAA6C;AAE7C,sDAA8B;AAO9B,SAAgB,eAAe,CAAC,QAAgB,EAAE,YAAoB,EACtC,SAAiB,EAAE,aAAqB;IACtE,OAAO,IAAI,4BAAW,CAAC;QACrB,SAAS,EAAE,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ;QACvE,MAAM,EAAE,YAAY,GAAG,aAAa;QACpC,KAAK,EAAE,gBAAM,CAAC,GAAG,CAAC,OAAO,CAAC;KAC3B,CAAC,CAAC;AACL,CAAC;AAPD,0CAOC"}