summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAkihiko Odaki <nekomanma@pixiv.co.jp>2018-04-03 12:07:29 +0900
committerAkihiko Odaki <nekomanma@pixiv.co.jp>2018-04-03 12:07:29 +0900
commitcc3704c3e94db4eb6f7e46bec2f68d19a7b0252e (patch)
treee85af86ef853bd040be8c91c57dc6bd145d5f174 /src
parentDeliver posts to remote followers (diff)
downloadsharkey-cc3704c3e94db4eb6f7e46bec2f68d19a7b0252e.tar.gz
sharkey-cc3704c3e94db4eb6f7e46bec2f68d19a7b0252e.tar.bz2
sharkey-cc3704c3e94db4eb6f7e46bec2f68d19a7b0252e.zip
Accept remote follow
Diffstat (limited to 'src')
-rw-r--r--src/remote/activitypub/act/follow.ts47
-rw-r--r--src/remote/activitypub/renderer/accept.ts4
2 files changed, 31 insertions, 20 deletions
diff --git a/src/remote/activitypub/act/follow.ts b/src/remote/activitypub/act/follow.ts
index ec9e080dfc..d7ea15fa36 100644
--- a/src/remote/activitypub/act/follow.ts
+++ b/src/remote/activitypub/act/follow.ts
@@ -4,11 +4,13 @@ import Following from '../../../models/following';
import User from '../../../models/user';
import config from '../../../config';
import queue from '../../../queue';
+import context from '../renderer/context';
+import renderAccept from '../renderer/accept';
+import request from '../../request';
export default async (actor, activity) => {
const prefix = config.url + '/@';
const id = activity.object.id || activity.object;
- let following;
if (!id.startsWith(prefix)) {
return null;
@@ -24,28 +26,33 @@ export default async (actor, activity) => {
throw new Error();
}
- try {
- following = await Following.insert({
+ const accept = renderAccept(activity);
+ accept['@context'] = context;
+
+ await Promise.all([
+ request(followee, actor.account.inbox, accept),
+
+ Following.insert({
createdAt: new Date(),
followerId: actor._id,
followeeId: followee._id
- });
- } catch (exception) {
- // duplicate key error
- if (exception instanceof MongoError && exception.code === 11000) {
- return null;
- }
+ }).then(following => new Promise((resolve, reject) => {
+ queue.create('http', { type: 'follow', following: following._id }).save(error => {
+ if (error) {
+ reject(error);
+ } else {
+ resolve();
+ }
+ });
+ }), error => {
+ // duplicate key error
+ if (error instanceof MongoError && error.code === 11000) {
+ return;
+ }
- throw exception;
- }
+ throw error;
+ })
+ ]);
- await new Promise((resolve, reject) => {
- queue.create('http', { type: 'follow', following: following._id }).save(error => {
- if (error) {
- reject(error);
- } else {
- resolve(null);
- }
- });
- });
+ return null;
};
diff --git a/src/remote/activitypub/renderer/accept.ts b/src/remote/activitypub/renderer/accept.ts
new file mode 100644
index 0000000000..00c76883a9
--- /dev/null
+++ b/src/remote/activitypub/renderer/accept.ts
@@ -0,0 +1,4 @@
+export default object => ({
+ type: 'Accept',
+ object
+});