diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2018-04-03 02:12:13 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-04-03 02:12:13 +0900 |
| commit | b851402db1a33387de5d37be2e44bfa23680e56e (patch) | |
| tree | 2cb76aee965c1bd3abc7f1a773e0af3f025e5aa1 /src/processor/http | |
| parent | Use index (diff) | |
| parent | Deliver posts to remote followers (diff) | |
| download | misskey-b851402db1a33387de5d37be2e44bfa23680e56e.tar.gz misskey-b851402db1a33387de5d37be2e44bfa23680e56e.tar.bz2 misskey-b851402db1a33387de5d37be2e44bfa23680e56e.zip | |
Merge pull request #1376 from akihikodaki/misc
Misc
Diffstat (limited to 'src/processor/http')
| -rw-r--r-- | src/processor/http/deliver-post.ts | 94 | ||||
| -rw-r--r-- | src/processor/http/follow.ts | 50 | ||||
| -rw-r--r-- | src/processor/http/index.ts | 2 | ||||
| -rw-r--r-- | src/processor/http/perform-activitypub.ts | 5 | ||||
| -rw-r--r-- | src/processor/http/process-inbox.ts | 4 | ||||
| -rw-r--r-- | src/processor/http/report-github-failure.ts | 31 |
6 files changed, 119 insertions, 67 deletions
diff --git a/src/processor/http/deliver-post.ts b/src/processor/http/deliver-post.ts new file mode 100644 index 0000000000..83ac8281f4 --- /dev/null +++ b/src/processor/http/deliver-post.ts @@ -0,0 +1,94 @@ +import Channel from '../../models/channel'; +import Following from '../../models/following'; +import ChannelWatching from '../../models/channel-watching'; +import Post, { pack } from '../../models/post'; +import User, { isLocalUser } from '../../models/user'; +import stream, { publishChannelStream } from '../../publishers/stream'; +import context from '../../remote/activitypub/renderer/context'; +import renderNote from '../../remote/activitypub/renderer/note'; +import request from '../../remote/request'; + +export default ({ data }) => Post.findOne({ _id: data.id }).then(post => { + const promisedPostObj = pack(post); + const promises = []; + + // タイムラインへの投稿 + if (!post.channelId) { + promises.push( + // Publish event to myself's stream + promisedPostObj.then(postObj => { + stream(post.userId, 'post', postObj); + }), + + Promise.all([ + User.findOne({ _id: post.userId }), + + // Fetch all followers + Following.aggregate([ + { + $lookup: { + from: 'users', + localField: 'followerId', + foreignField: '_id', + as: 'follower' + } + }, + { + $match: { + followeeId: post.userId + } + } + ], { + _id: false + }) + ]).then(([user, followers]) => Promise.all(followers.map(following => { + if (isLocalUser(following.follower)) { + // Publish event to followers stream + return promisedPostObj.then(postObj => { + stream(following.followerId, 'post', postObj); + }); + } + + return renderNote(user, post).then(rendered => { + rendered['@context'] = context; + return request(user, following.follower[0].account.inbox, rendered); + }); + }))) + ); + } + + // チャンネルへの投稿 + if (post.channelId) { + promises.push( + // Increment channel index(posts count) + Channel.update({ _id: post.channelId }, { + $inc: { + index: 1 + } + }), + + // Publish event to channel + promisedPostObj.then(postObj => { + publishChannelStream(post.channelId, 'post', postObj); + }), + + Promise.all([ + promisedPostObj, + + // Get channel watchers + ChannelWatching.find({ + channelId: post.channelId, + // 削除されたドキュメントは除く + deletedAt: { $exists: false } + }) + ]).then(([postObj, watches]) => { + // チャンネルの視聴者(のタイムライン)に配信 + watches.forEach(w => { + stream(w.userId, 'post', postObj); + }); + }) + ); + } + + return Promise.all(promises); +}); diff --git a/src/processor/http/follow.ts b/src/processor/http/follow.ts index cbb7838c68..8bf890efbc 100644 --- a/src/processor/http/follow.ts +++ b/src/processor/http/follow.ts @@ -1,6 +1,3 @@ -import { request } from 'https'; -import { sign } from 'http-signature'; -import { URL } from 'url'; import User, { isLocalUser, pack as packUser } from '../../models/user'; import Following from '../../models/following'; import FollowingLog from '../../models/following-log'; @@ -9,9 +6,9 @@ import event from '../../publishers/stream'; import notify from '../../publishers/notify'; import context from '../../remote/activitypub/renderer/context'; import render from '../../remote/activitypub/renderer/follow'; -import config from '../../config'; +import request from '../../remote/request'; -export default ({ data }, done) => Following.findOne({ _id: data.following }).then(({ followerId, followeeId }) => { +export default ({ data }) => Following.findOne({ _id: data.following }).then(({ followerId, followeeId }) => { const promisedFollower = User.findOne({ _id: followerId }); const promisedFollowee = User.findOne({ _id: followeeId }); @@ -60,48 +57,13 @@ export default ({ data }, done) => Following.findOne({ _id: data.following }).th followeeEvent = packUser(follower, followee) .then(packed => event(followee._id, 'followed', packed)); } else if (isLocalUser(follower)) { - followeeEvent = new Promise((resolve, reject) => { - const { - protocol, - hostname, - port, - pathname, - search - } = new URL(followee.account.inbox); + const rendered = render(follower, followee); + rendered['@context'] = context; - const req = request({ - protocol, - hostname, - port, - method: 'POST', - path: pathname + search, - }, res => { - res.on('close', () => { - if (res.statusCode >= 200 && res.statusCode < 300) { - resolve(); - } else { - reject(res); - } - }); - - res.on('data', () => {}); - res.on('error', reject); - }); - - sign(req, { - authorizationHeaderName: 'Signature', - key: follower.account.keypair, - keyId: `acct:${follower.username}@${config.host}` - }); - - const rendered = render(follower, followee); - rendered['@context'] = context; - - req.end(JSON.stringify(rendered)); - }); + followeeEvent = request(follower, followee.account.inbox, rendered); } return Promise.all([followerEvent, followeeEvent]); }) ]); -}).then(done, done); +}); diff --git a/src/processor/http/index.ts b/src/processor/http/index.ts index b3161cb992..0301b472ce 100644 --- a/src/processor/http/index.ts +++ b/src/processor/http/index.ts @@ -1,9 +1,11 @@ +import deliverPost from './deliver-post'; import follow from './follow'; import performActivityPub from './perform-activitypub'; import processInbox from './process-inbox'; import reportGitHubFailure from './report-github-failure'; const handlers = { + deliverPost, follow, performActivityPub, processInbox, diff --git a/src/processor/http/perform-activitypub.ts b/src/processor/http/perform-activitypub.ts index 420ed9ec75..adf4e65a72 100644 --- a/src/processor/http/perform-activitypub.ts +++ b/src/processor/http/perform-activitypub.ts @@ -1,6 +1,5 @@ import User from '../../models/user'; import act from '../../remote/activitypub/act'; -export default ({ data }, done) => User.findOne({ _id: data.actor }) - .then(actor => act(actor, data.outbox, false)) - .then(() => done(), done); +export default ({ data }) => User.findOne({ _id: data.actor }) + .then(actor => act(actor, data.outbox, false)); diff --git a/src/processor/http/process-inbox.ts b/src/processor/http/process-inbox.ts index 78c20f8a7e..11801409cc 100644 --- a/src/processor/http/process-inbox.ts +++ b/src/processor/http/process-inbox.ts @@ -4,7 +4,7 @@ import User, { IRemoteUser } from '../../models/user'; import act from '../../remote/activitypub/act'; import resolvePerson from '../../remote/activitypub/resolve-person'; -export default ({ data }, done) => (async () => { +export default async ({ data }) => { const keyIdLower = data.signature.keyId.toLowerCase(); let user; @@ -35,4 +35,4 @@ export default ({ data }, done) => (async () => { } await act(user, data.inbox, true); -})().then(done, done); +}; diff --git a/src/processor/http/report-github-failure.ts b/src/processor/http/report-github-failure.ts index 53924a0fbd..4f6f5ccee5 100644 --- a/src/processor/http/report-github-failure.ts +++ b/src/processor/http/report-github-failure.ts @@ -1,29 +1,24 @@ -import * as request from 'request'; +import * as request from 'request-promise-native'; import User from '../../models/user'; const createPost = require('../../server/api/endpoints/posts/create'); -export default ({ data }, done) => { +export default async ({ data }) => { const asyncBot = User.findOne({ _id: data.userId }); // Fetch parent status - request({ + const parentStatuses = await request({ url: `${data.parentUrl}/statuses`, headers: { 'User-Agent': 'misskey' - } - }, async (err, res, body) => { - if (err) { - console.error(err); - return; - } - const parentStatuses = JSON.parse(body); - const parentState = parentStatuses[0].state; - const stillFailed = parentState == 'failure' || parentState == 'error'; - const text = stillFailed ? - `**⚠️BUILD STILL FAILED⚠️**: ?[${data.message}](${data.htmlUrl})` : - `**🚨BUILD FAILED🚨**: →→→?[${data.message}](${data.htmlUrl})←←←`; - - createPost({ text }, await asyncBot); - done(); + }, + json: true }); + + const parentState = parentStatuses[0].state; + const stillFailed = parentState == 'failure' || parentState == 'error'; + const text = stillFailed ? + `**⚠️BUILD STILL FAILED⚠️**: ?[${data.message}](${data.htmlUrl})` : + `**🚨BUILD FAILED🚨**: →→→?[${data.message}](${data.htmlUrl})←←←`; + + createPost({ text }, await asyncBot); }; |