summaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2017-11-21 03:40:09 +0900
committersyuilo <syuilotan@yahoo.co.jp>2017-11-21 03:40:09 +0900
commit1436617aab030fa5b3760a3eeae37a1cdeeba2df (patch)
tree5ac701a811de8be79e8e83643752818ee4b2cd1d /src/api
parentv3165 (diff)
downloadsharkey-1436617aab030fa5b3760a3eeae37a1cdeeba2df.tar.gz
sharkey-1436617aab030fa5b3760a3eeae37a1cdeeba2df.tar.bz2
sharkey-1436617aab030fa5b3760a3eeae37a1cdeeba2df.zip
wip
Diffstat (limited to 'src/api')
-rw-r--r--src/api/common/push-sw.ts44
-rw-r--r--src/api/endpoints.ts5
-rw-r--r--src/api/endpoints/posts/create.ts7
-rw-r--r--src/api/endpoints/sw/register.ts50
-rw-r--r--src/api/event.ts7
-rw-r--r--src/api/models/sw-subscription.ts3
6 files changed, 113 insertions, 3 deletions
diff --git a/src/api/common/push-sw.ts b/src/api/common/push-sw.ts
new file mode 100644
index 0000000000..927dc50635
--- /dev/null
+++ b/src/api/common/push-sw.ts
@@ -0,0 +1,44 @@
+const push = require('web-push');
+import * as mongo from 'mongodb';
+import Subscription from '../models/sw-subscription';
+import config from '../../conf';
+
+push.setGCMAPIKey(config.sw.gcm_api_key);
+
+export default async function(userId: mongo.ObjectID | string, type, body?) {
+ if (typeof userId === 'string') {
+ userId = new mongo.ObjectID(userId);
+ }
+
+ // Fetch
+ const subscriptions = await Subscription.find({
+ user_id: userId
+ });
+
+ subscriptions.forEach(subscription => {
+ const pushSubscription = {
+ endpoint: subscription.endpoint,
+ keys: {
+ auth: subscription.auth,
+ p256dh: subscription.publickey
+ }
+ };
+
+ push.sendNotification(pushSubscription, JSON.stringify({
+ type, body
+ })).catch(err => {
+ //console.log(err.statusCode);
+ //console.log(err.headers);
+ //console.log(err.body);
+
+ if (err.statusCode == 410) {
+ Subscription.remove({
+ user_id: userId,
+ endpoint: subscription.endpoint,
+ auth: subscription.auth,
+ publickey: subscription.publickey
+ });
+ }
+ });
+ });
+}
diff --git a/src/api/endpoints.ts b/src/api/endpoints.ts
index 2783c92027..06fb9a64ae 100644
--- a/src/api/endpoints.ts
+++ b/src/api/endpoints.ts
@@ -147,6 +147,11 @@ const endpoints: Endpoint[] = [
},
{
+ name: 'sw/register',
+ withCredential: true
+ },
+
+ {
name: 'i',
withCredential: true
},
diff --git a/src/api/endpoints/posts/create.ts b/src/api/endpoints/posts/create.ts
index 4f4b7e2e83..ae4959dae4 100644
--- a/src/api/endpoints/posts/create.ts
+++ b/src/api/endpoints/posts/create.ts
@@ -14,7 +14,7 @@ import ChannelWatching from '../../models/channel-watching';
import serialize from '../../serializers/post';
import notify from '../../common/notify';
import watch from '../../common/watch-post';
-import { default as event, publishChannelStream } from '../../event';
+import event, { pushSw, publishChannelStream } from '../../event';
import config from '../../../conf';
/**
@@ -234,7 +234,7 @@ module.exports = (params, user: IUser, app) => new Promise(async (res, rej) => {
const mentions = [];
- function addMention(mentionee, type) {
+ function addMention(mentionee, reason) {
// Reject if already added
if (mentions.some(x => x.equals(mentionee))) return;
@@ -243,7 +243,8 @@ module.exports = (params, user: IUser, app) => new Promise(async (res, rej) => {
// Publish event
if (!user._id.equals(mentionee)) {
- event(mentionee, type, postObj);
+ event(mentionee, reason, postObj);
+ pushSw(mentionee, reason, postObj);
}
}
diff --git a/src/api/endpoints/sw/register.ts b/src/api/endpoints/sw/register.ts
new file mode 100644
index 0000000000..99406138db
--- /dev/null
+++ b/src/api/endpoints/sw/register.ts
@@ -0,0 +1,50 @@
+/**
+ * Module dependencies
+ */
+import $ from 'cafy';
+import Subscription from '../../models/sw-subscription';
+
+/**
+ * subscribe service worker
+ *
+ * @param {any} params
+ * @param {any} user
+ * @param {any} _
+ * @param {boolean} isSecure
+ * @return {Promise<any>}
+ */
+module.exports = async (params, user, _, isSecure) => new Promise(async (res, rej) => {
+ // Get 'endpoint' parameter
+ const [endpoint, endpointErr] = $(params.endpoint).string().$;
+ if (endpointErr) return rej('invalid endpoint param');
+
+ // Get 'auth' parameter
+ const [auth, authErr] = $(params.auth).string().$;
+ if (authErr) return rej('invalid auth param');
+
+ // Get 'publickey' parameter
+ const [publickey, publickeyErr] = $(params.publickey).string().$;
+ if (publickeyErr) return rej('invalid publickey param');
+
+ // if already subscribed
+ const exist = await Subscription.findOne({
+ user_id: user._id,
+ endpoint: endpoint,
+ auth: auth,
+ publickey: publickey,
+ deleted_at: { $exists: false }
+ });
+
+ if (exist !== null) {
+ return res();
+ }
+
+ await Subscription.insert({
+ user_id: user._id,
+ endpoint: endpoint,
+ auth: auth,
+ publickey: publickey
+ });
+
+ res();
+});
diff --git a/src/api/event.ts b/src/api/event.ts
index 8605a0f1e4..4a2e4e453d 100644
--- a/src/api/event.ts
+++ b/src/api/event.ts
@@ -1,5 +1,6 @@
import * as mongo from 'mongodb';
import * as redis from 'redis';
+import swPush from './common/push-sw';
import config from '../conf';
type ID = string | mongo.ObjectID;
@@ -17,6 +18,10 @@ class MisskeyEvent {
this.publish(`user-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
+ public publishSw(userId: ID, type: string, value?: any): void {
+ swPush(userId, type, value);
+ }
+
public publishDriveStream(userId: ID, type: string, value?: any): void {
this.publish(`drive-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
@@ -50,6 +55,8 @@ const ev = new MisskeyEvent();
export default ev.publishUserStream.bind(ev);
+export const pushSw = ev.publishSw.bind(ev);
+
export const publishDriveStream = ev.publishDriveStream.bind(ev);
export const publishPostStream = ev.publishPostStream.bind(ev);
diff --git a/src/api/models/sw-subscription.ts b/src/api/models/sw-subscription.ts
new file mode 100644
index 0000000000..ecca04cb91
--- /dev/null
+++ b/src/api/models/sw-subscription.ts
@@ -0,0 +1,3 @@
+import db from '../../db/mongodb';
+
+export default db.get('sw_subscriptions') as any; // fuck type definition