aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/helpers/activitypub.ts
diff options
context:
space:
mode:
Diffstat (limited to 'server/helpers/activitypub.ts')
-rw-r--r--server/helpers/activitypub.ts197
1 files changed, 106 insertions, 91 deletions
diff --git a/server/helpers/activitypub.ts b/server/helpers/activitypub.ts
index 326785b68..2d49e6869 100644
--- a/server/helpers/activitypub.ts
+++ b/server/helpers/activitypub.ts
@@ -8,102 +8,117 @@ import { pageToStartAndCount } from './core-utils'
8import { URL } from 'url' 8import { URL } from 'url'
9import { MActor, MVideoAccountLight } from '../typings/models' 9import { MActor, MVideoAccountLight } from '../typings/models'
10 10
11export type ContextType = 'All' | 'View' | 'Announce' 11export type ContextType = 'All' | 'View' | 'Announce' | 'CacheFile'
12
13function getContextData (type: ContextType) {
14 const context: any[] = [
15 'https://www.w3.org/ns/activitystreams',
16 'https://w3id.org/security/v1',
17 {
18 RsaSignature2017: 'https://w3id.org/security#RsaSignature2017'
19 }
20 ]
12 21
13function activityPubContextify <T> (data: T, type: ContextType = 'All') { 22 if (type !== 'View' && type !== 'Announce') {
14 const base = { 23 const additional = {
15 RsaSignature2017: 'https://w3id.org/security#RsaSignature2017' 24 pt: 'https://joinpeertube.org/ns#',
25 sc: 'http://schema.org#'
26 }
27
28 if (type === 'CacheFile') {
29 Object.assign(additional, {
30 expires: 'sc:expires',
31 CacheFile: 'pt:CacheFile'
32 })
33 } else {
34 Object.assign(additional, {
35 Hashtag: 'as:Hashtag',
36 uuid: 'sc:identifier',
37 category: 'sc:category',
38 licence: 'sc:license',
39 subtitleLanguage: 'sc:subtitleLanguage',
40 sensitive: 'as:sensitive',
41 language: 'sc:inLanguage',
42
43 Infohash: 'pt:Infohash',
44 originallyPublishedAt: 'sc:datePublished',
45 views: {
46 '@type': 'sc:Number',
47 '@id': 'pt:views'
48 },
49 state: {
50 '@type': 'sc:Number',
51 '@id': 'pt:state'
52 },
53 size: {
54 '@type': 'sc:Number',
55 '@id': 'pt:size'
56 },
57 fps: {
58 '@type': 'sc:Number',
59 '@id': 'pt:fps'
60 },
61 startTimestamp: {
62 '@type': 'sc:Number',
63 '@id': 'pt:startTimestamp'
64 },
65 stopTimestamp: {
66 '@type': 'sc:Number',
67 '@id': 'pt:stopTimestamp'
68 },
69 position: {
70 '@type': 'sc:Number',
71 '@id': 'pt:position'
72 },
73 commentsEnabled: {
74 '@type': 'sc:Boolean',
75 '@id': 'pt:commentsEnabled'
76 },
77 downloadEnabled: {
78 '@type': 'sc:Boolean',
79 '@id': 'pt:downloadEnabled'
80 },
81 waitTranscoding: {
82 '@type': 'sc:Boolean',
83 '@id': 'pt:waitTranscoding'
84 },
85 support: {
86 '@type': 'sc:Text',
87 '@id': 'pt:support'
88 },
89 likes: {
90 '@id': 'as:likes',
91 '@type': '@id'
92 },
93 dislikes: {
94 '@id': 'as:dislikes',
95 '@type': '@id'
96 },
97 playlists: {
98 '@id': 'pt:playlists',
99 '@type': '@id'
100 },
101 shares: {
102 '@id': 'as:shares',
103 '@type': '@id'
104 },
105 comments: {
106 '@id': 'as:comments',
107 '@type': '@id'
108 }
109 })
110 }
111
112 context.push(additional)
16 } 113 }
17 114
18 if (type === 'All') { 115 return {
19 Object.assign(base, { 116 '@context': context
20 pt: 'https://joinpeertube.org/ns#',
21 sc: 'http://schema.org#',
22 Hashtag: 'as:Hashtag',
23 uuid: 'sc:identifier',
24 category: 'sc:category',
25 licence: 'sc:license',
26 subtitleLanguage: 'sc:subtitleLanguage',
27 sensitive: 'as:sensitive',
28 language: 'sc:inLanguage',
29 expires: 'sc:expires',
30 CacheFile: 'pt:CacheFile',
31 Infohash: 'pt:Infohash',
32 originallyPublishedAt: 'sc:datePublished',
33 views: {
34 '@type': 'sc:Number',
35 '@id': 'pt:views'
36 },
37 state: {
38 '@type': 'sc:Number',
39 '@id': 'pt:state'
40 },
41 size: {
42 '@type': 'sc:Number',
43 '@id': 'pt:size'
44 },
45 fps: {
46 '@type': 'sc:Number',
47 '@id': 'pt:fps'
48 },
49 startTimestamp: {
50 '@type': 'sc:Number',
51 '@id': 'pt:startTimestamp'
52 },
53 stopTimestamp: {
54 '@type': 'sc:Number',
55 '@id': 'pt:stopTimestamp'
56 },
57 position: {
58 '@type': 'sc:Number',
59 '@id': 'pt:position'
60 },
61 commentsEnabled: {
62 '@type': 'sc:Boolean',
63 '@id': 'pt:commentsEnabled'
64 },
65 downloadEnabled: {
66 '@type': 'sc:Boolean',
67 '@id': 'pt:downloadEnabled'
68 },
69 waitTranscoding: {
70 '@type': 'sc:Boolean',
71 '@id': 'pt:waitTranscoding'
72 },
73 support: {
74 '@type': 'sc:Text',
75 '@id': 'pt:support'
76 },
77 likes: {
78 '@id': 'as:likes',
79 '@type': '@id'
80 },
81 dislikes: {
82 '@id': 'as:dislikes',
83 '@type': '@id'
84 },
85 playlists: {
86 '@id': 'pt:playlists',
87 '@type': '@id'
88 },
89 shares: {
90 '@id': 'as:shares',
91 '@type': '@id'
92 },
93 comments: {
94 '@id': 'as:comments',
95 '@type': '@id'
96 }
97 })
98 } 117 }
118}
99 119
100 return Object.assign({}, data, { 120function activityPubContextify <T> (data: T, type: ContextType = 'All') {
101 '@context': [ 121 return Object.assign({}, data, getContextData(type))
102 'https://www.w3.org/ns/activitystreams',
103 'https://w3id.org/security/v1',
104 base
105 ]
106 })
107} 122}
108 123
109type ActivityPubCollectionPaginationHandler = (start: number, count: number) => Bluebird<ResultList<any>> | Promise<ResultList<any>> 124type ActivityPubCollectionPaginationHandler = (start: number, count: number) => Bluebird<ResultList<any>> | Promise<ResultList<any>>