@@ -109,9 +109,16 @@ export class FetchHandler
109
109
ctx : FetchMessageHandlerOptions
110
110
) : Promise < BasicMessage | null > {
111
111
switch ( message . type ) {
112
- case PROTOCOL_MESSAGE_TYPE . CREDENTIAL_OFFER_MESSAGE_TYPE :
113
- await this . handleOfferMessage ( message as CredentialsOfferMessage , ctx ) ;
114
- return null ;
112
+ case PROTOCOL_MESSAGE_TYPE . CREDENTIAL_OFFER_MESSAGE_TYPE : {
113
+ const result = await this . handleOfferMessage ( message as CredentialsOfferMessage , ctx ) ;
114
+ if ( Array . isArray ( result ) ) {
115
+ const credWallet = this . opts ?. credentialWallet ;
116
+ if ( ! credWallet ) throw new Error ( 'Credential wallet is not provided' ) ;
117
+ await credWallet . saveAll ( result ) ;
118
+ return null ;
119
+ }
120
+ return result as BasicMessage ;
121
+ }
115
122
case PROTOCOL_MESSAGE_TYPE . CREDENTIAL_FETCH_REQUEST_MESSAGE_TYPE :
116
123
return this . handleFetchRequest ( message as CredentialFetchRequestMessage ) ;
117
124
case PROTOCOL_MESSAGE_TYPE . CREDENTIAL_ISSUANCE_RESPONSE_MESSAGE_TYPE :
@@ -128,16 +135,14 @@ export class FetchHandler
128
135
headers ?: HeadersInit ;
129
136
packerOptions ?: JWSPackerParams ;
130
137
}
131
- ) : Promise < W3CCredential [ ] > {
138
+ ) : Promise < W3CCredential [ ] | BasicMessage > {
132
139
if ( ! ctx . mediaType ) {
133
140
ctx . mediaType = MediaType . ZKPMessage ;
134
141
}
135
142
136
143
const credentials : W3CCredential [ ] = [ ] ;
137
144
138
- for ( let index = 0 ; index < offerMessage . body . credentials . length ; index ++ ) {
139
- const credentialInfo = offerMessage . body . credentials [ index ] ;
140
-
145
+ for ( const credentialInfo of offerMessage . body . credentials ) {
141
146
const guid = uuid . v4 ( ) ;
142
147
const fetchRequest : MessageFetchRequestMessage = {
143
148
id : guid ,
@@ -167,7 +172,6 @@ export class FetchHandler
167
172
...packerOpts
168
173
} )
169
174
) ;
170
- let message : { body : { credential : W3CCredential } } ;
171
175
try {
172
176
if ( ! offerMessage ?. body ?. url ) {
173
177
throw new Error ( `could not fetch W3C credential, body url is missing` ) ;
@@ -180,16 +184,24 @@ export class FetchHandler
180
184
} ,
181
185
body : token
182
186
} ) ;
183
- if ( resp . status !== 200 ) {
184
- throw new Error ( `could not fetch W3C credential, ${ credentialInfo ?. id } ` ) ;
187
+ const arrayBuffer = await resp . arrayBuffer ( ) ;
188
+ if ( ! arrayBuffer . byteLength ) {
189
+ throw new Error ( `could not fetch , ${ credentialInfo ?. id } , response is empty` ) ;
190
+ }
191
+ const { unpackedMessage : message } = await this . _packerMgr . unpack (
192
+ new Uint8Array ( arrayBuffer )
193
+ ) ;
194
+ if ( message . type !== PROTOCOL_MESSAGE_TYPE . CREDENTIAL_ISSUANCE_RESPONSE_MESSAGE_TYPE ) {
195
+ return message ;
185
196
}
186
- message = await resp . json ( ) ;
187
- credentials . push ( W3CCredential . fromJSON ( message . body . credential ) ) ;
197
+ credentials . push (
198
+ W3CCredential . fromJSON ( ( message as CredentialIssuanceMessage ) . body . credential )
199
+ ) ;
188
200
} catch ( e : unknown ) {
189
201
throw new Error (
190
- `could not fetch W3C credential, ${ credentialInfo ?. id } , error: ${
191
- ( e as Error ) . message ?? e
192
- } `
202
+ `could not fetch protocol message for credential offer id: , ${
203
+ credentialInfo ?. id
204
+ } , error: ${ ( e as Error ) . message ?? e } `
193
205
) ;
194
206
}
195
207
}
@@ -219,11 +231,17 @@ export class FetchHandler
219
231
PROTOCOL_MESSAGE_TYPE . CREDENTIAL_OFFER_MESSAGE_TYPE
220
232
) ;
221
233
222
- return this . handleOfferMessage ( offerMessage , {
234
+ const result = await this . handleOfferMessage ( offerMessage , {
223
235
mediaType : opts ?. mediaType ,
224
236
headers : opts ?. headers ,
225
237
packerOptions : opts ?. packerOptions
226
238
} ) ;
239
+
240
+ if ( Array . isArray ( result ) ) {
241
+ return result ;
242
+ }
243
+
244
+ throw new Error ( 'invalid protocol message response' ) ;
227
245
}
228
246
229
247
private async handleFetchRequest (
@@ -242,7 +260,7 @@ export class FetchHandler
242
260
243
261
const credId = msgRequest . body ?. id ;
244
262
if ( ! credId ) {
245
- throw new Error ( 'nvalid credential id in fetch request body' ) ;
263
+ throw new Error ( 'invalid credential id in fetch request body' ) ;
246
264
}
247
265
248
266
if ( ! this . opts ?. credentialWallet ) {
0 commit comments