summaryrefslogtreecommitdiff
path: root/src/queue/processors/deliver.ts
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2019-03-07 23:07:21 +0900
committersyuilo <syuilotan@yahoo.co.jp>2019-03-07 23:07:21 +0900
commitc934987b14dc2b0c362f2d13e0664ab275aca522 (patch)
tree4a83b3a22745c9b5ad991a5f7c61d7acee0eba77 /src/queue/processors/deliver.ts
parentUpdate issue templates (diff)
downloadmisskey-c934987b14dc2b0c362f2d13e0664ab275aca522.tar.gz
misskey-c934987b14dc2b0c362f2d13e0664ab275aca522.tar.bz2
misskey-c934987b14dc2b0c362f2d13e0664ab275aca522.zip
Resolve #4444
Diffstat (limited to 'src/queue/processors/deliver.ts')
-rw-r--r--src/queue/processors/deliver.ts63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/queue/processors/deliver.ts b/src/queue/processors/deliver.ts
new file mode 100644
index 0000000000..2f730c31cd
--- /dev/null
+++ b/src/queue/processors/deliver.ts
@@ -0,0 +1,63 @@
+import * as Bull from 'bull';
+import request from '../../remote/activitypub/request';
+import { queueLogger } from '../logger';
+import { registerOrFetchInstanceDoc } from '../../services/register-or-fetch-instance-doc';
+import Instance from '../../models/instance';
+import instanceChart from '../../services/chart/instance';
+
+let latest: string = null;
+
+export default async (job: Bull.Job, done: any): Promise<void> => {
+ const { host } = new URL(job.data.to);
+
+ try {
+ if (latest !== (latest = JSON.stringify(job.data.content, null, 2)))
+ queueLogger.debug(`delivering ${latest}`);
+
+ await request(job.data.user, job.data.to, job.data.content);
+
+ // Update stats
+ registerOrFetchInstanceDoc(host).then(i => {
+ Instance.update({ _id: i._id }, {
+ $set: {
+ latestRequestSentAt: new Date(),
+ latestStatus: 200,
+ lastCommunicatedAt: new Date(),
+ isNotResponding: false
+ }
+ });
+
+ instanceChart.requestSent(i.host, true);
+ });
+
+ done();
+ } catch (res) {
+ // Update stats
+ registerOrFetchInstanceDoc(host).then(i => {
+ Instance.update({ _id: i._id }, {
+ $set: {
+ latestRequestSentAt: new Date(),
+ latestStatus: res != null && res.hasOwnProperty('statusCode') ? res.statusCode : null,
+ isNotResponding: true
+ }
+ });
+
+ instanceChart.requestSent(i.host, false);
+ });
+
+ if (res != null && res.hasOwnProperty('statusCode')) {
+ queueLogger.warn(`deliver failed: ${res.statusCode} ${res.statusMessage} to=${job.data.to}`);
+
+ if (res.statusCode >= 400 && res.statusCode < 500) {
+ // HTTPステータスコード4xxはクライアントエラーであり、それはつまり
+ // 何回再送しても成功することはないということなのでエラーにはしないでおく
+ done();
+ } else {
+ done(res.statusMessage);
+ }
+ } else {
+ queueLogger.warn(`deliver failed: ${res} to=${job.data.to}`);
+ done();
+ }
+ }
+};