@@ -28,39 +28,23 @@ type PrivateKey = {
28
28
keyId : string ;
29
29
} ;
30
30
31
- @Injectable ( )
32
- export class ApRequestService {
33
- private logger : Logger ;
34
-
35
- constructor (
36
- @Inject ( DI . config )
37
- private config : Config ,
38
-
39
- private userKeypairStoreService : UserKeypairStoreService ,
40
- private httpRequestService : HttpRequestService ,
41
- private loggerService : LoggerService ,
42
- ) {
43
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
44
- this . logger = this . loggerService ?. getLogger ( 'ap-request' ) ; // なぜか TypeError: Cannot read properties of undefined (reading 'getLogger') と言われる
45
- }
46
-
47
- @bindThis
48
- private createSignedPost ( args : { key : PrivateKey , url : string , body : string , additionalHeaders : Record < string , string > } ) : Signed {
31
+ export class ApRequestCreator {
32
+ static createSignedPost ( args : { key : PrivateKey , url : string , body : string , additionalHeaders : Record < string , string > } ) : Signed {
49
33
const u = new URL ( args . url ) ;
50
34
const digestHeader = `SHA-256=${ crypto . createHash ( 'sha256' ) . update ( args . body ) . digest ( 'base64' ) } ` ;
51
35
52
36
const request : Request = {
53
37
url : u . href ,
54
38
method : 'POST' ,
55
- headers : this . objectAssignWithLcKey ( {
39
+ headers : this . # objectAssignWithLcKey( {
56
40
'Date' : new Date ( ) . toUTCString ( ) ,
57
41
'Host' : u . host ,
58
42
'Content-Type' : 'application/activity+json' ,
59
43
'Digest' : digestHeader ,
60
44
} , args . additionalHeaders ) ,
61
45
} ;
62
46
63
- const result = this . signToRequest ( request , args . key , [ '(request-target)' , 'date' , 'host' , 'digest' ] ) ;
47
+ const result = this . # signToRequest( request , args . key , [ '(request-target)' , 'date' , 'host' , 'digest' ] ) ;
64
48
65
49
return {
66
50
request,
@@ -70,21 +54,20 @@ export class ApRequestService {
70
54
} ;
71
55
}
72
56
73
- @bindThis
74
- private createSignedGet ( args : { key : PrivateKey , url : string , additionalHeaders : Record < string , string > } ) : Signed {
57
+ static createSignedGet ( args : { key : PrivateKey , url : string , additionalHeaders : Record < string , string > } ) : Signed {
75
58
const u = new URL ( args . url ) ;
76
59
77
60
const request : Request = {
78
61
url : u . href ,
79
62
method : 'GET' ,
80
- headers : this . objectAssignWithLcKey ( {
63
+ headers : this . # objectAssignWithLcKey( {
81
64
'Accept' : 'application/activity+json, application/ld+json' ,
82
65
'Date' : new Date ( ) . toUTCString ( ) ,
83
66
'Host' : new URL ( args . url ) . host ,
84
67
} , args . additionalHeaders ) ,
85
68
} ;
86
69
87
- const result = this . signToRequest ( request , args . key , [ '(request-target)' , 'date' , 'host' , 'accept' ] ) ;
70
+ const result = this . # signToRequest( request , args . key , [ '(request-target)' , 'date' , 'host' , 'accept' ] ) ;
88
71
89
72
return {
90
73
request,
@@ -94,13 +77,12 @@ export class ApRequestService {
94
77
} ;
95
78
}
96
79
97
- @bindThis
98
- private signToRequest ( request : Request , key : PrivateKey , includeHeaders : string [ ] ) : Signed {
99
- const signingString = this . genSigningString ( request , includeHeaders ) ;
80
+ static #signToRequest( request : Request , key : PrivateKey , includeHeaders : string [ ] ) : Signed {
81
+ const signingString = this . #genSigningString( request , includeHeaders ) ;
100
82
const signature = crypto . sign ( 'sha256' , Buffer . from ( signingString ) , key . privateKeyPem ) . toString ( 'base64' ) ;
101
83
const signatureHeader = `keyId="${ key . keyId } ",algorithm="rsa-sha256",headers="${ includeHeaders . join ( ' ' ) } ",signature="${ signature } "` ;
102
84
103
- request . headers = this . objectAssignWithLcKey ( request . headers , {
85
+ request . headers = this . # objectAssignWithLcKey( request . headers , {
104
86
Signature : signatureHeader ,
105
87
} ) ;
106
88
// node-fetch will generate this for us. if we keep 'Host', it won't change with redirects!
@@ -114,9 +96,8 @@ export class ApRequestService {
114
96
} ;
115
97
}
116
98
117
- @bindThis
118
- private genSigningString ( request : Request , includeHeaders : string [ ] ) : string {
119
- request . headers = this . lcObjectKey ( request . headers ) ;
99
+ static #genSigningString( request : Request , includeHeaders : string [ ] ) : string {
100
+ request . headers = this . #lcObjectKey( request . headers ) ;
120
101
121
102
const results : string [ ] = [ ] ;
122
103
@@ -131,16 +112,31 @@ export class ApRequestService {
131
112
return results . join ( '\n' ) ;
132
113
}
133
114
134
- @bindThis
135
- private lcObjectKey ( src : Record < string , string > ) : Record < string , string > {
115
+ static #lcObjectKey( src : Record < string , string > ) : Record < string , string > {
136
116
const dst : Record < string , string > = { } ;
137
117
for ( const key of Object . keys ( src ) . filter ( x => x !== '__proto__' && typeof src [ x ] === 'string' ) ) dst [ key . toLowerCase ( ) ] = src [ key ] ;
138
118
return dst ;
139
119
}
140
120
141
- @bindThis
142
- private objectAssignWithLcKey ( a : Record < string , string > , b : Record < string , string > ) : Record < string , string > {
143
- return Object . assign ( this . lcObjectKey ( a ) , this . lcObjectKey ( b ) ) ;
121
+ static #objectAssignWithLcKey( a : Record < string , string > , b : Record < string , string > ) : Record < string , string > {
122
+ return Object . assign ( this . #lcObjectKey( a ) , this . #lcObjectKey( b ) ) ;
123
+ }
124
+ }
125
+
126
+ @Injectable ( )
127
+ export class ApRequestService {
128
+ private logger : Logger ;
129
+
130
+ constructor (
131
+ @Inject ( DI . config )
132
+ private config : Config ,
133
+
134
+ private userKeypairStoreService : UserKeypairStoreService ,
135
+ private httpRequestService : HttpRequestService ,
136
+ private loggerService : LoggerService ,
137
+ ) {
138
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
139
+ this . logger = this . loggerService ?. getLogger ( 'ap-request' ) ; // なぜか TypeError: Cannot read properties of undefined (reading 'getLogger') と言われる
144
140
}
145
141
146
142
@bindThis
@@ -149,7 +145,7 @@ export class ApRequestService {
149
145
150
146
const keypair = await this . userKeypairStoreService . getUserKeypair ( user . id ) ;
151
147
152
- const req = this . createSignedPost ( {
148
+ const req = ApRequestCreator . createSignedPost ( {
153
149
key : {
154
150
privateKeyPem : keypair . privateKey ,
155
151
keyId : `${ this . config . url } /users/${ user . id } #main-key` ,
@@ -176,7 +172,7 @@ export class ApRequestService {
176
172
public async signedGet ( url : string , user : { id : User [ 'id' ] } ) {
177
173
const keypair = await this . userKeypairStoreService . getUserKeypair ( user . id ) ;
178
174
179
- const req = this . createSignedGet ( {
175
+ const req = ApRequestCreator . createSignedGet ( {
180
176
key : {
181
177
privateKeyPem : keypair . privateKey ,
182
178
keyId : `${ this . config . url } /users/${ user . id } #main-key` ,
0 commit comments