@sockethub/server 5.0.0-alpha.3 → 5.0.0-alpha.6
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.
- package/README.md +54 -60
- package/bin/sockethub +4 -3
- package/package.json +42 -60
- package/res/socket.io.js +4908 -0
- package/res/sockethub-client.js +602 -0
- package/res/sockethub-client.min.js +19 -0
- package/sockethub.config.example.json +2 -3
- package/src/bootstrap/init.d.ts +20 -7
- package/src/bootstrap/init.test.ts +211 -0
- package/src/bootstrap/init.ts +152 -75
- package/src/bootstrap/load-platforms.ts +151 -0
- package/src/config.test.ts +27 -22
- package/src/config.ts +82 -78
- package/src/defaults.json +24 -16
- package/src/index.ts +67 -27
- package/src/janitor.test.ts +211 -0
- package/src/janitor.ts +145 -77
- package/src/listener.ts +151 -57
- package/src/middleware/create-activity-object.test.ts +28 -8
- package/src/middleware/create-activity-object.ts +17 -8
- package/src/middleware/expand-activity-stream.test.data.ts +332 -346
- package/src/middleware/expand-activity-stream.test.ts +65 -66
- package/src/middleware/expand-activity-stream.ts +29 -19
- package/src/middleware/store-credentials.test.ts +74 -62
- package/src/middleware/store-credentials.ts +15 -15
- package/src/middleware/validate.test.data.ts +240 -242
- package/src/middleware/validate.test.ts +39 -78
- package/src/middleware/validate.ts +63 -39
- package/src/middleware.test.ts +168 -138
- package/src/middleware.ts +62 -43
- package/src/platform-instance.test.ts +507 -213
- package/src/platform-instance.ts +337 -219
- package/src/platform.test.ts +375 -0
- package/src/platform.ts +306 -139
- package/src/process-manager.ts +75 -51
- package/src/routes.test.ts +43 -89
- package/src/routes.ts +40 -77
- package/src/sentry.test.ts +106 -0
- package/src/sentry.ts +19 -0
- package/src/sockethub.ts +186 -153
- package/src/util.ts +5 -0
- package/coverage/tmp/coverage-93126-1649152190997-0.json +0 -1
- package/dist/bootstrap/init.d.ts +0 -18
- package/dist/bootstrap/init.js +0 -63
- package/dist/bootstrap/init.js.map +0 -1
- package/dist/bootstrap/platforms.js +0 -75
- package/dist/common.d.ts +0 -3
- package/dist/common.js +0 -20
- package/dist/common.js.map +0 -1
- package/dist/config.d.ts +0 -6
- package/dist/config.js +0 -102
- package/dist/config.js.map +0 -1
- package/dist/crypto.d.ts +0 -10
- package/dist/crypto.js +0 -38
- package/dist/crypto.js.map +0 -1
- package/dist/defaults.json +0 -28
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -25
- package/dist/index.js.map +0 -1
- package/dist/janitor.d.ts +0 -15
- package/dist/janitor.js +0 -89
- package/dist/janitor.js.map +0 -1
- package/dist/listener.d.ts +0 -28
- package/dist/listener.js +0 -91
- package/dist/listener.js.map +0 -1
- package/dist/middleware/create-activity-object.d.ts +0 -6
- package/dist/middleware/create-activity-object.js +0 -19
- package/dist/middleware/create-activity-object.js.map +0 -1
- package/dist/middleware/expand-activity-stream.d.ts +0 -2
- package/dist/middleware/expand-activity-stream.js +0 -33
- package/dist/middleware/expand-activity-stream.js.map +0 -1
- package/dist/middleware/expand-activity-stream.test.data.d.ts +0 -480
- package/dist/middleware/expand-activity-stream.test.data.js +0 -360
- package/dist/middleware/expand-activity-stream.test.data.js.map +0 -1
- package/dist/middleware/store-credentials.d.ts +0 -3
- package/dist/middleware/store-credentials.js +0 -19
- package/dist/middleware/store-credentials.js.map +0 -1
- package/dist/middleware/validate.d.ts +0 -2
- package/dist/middleware/validate.js +0 -58
- package/dist/middleware/validate.js.map +0 -1
- package/dist/middleware/validate.test.data.d.ts +0 -532
- package/dist/middleware/validate.test.data.js +0 -263
- package/dist/middleware/validate.test.data.js.map +0 -1
- package/dist/middleware.d.ts +0 -10
- package/dist/middleware.js +0 -54
- package/dist/middleware.js.map +0 -1
- package/dist/platform-instance.d.ts +0 -77
- package/dist/platform-instance.js +0 -211
- package/dist/platform-instance.js.map +0 -1
- package/dist/platform.d.ts +0 -6
- package/dist/platform.js +0 -187
- package/dist/platform.js.map +0 -1
- package/dist/process-manager.d.ts +0 -11
- package/dist/process-manager.js +0 -78
- package/dist/process-manager.js.map +0 -1
- package/dist/routes.d.ts +0 -13
- package/dist/routes.js +0 -83
- package/dist/routes.js.map +0 -1
- package/dist/sockethub.d.ts +0 -39
- package/dist/sockethub.js +0 -119
- package/dist/sockethub.js.map +0 -1
- package/dist/store.d.ts +0 -5
- package/dist/store.js +0 -17
- package/dist/store.js.map +0 -1
- package/src/bootstrap/platforms.js +0 -75
- package/src/common.test.ts +0 -54
- package/src/common.ts +0 -14
- package/src/config.d.ts +0 -2
- package/src/crypto.d.ts +0 -5
- package/src/crypto.test.ts +0 -41
- package/src/crypto.ts +0 -41
- package/src/janitor.d.ts +0 -8
- package/src/middleware/validate.d.ts +0 -1
- package/src/middleware.d.ts +0 -21
- package/src/sockethub.d.ts +0 -1
- package/src/store.test.ts +0 -28
- package/src/store.ts +0 -17
- package/test/init-suite.js +0 -41
- package/test/queue.functional.test.js +0 -0
- package/test/sockethub-suite.js +0 -25
- package/tsconfig.json +0 -18
- package/views/examples/dummy.ejs +0 -93
- package/views/examples/feeds.ejs +0 -90
- package/views/examples/irc.ejs +0 -239
- package/views/examples/shared.js +0 -72
- package/views/examples/xmpp.ejs +0 -191
- package/views/index.ejs +0 -17
|
@@ -1,49 +1,73 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* responsible for handling the validation and expansion (when applicable) of all incoming objects
|
|
3
3
|
*/
|
|
4
|
-
import debug from
|
|
5
|
-
import schemas from '@sockethub/schemas';
|
|
6
|
-
import { IActivityStream } from "@sockethub/schemas";
|
|
4
|
+
import debug from "debug";
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
import {
|
|
7
|
+
type ActivityStream,
|
|
8
|
+
type MiddlewareCallback,
|
|
9
|
+
validateActivityObject,
|
|
10
|
+
validateActivityStream,
|
|
11
|
+
validateCredentials,
|
|
12
|
+
} from "@sockethub/schemas";
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
Object.keys(platform.schemas).forEach((key) => {
|
|
13
|
-
if (! platform.schemas[key]) { return; }
|
|
14
|
-
schemas.addPlatformSchema(platform.schemas[key], `${platform.id}/${key}`);
|
|
15
|
-
});
|
|
16
|
-
});
|
|
14
|
+
import getInitObject, { type IInitObject } from "../bootstrap/init.js";
|
|
17
15
|
|
|
18
16
|
// called when registered with the middleware function, define the type of validation
|
|
19
17
|
// that will be called when the middleware eventually does.
|
|
20
|
-
export default function validate(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
18
|
+
export default function validate(
|
|
19
|
+
type: string,
|
|
20
|
+
sockethubId: string,
|
|
21
|
+
passedInitObj?: IInitObject,
|
|
22
|
+
) {
|
|
23
|
+
let initObj = passedInitObj;
|
|
24
|
+
if (!passedInitObj) {
|
|
25
|
+
getInitObject().then((init) => {
|
|
26
|
+
initObj = init;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const sessionLog = debug(`sockethub:server:validate:${sockethubId}`);
|
|
31
|
+
return (msg: ActivityStream, done: MiddlewareCallback) => {
|
|
32
|
+
sessionLog(`applying schema validation for ${type}`);
|
|
33
|
+
if (type === "activity-object") {
|
|
34
|
+
const err = validateActivityObject(msg);
|
|
35
|
+
if (err) {
|
|
36
|
+
done(new Error(err));
|
|
37
|
+
} else {
|
|
38
|
+
done(msg);
|
|
39
|
+
}
|
|
40
|
+
} else if (!initObj.platforms.has(msg.context)) {
|
|
41
|
+
return done(
|
|
42
|
+
new Error(
|
|
43
|
+
`platform context ${msg.context} not registered with this Sockethub instance.`,
|
|
44
|
+
),
|
|
45
|
+
);
|
|
46
|
+
} else if (type === "credentials") {
|
|
47
|
+
const err = validateCredentials(msg);
|
|
48
|
+
if (err) {
|
|
49
|
+
done(new Error(err));
|
|
50
|
+
} else {
|
|
51
|
+
done(msg);
|
|
52
|
+
}
|
|
43
53
|
} else {
|
|
44
|
-
|
|
54
|
+
const err = validateActivityStream(msg);
|
|
55
|
+
if (err) {
|
|
56
|
+
done(new Error(err));
|
|
57
|
+
} else {
|
|
58
|
+
const platformMeta = initObj.platforms.get(msg.context);
|
|
59
|
+
if (!platformMeta.types.includes(msg.type)) {
|
|
60
|
+
return done(
|
|
61
|
+
new Error(
|
|
62
|
+
`platform type ${msg.type} not supported by ${msg.context} ` +
|
|
63
|
+
`platform. (types: ${platformMeta.types.join(
|
|
64
|
+
", ",
|
|
65
|
+
)})`,
|
|
66
|
+
),
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
done(msg);
|
|
70
|
+
}
|
|
45
71
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
};
|
|
49
|
-
};
|
|
72
|
+
};
|
|
73
|
+
}
|
package/src/middleware.test.ts
CHANGED
|
@@ -1,154 +1,184 @@
|
|
|
1
|
-
import { expect } from
|
|
2
|
-
import * as sinon from
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
2
|
+
import * as sinon from "sinon";
|
|
3
3
|
|
|
4
|
-
import middleware, { MiddlewareChain } from "./middleware";
|
|
4
|
+
import middleware, { MiddlewareChain } from "./middleware.js";
|
|
5
5
|
|
|
6
6
|
describe("Middleware", () => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
it('returns a MiddlewareChain instance', () => {
|
|
12
|
-
const mw = middleware('testa');
|
|
13
|
-
expect(mw).to.be.instanceof(MiddlewareChain);
|
|
14
|
-
const mwc = new MiddlewareChain('testa');
|
|
15
|
-
expect(mw.name).to.be.eql(mwc.name);
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
it("only accepts functions", () => {
|
|
19
|
-
const mw = middleware('test');
|
|
20
|
-
// @ts-ignore
|
|
21
|
-
expect(()=>{mw.use('foobar');}).to.throw(
|
|
22
|
-
'middleware use() can only take a function as an argument');
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it("only accepts functions that expect 2 or 3 params", () => {
|
|
26
|
-
const mw = middleware('test');
|
|
27
|
-
// @ts-ignore
|
|
28
|
-
expect(()=>{mw.use((one, two, three, four) => {});}).to.throw(
|
|
29
|
-
'middleware function provided with incorrect number of params: 4');
|
|
30
|
-
});
|
|
7
|
+
it("middleware() is a function", () => {
|
|
8
|
+
expect(typeof middleware).toEqual("function");
|
|
9
|
+
});
|
|
31
10
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
// @ts-ignore
|
|
38
|
-
const entry = mw.use(func);
|
|
39
|
-
}
|
|
40
|
-
mw.done()('some data', (data: any) => {
|
|
41
|
-
expect(data).to.eql('some data');
|
|
42
|
-
// @ts-ignore
|
|
43
|
-
funcs.unshift(callback);
|
|
44
|
-
for (let i = 1; i < funcs.length; i++) {
|
|
45
|
-
expect(funcs[i].calledOnce).to.be.true;
|
|
46
|
-
expect(funcs[i].calledWith('foobar', funcs[i - 1]));
|
|
47
|
-
}
|
|
48
|
-
done();
|
|
11
|
+
it("returns a MiddlewareChain instance", () => {
|
|
12
|
+
const mw = middleware("testa");
|
|
13
|
+
expect(mw).toBeInstanceOf(MiddlewareChain);
|
|
14
|
+
const mwc = new MiddlewareChain("testa");
|
|
15
|
+
expect(mw.name).toEqual(mwc.name);
|
|
49
16
|
});
|
|
50
|
-
});
|
|
51
17
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
mw.use(func);
|
|
60
|
-
}
|
|
61
|
-
mw.use((err: any, data: any, next: Function) => {
|
|
62
|
-
expect(err.toString()).to.equal('Error: some error');
|
|
63
|
-
errorHandlerCalled = true;
|
|
64
|
-
next(err);
|
|
18
|
+
it("only accepts functions", () => {
|
|
19
|
+
const mw = middleware("test");
|
|
20
|
+
expect(() => {
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
22
|
+
// @ts-ignore
|
|
23
|
+
mw.use("foobar343");
|
|
24
|
+
}).toThrow("middleware use() can only take a function as an argument");
|
|
65
25
|
});
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
26
|
+
|
|
27
|
+
it("only accepts functions that expect 2 or 3 params", () => {
|
|
28
|
+
const mw = middleware("test");
|
|
29
|
+
expect(() => {
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
33
|
+
mw.use((one, two, three, four) => {});
|
|
34
|
+
}).toThrow(
|
|
35
|
+
"middleware function provided with incorrect number of params: 4",
|
|
36
|
+
);
|
|
69
37
|
});
|
|
70
|
-
});
|
|
71
38
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
39
|
+
it("calls each member of call list", (done) => {
|
|
40
|
+
const callback = (data: any, cb: (v: any) => void) => {
|
|
41
|
+
cb(data);
|
|
42
|
+
};
|
|
43
|
+
const funcs = [
|
|
44
|
+
sinon.spy(callback),
|
|
45
|
+
sinon.spy(callback),
|
|
46
|
+
sinon.spy(callback),
|
|
47
|
+
];
|
|
48
|
+
const mw = middleware("test");
|
|
49
|
+
for (const func of funcs) {
|
|
50
|
+
mw.use(func);
|
|
51
|
+
}
|
|
52
|
+
mw.done()("some data", (data: any) => {
|
|
53
|
+
expect(data).toEqual("some data");
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
55
|
+
// @ts-ignore
|
|
56
|
+
funcs.unshift(callback);
|
|
57
|
+
for (let i = 1; i < funcs.length; i++) {
|
|
58
|
+
expect(funcs[i].calledOnce).toBeTrue();
|
|
59
|
+
expect(funcs[i].calledWith("foobar981", funcs[i - 1]));
|
|
60
|
+
}
|
|
61
|
+
done();
|
|
62
|
+
});
|
|
87
63
|
});
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
64
|
+
|
|
65
|
+
it("does not throw exception on error with no callback provided", (done) => {
|
|
66
|
+
let errorHandlerCalled = false;
|
|
67
|
+
const callbackError = (data: any, cb: (arg0: Error) => void) => {
|
|
68
|
+
cb(new Error("some error"));
|
|
69
|
+
};
|
|
70
|
+
const funcs = [sinon.spy(callbackError)];
|
|
71
|
+
const mw = middleware("test");
|
|
72
|
+
for (const func of funcs) {
|
|
73
|
+
mw.use(func);
|
|
74
|
+
}
|
|
75
|
+
mw.use((err: any, data: any, next: (v: string) => void) => {
|
|
76
|
+
expect(err.toString()).toEqual("Error: some error");
|
|
77
|
+
errorHandlerCalled = true;
|
|
78
|
+
next(err);
|
|
79
|
+
});
|
|
80
|
+
mw.done()("foobar0121", () => {
|
|
81
|
+
expect(errorHandlerCalled).toBeTrue();
|
|
82
|
+
done();
|
|
83
|
+
});
|
|
98
84
|
});
|
|
99
|
-
});
|
|
100
85
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
86
|
+
it("aborts call stack on error - calls error handler, and callback", (done) => {
|
|
87
|
+
let errorHandlerCalled = false;
|
|
88
|
+
const callback = (data: any, cb: (v: any) => void) => {
|
|
89
|
+
cb(data);
|
|
90
|
+
};
|
|
91
|
+
const callbackError = (data: any, cb: (arg0: Error) => void) => {
|
|
92
|
+
cb(new Error("some error"));
|
|
93
|
+
};
|
|
94
|
+
const funcs = [
|
|
95
|
+
sinon.spy(callback),
|
|
96
|
+
sinon.spy(callbackError),
|
|
97
|
+
sinon.spy(callback),
|
|
98
|
+
];
|
|
99
|
+
const mw = middleware("test");
|
|
100
|
+
for (const func of funcs) {
|
|
101
|
+
mw.use(func);
|
|
102
|
+
}
|
|
103
|
+
mw.use((err: any, data: any, next: (v: any) => void) => {
|
|
104
|
+
expect(err.toString()).toEqual("Error: some error");
|
|
105
|
+
errorHandlerCalled = true;
|
|
106
|
+
next(err);
|
|
107
|
+
});
|
|
108
|
+
mw.done()("foobar637", (data: any) => {
|
|
109
|
+
// FIXME -- We need to also handle socket.io callbacks!
|
|
110
|
+
expect(data instanceof Error).toBeTrue();
|
|
111
|
+
expect(funcs[0].calledOnce).toBeTrue();
|
|
112
|
+
expect(funcs[0].calledWith("foobar637", callback));
|
|
113
|
+
expect(funcs[1].calledOnce).toBeTrue();
|
|
114
|
+
expect(funcs[1].calledWith("foobar637", funcs[0]));
|
|
115
|
+
expect(funcs[2].calledOnce).toBeFalse();
|
|
116
|
+
expect(errorHandlerCalled).toBeTrue();
|
|
117
|
+
done();
|
|
118
|
+
});
|
|
124
119
|
});
|
|
125
|
-
mw.done()('foobar', () => {});
|
|
126
|
-
});
|
|
127
120
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
121
|
+
it("error handler receives error and no callback provided", (done) => {
|
|
122
|
+
let errorHandlerCalled = false;
|
|
123
|
+
const callback = (data: any, cb: (v: any) => void) => {
|
|
124
|
+
cb(data);
|
|
125
|
+
};
|
|
126
|
+
const callbackError = (data: any, cb: (arg0: Error) => void) => {
|
|
127
|
+
cb(new Error("some error"));
|
|
128
|
+
};
|
|
129
|
+
const funcs = [
|
|
130
|
+
sinon.spy(callback),
|
|
131
|
+
sinon.spy(callback),
|
|
132
|
+
sinon.spy(callbackError),
|
|
133
|
+
];
|
|
134
|
+
const mw = middleware("test");
|
|
135
|
+
for (const func of funcs) {
|
|
136
|
+
mw.use(func);
|
|
137
|
+
}
|
|
138
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
139
|
+
mw.use((err: any, data: any, next: (v: any) => void) => {
|
|
140
|
+
expect(err instanceof Error).toBeTrue();
|
|
141
|
+
expect(err.toString()).toEqual("Error: some error");
|
|
142
|
+
errorHandlerCalled = true;
|
|
143
|
+
expect(funcs[0].calledOnce).toBeTrue();
|
|
144
|
+
expect(funcs[0].calledWith("foobar98", callback));
|
|
145
|
+
expect(funcs[1].calledOnce).toBeTrue();
|
|
146
|
+
expect(funcs[1].calledWith("foobar98", funcs[0]));
|
|
147
|
+
expect(funcs[2].calledOnce).toBeTrue();
|
|
148
|
+
expect(funcs[2].calledWith("foobar98", funcs[1]));
|
|
149
|
+
expect(errorHandlerCalled).toBeTrue();
|
|
150
|
+
setTimeout(done, 0);
|
|
151
|
+
});
|
|
152
|
+
mw.done()("foobar98", () => {});
|
|
142
153
|
});
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
154
|
+
|
|
155
|
+
it("calls each member of chain (50)", (done) => {
|
|
156
|
+
let errorHandlerCalled = false;
|
|
157
|
+
const callback = (data: any, cb: (v: any) => void) => {
|
|
158
|
+
cb(data);
|
|
159
|
+
};
|
|
160
|
+
const funcs: Array<any> = [];
|
|
161
|
+
for (let i = 0; i <= 50; i++) {
|
|
162
|
+
funcs.push(sinon.spy(callback));
|
|
163
|
+
}
|
|
164
|
+
const mw = middleware("test");
|
|
165
|
+
for (const func of funcs) {
|
|
166
|
+
mw.use(func);
|
|
167
|
+
}
|
|
168
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
169
|
+
mw.use((err: any, data: any, next: (v: any) => void) => {
|
|
170
|
+
expect(err.toString()).toEqual("Error: some error");
|
|
171
|
+
errorHandlerCalled = true;
|
|
172
|
+
});
|
|
173
|
+
mw.done()("some data", (data: any) => {
|
|
174
|
+
expect(data).toEqual("some data");
|
|
175
|
+
funcs.unshift(callback);
|
|
176
|
+
for (let i = 1; i < funcs.length; i++) {
|
|
177
|
+
expect(funcs[i].calledOnce).toBeTrue();
|
|
178
|
+
expect(funcs[i].calledWith("foo", funcs[i - 1]));
|
|
179
|
+
}
|
|
180
|
+
expect(errorHandlerCalled).toBeFalse();
|
|
181
|
+
done();
|
|
182
|
+
});
|
|
152
183
|
});
|
|
153
|
-
|
|
154
|
-
});
|
|
184
|
+
});
|
package/src/middleware.ts
CHANGED
|
@@ -1,52 +1,71 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ActivityObject, ActivityStream } from "@sockethub/schemas";
|
|
2
|
+
import debug, { type Debugger } from "debug";
|
|
2
3
|
|
|
3
4
|
export default function middleware(name: string): MiddlewareChain {
|
|
4
|
-
|
|
5
|
+
return new MiddlewareChain(name);
|
|
5
6
|
}
|
|
6
7
|
|
|
8
|
+
export type MiddlewareChainInterface = (
|
|
9
|
+
error: ActivityStream | ActivityObject | Error,
|
|
10
|
+
data?: ActivityStream | ActivityObject | MiddlewareChainInterface,
|
|
11
|
+
next?: MiddlewareChainInterface,
|
|
12
|
+
) => void;
|
|
13
|
+
|
|
14
|
+
type ErrorHandlerInterface = (err: Error, data?: unknown, cb?: unknown) => void;
|
|
15
|
+
|
|
16
|
+
export type LogErrorInterface = (msg: Error) => void;
|
|
17
|
+
|
|
7
18
|
export class MiddlewareChain {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
use(func: Function): this {
|
|
19
|
-
if (typeof func !== 'function') {
|
|
20
|
-
throw new Error('middleware use() can only take a function as an argument');
|
|
21
|
-
}
|
|
22
|
-
if (func.length === 3) {
|
|
23
|
-
this.errHandler = func;
|
|
24
|
-
} else if (func.length === 2) {
|
|
25
|
-
this.chain.push(func);
|
|
26
|
-
} else {
|
|
27
|
-
throw new Error(
|
|
28
|
-
'middleware function provided with incorrect number of params: ' + func.length);
|
|
19
|
+
public name: string;
|
|
20
|
+
private chain: Array<MiddlewareChainInterface> = [];
|
|
21
|
+
private errHandler: ErrorHandlerInterface = (err: Error) => {
|
|
22
|
+
throw err;
|
|
23
|
+
};
|
|
24
|
+
private readonly logger: Debugger;
|
|
25
|
+
|
|
26
|
+
constructor(name: string) {
|
|
27
|
+
this.name = name;
|
|
28
|
+
this.logger = debug(`sockethub:middleware:${name}`);
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
this.logger(_data);
|
|
42
|
-
this.errHandler(_data, data, callback);
|
|
43
|
-
} else if (typeof this.chain[position] === 'function') {
|
|
44
|
-
this.chain[position++](_data, next);
|
|
30
|
+
|
|
31
|
+
use(func: ErrorHandlerInterface | MiddlewareChainInterface): this {
|
|
32
|
+
if (typeof func !== "function") {
|
|
33
|
+
throw new Error(
|
|
34
|
+
"middleware use() can only take a function as an argument",
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
if (func.length === 3) {
|
|
38
|
+
this.errHandler = func as ErrorHandlerInterface;
|
|
39
|
+
} else if (func.length === 2) {
|
|
40
|
+
this.chain.push(func as MiddlewareChainInterface);
|
|
45
41
|
} else {
|
|
46
|
-
|
|
42
|
+
throw new Error(
|
|
43
|
+
`middleware function provided with incorrect number of params: ${func.length}`,
|
|
44
|
+
);
|
|
47
45
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
done() {
|
|
50
|
+
return (data: unknown, callbackFunc: MiddlewareChainInterface) => {
|
|
51
|
+
let cb = callbackFunc;
|
|
52
|
+
let position = 0;
|
|
53
|
+
if (typeof callbackFunc !== "function") {
|
|
54
|
+
cb = () => {
|
|
55
|
+
// ensure we have a callback function
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const next = (_data: unknown) => {
|
|
59
|
+
if (_data instanceof Error) {
|
|
60
|
+
this.logger(_data.toString());
|
|
61
|
+
this.errHandler(_data, data, cb);
|
|
62
|
+
} else if (typeof this.chain[position] === "function") {
|
|
63
|
+
this.chain[position++](_data as ActivityStream, next);
|
|
64
|
+
} else {
|
|
65
|
+
cb(_data as ActivityStream);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
next(data);
|
|
69
|
+
};
|
|
70
|
+
}
|
|
52
71
|
}
|