@@ -31,28 +31,6 @@ export declare namespace Assets {
3131 }
3232}
3333
34- interface TestAssetUploadRequest {
35- /**
36- * File to upload via various formats
37- */
38- file : ArrayBuffer | ReadableStream | string ;
39-
40- /**
41- * The file MIME type
42- */
43- mimeType ?: string ;
44-
45- /**
46- * Name of the file
47- */
48- fileName : string ;
49-
50- /**
51- * Name of the parent folder to upload to
52- */
53- parentFolder ?: string ;
54- }
55-
5634/**
5735 * Assets are files that are uploaded to your Webflow account.
5836 */
@@ -176,194 +154,6 @@ export class Assets {
176154 }
177155 }
178156
179- public async createAndUpload (
180- siteId : string ,
181- request : TestAssetUploadRequest ,
182- requestOptions ?: Assets . RequestOptions
183- ) : Promise < Webflow . AssetUpload > {
184- if ( siteId ) {
185- throw new errors . WebflowError ( {
186- statusCode : 400 ,
187- body : "a test" ,
188- } ) ;
189- }
190- /** 1. Generate the hash */
191- const getBufferFromUrl = async ( url : string ) : Promise < ArrayBuffer > => {
192- const response = await fetch ( url ) ;
193- const buffer = await response . arrayBuffer ( ) ;
194- console . log ( "BUF" , buffer ) ;
195- return buffer ;
196- // return crypto.createHash("md5").update(Buffer.from(buffer)).digest("hex");
197- } ;
198- const file = request . file ;
199- let tempBuffer : Buffer | null = null ;
200- if ( typeof file === 'string' ) {
201- const arrBuffer = await getBufferFromUrl ( file ) ;
202- tempBuffer = Buffer . from ( arrBuffer ) ;
203- } else if ( file instanceof ArrayBuffer ) {
204- tempBuffer = Buffer . from ( file ) ;
205- }
206- if ( tempBuffer === null ) {
207- throw new Error ( 'Invalid file' ) ;
208- }
209- const hash = crypto . createHash ( "md5" ) . update ( Buffer . from ( tempBuffer ) ) . digest ( "hex" ) ;
210- const fileName = request . fileName ;
211-
212- const wfUploadRequest = {
213- fileName,
214- fileHash : hash ,
215- } ;
216-
217- /** 2. Create the Asset Metadata in Webflow */
218- const createWfAssetMetadata = async ( ) => {
219- const _response = await core . fetcher ( {
220- url : urlJoin (
221- ( await core . Supplier . get ( this . _options . environment ) ) ?? environments . WebflowEnvironment . Default ,
222- `sites/${ encodeURIComponent ( siteId ) } /assets`
223- ) ,
224- method : "POST" ,
225- headers : {
226- Authorization : await this . _getAuthorizationHeader ( ) ,
227- "X-Fern-Language" : "JavaScript" ,
228- "X-Fern-SDK-Name" : "webflow-api" ,
229- "X-Fern-SDK-Version" : "3.1.1" ,
230- "User-Agent" : "webflow-api/3.1.1" ,
231- "X-Fern-Runtime" : core . RUNTIME . type ,
232- "X-Fern-Runtime-Version" : core . RUNTIME . version ,
233- ...requestOptions ?. headers ,
234- } ,
235- contentType : "application/json" ,
236- requestType : "json" ,
237- body : serializers . AssetsCreateRequest . jsonOrThrow ( wfUploadRequest , {
238- unrecognizedObjectKeys : "passthrough" ,
239- allowUnrecognizedUnionMembers : true ,
240- allowUnrecognizedEnumValues : true ,
241- } ) ,
242- timeoutMs : requestOptions ?. timeoutInSeconds != null ? requestOptions . timeoutInSeconds * 1000 : 60000 ,
243- maxRetries : requestOptions ?. maxRetries ,
244- abortSignal : requestOptions ?. abortSignal ,
245- } ) ;
246- if ( _response . ok ) {
247- return serializers . AssetUpload . parseOrThrow ( _response . body , {
248- unrecognizedObjectKeys : "passthrough" ,
249- allowUnrecognizedUnionMembers : true ,
250- allowUnrecognizedEnumValues : true ,
251- skipValidation : true ,
252- breadcrumbsPrefix : [ "response" ] ,
253- } ) ;
254- }
255-
256- if ( _response . error . reason === "status-code" ) {
257- switch ( _response . error . statusCode ) {
258- case 400 :
259- throw new Webflow . BadRequestError ( _response . error . body ) ;
260- case 401 :
261- throw new Webflow . UnauthorizedError (
262- serializers . Error_ . parseOrThrow ( _response . error . body , {
263- unrecognizedObjectKeys : "passthrough" ,
264- allowUnrecognizedUnionMembers : true ,
265- allowUnrecognizedEnumValues : true ,
266- skipValidation : true ,
267- breadcrumbsPrefix : [ "response" ] ,
268- } )
269- ) ;
270- case 404 :
271- throw new Webflow . NotFoundError (
272- serializers . Error_ . parseOrThrow ( _response . error . body , {
273- unrecognizedObjectKeys : "passthrough" ,
274- allowUnrecognizedUnionMembers : true ,
275- allowUnrecognizedEnumValues : true ,
276- skipValidation : true ,
277- breadcrumbsPrefix : [ "response" ] ,
278- } )
279- ) ;
280- case 429 :
281- throw new Webflow . TooManyRequestsError (
282- serializers . Error_ . parseOrThrow ( _response . error . body , {
283- unrecognizedObjectKeys : "passthrough" ,
284- allowUnrecognizedUnionMembers : true ,
285- allowUnrecognizedEnumValues : true ,
286- skipValidation : true ,
287- breadcrumbsPrefix : [ "response" ] ,
288- } )
289- ) ;
290- case 500 :
291- throw new Webflow . InternalServerError (
292- serializers . Error_ . parseOrThrow ( _response . error . body , {
293- unrecognizedObjectKeys : "passthrough" ,
294- allowUnrecognizedUnionMembers : true ,
295- allowUnrecognizedEnumValues : true ,
296- skipValidation : true ,
297- breadcrumbsPrefix : [ "response" ] ,
298- } )
299- ) ;
300- default :
301- throw new errors . WebflowError ( {
302- statusCode : _response . error . statusCode ,
303- body : _response . error . body ,
304- } ) ;
305- }
306- }
307-
308- switch ( _response . error . reason ) {
309- case "non-json" :
310- throw new errors . WebflowError ( {
311- statusCode : _response . error . statusCode ,
312- body : _response . error . rawBody ,
313- } ) ;
314- case "timeout" :
315- throw new errors . WebflowTimeoutError ( "Timeout exceeded when calling POST /sites/{site_id}/assets." ) ;
316- case "unknown" :
317- throw new errors . WebflowError ( {
318- message : _response . error . errorMessage ,
319- } ) ;
320- }
321- } ;
322-
323- console . log ( "Step 2 done" ) ;
324-
325- /** 3. Upload to AWS */
326- const wfUploadedAsset = await createWfAssetMetadata ( ) ;
327-
328- console . log ( "Step 2.5 done" ) ;
329- const wfUploadDetails = wfUploadedAsset . uploadDetails ! ;
330- const uploadUrl = wfUploadedAsset . uploadUrl as string ;
331- // Temp workaround since headers from response are being camelCased and we need them to be exact when sending to S3
332- const headerMappings = {
333- 'xAmzAlgorithm' : 'X-Amz-Algorithm' ,
334- 'xAmzDate' : 'X-Amz-Date' ,
335- 'xAmzCredential' : 'X-Amz-Credential' ,
336- 'xAmzSignature' : 'X-Amz-Signature' ,
337- 'successActionStatus' : 'success_action_status' ,
338- 'contentType' : 'Content-Type' ,
339- 'cacheControl' : 'Cache-Control' ,
340- } ;
341- const transformedUploadHeaders = Object . keys ( wfUploadDetails ) . reduce ( ( acc : Record < string , any > , key ) => {
342- const mappedKey = headerMappings [ key as keyof typeof headerMappings ] || key ;
343- acc [ mappedKey ] = wfUploadDetails [ key as keyof typeof headerMappings ] ;
344- return acc ;
345- } , { } ) ;
346- const formDataToUpload = new FormData ( ) ;
347- Object . keys ( transformedUploadHeaders ) . forEach ( ( key ) => {
348- formDataToUpload . append ( key , transformedUploadHeaders [ key ] ) ;
349- } ) ;
350- console . log ( "STEP 2.6 done" , tempBuffer ) ;
351- const newBlob = Readable . from ( tempBuffer ) ;
352- console . log ( "NEW BLOB" , newBlob ) ;
353- formDataToUpload . append ( "file" , newBlob , {
354- filename : fileName ,
355- contentType : wfUploadedAsset . contentType ,
356- } ) ;
357- console . log ( "STEP 2.75 done" ) ;
358- const uploadResponse = await fetch ( uploadUrl , {
359- method : 'POST' ,
360- body : formDataToUpload ,
361- headers : { ...formDataToUpload . getHeaders ( ) } ,
362- } ) ;
363- console . log ( "UPLOAD RESPONSE" , JSON . stringify ( uploadResponse ) ) ;
364- return wfUploadedAsset ;
365- }
366-
367157 /**
368158 * The first step in uploading an asset to a site.
369159 *
0 commit comments