{"version":3,"sources":["../../src/client/client.ts","../../src/client/client-error.ts","../../src/http-client/http-error.ts","../../src/http-client/http-response-error.ts","../../src/http-client/http-client.ts","../../src/model/wfl/wflobject.ts","../../src/model/wfl/relation.ts"],"sourcesContent":["import { v4 as uuidv4 } from 'uuid';\nimport { IClient } from './client-interface';\nimport { ClientOptions } from './client-options';\n\nimport { LoggerInterface,  } from '@aws-lambda-powertools/logger/types';\nimport { HttpClient } from '../http-client/http-client';\nimport { IHttpClient } from '../http-client/http-client-interface';\nimport { ClientError } from './client-error';\nimport { WflObject } from '../model/wfl/wflobject';\nimport { Relation, RelationType } from '../model/wfl/relation';\nimport { MetaDataValue } from '../model/wfl/metadata-value';\nimport { PropertyValue } from '../model/wfl/property-value';\nimport { Target } from '../model/wfl/target';\n\nimport { BodyInit } from \"undici-types/fetch\";\n\ninterface RegisterRequest {\n    Appname: string,\n    Url: string,\n    Username: string,\n    Password: string,\n    RequestId: string,\n    /**\n     * Optional\n     */\n    ConfigurationId?: string\n}\n\ninterface Responsebase {\n    ConfigurationId: string,\n    RequestId: string,\n    EventSource: string,\n    EventDetail: string,\n    Status: string,\n    StatusMessage?: string,\n    Result: any\n}\n\n\n\nexport class Client implements IClient{\n\n    private _options: ClientOptions;\n    private _logger : LoggerInterface;\n    private _httpClient : IHttpClient;\n\n    private _studioBaseUrl : string = \"\";\n\n    private _publicationsCache : Record<string,any> = {};\n\n    get options() {\n        return this._options;\n    }\n\n    /**\n     * The configurationId\n     */\n    private _configurationId: string | null = null;\n\n    /**\n     * @returns The configurationid\n     * @throws QqAwsServiceStudioClientClientError when not logged on\n     */\n    get configurationId(): string {\n        if (this._configurationId === null) {\n             throw new ClientError(\"Not logged on\")\n        };\n\n        return this._configurationId;\n    }\n\n    /**\n     * \n     * @param logger The logger instance\n     * @param options The Client options\n     * @param httpClient The Http client. When not defined an instance will be created automatically.\n     */\n    constructor(logger : LoggerInterface, options: ClientOptions, httpClient? : IHttpClient) {\n\n        console.log(\"Client::constructor\", options);\n        \n        if (httpClient === undefined) {\n            httpClient = new HttpClient(logger);\n        }\n\n        this._logger = logger;\n        this._options = options;\n        this._httpClient = httpClient;\n\n        this._httpClient.setCommonHeaders( {\n            'User-Agent': 'StudioClient Client',\n            'x-api-key' : this.options.apiKey\n        });\n\n        this._httpClient.setBaseUrl(options.baseUrl);\n    }\n\n    private validateOptions(options: ClientOptions) {\n        if (options.baseUrl == \"\") {\n            throw new ClientError(\"baseUrl is required\");\n        }\n    }\n\n    /**\n     * \n     * @returns true when logged in\n     */\n    isLoggedOn(): boolean {\n        return this._configurationId !== null;\n    }\n\n    setStudioBaseUrl(url : string) {\n        this._studioBaseUrl = this._sanitizeUrl(url);\n    }\n\n    /**\n     * \n     * @param configurationId \n     * @returns true when logged in\n     */\n    async logon(configurationId: string) : Promise<boolean> {\n        console.log(`QqAwsServiceStudioClientClient::logon: configurationId=[${configurationId}]`);\n        //TODO: Maybe some additional validation here \n\n        this._configurationId = configurationId;\n\n        return this.isLoggedOn();\n    }\n\n\n    /**\n     * \n     * @returns The Woodwing Studio base URL\n     */\n    getBaseUrl(): string {\n        return <string>this._options.baseUrl;\n    }\n\n    /**\n     * @param studioUrl The \n     * @param appname The application name\n     * @param username The WoodWing Studio username\n     * @param password The WoodWing Studio password\n     * @param requestId Optional: The requestID \n     * @param configurationId Optional: The configurationID\n     * @returns The new or given ConfigurationId\n     * @throws QqAwsServiceStudioClientClientError when the registration fails.\n     */\n    async register(studioUrl: string, appname: string, username: string, password: string, requestId: string|undefined, configurationId: string|undefined): Promise<string> {\n        if (requestId === undefined) {\n            requestId = this._generateRequestId();\n        }\n        console.log(`QqAwsServiceStudioClientClient::register: studioUrl=[${studioUrl}], appname=[${appname}], username=[${username}], requestId=[${requestId}]`);\n\n        const request: RegisterRequest = {\n            \"Appname\": appname,\n            \"Url\": this._sanitizeUrl(studioUrl),\n            \"Username\": username,\n            \"Password\": password,\n            \"RequestId\": requestId,\n        };\n\n        if (configurationId !== undefined) {\n            if (this._configurationId !== null) {\n                request.ConfigurationId = this._configurationId\n            }\n            request.ConfigurationId = configurationId\n        }\n\n        const result = await this._httpClient.request('POST', 'studioapplication', undefined, request);\n        if ('ConfigurationId' in result) {\n            this._configurationId = result.ConfigurationId;\n            return result.ConfigurationId;\n        }\n\n        throw new ClientError(\"No 'ConfigurationId' in response\");\n    }\n\n    async unRegister(configurationId?: string) : Promise<void> {\n        if (configurationId === undefined) {\n            configurationId = this.configurationId;\n        }\n    }\n\n    /**\n     * \n     * @param ids The publication ids to resolve\n     * @param requestInfo What elements to retrieve. \"PubChannels\",\"States\", \"Categories\"\n     * @param forceNew When true, ignore local cache.\n     * @returns All resolved publications \n     */\n    public async getPublications(ids : string[], requestInfo? : string[], forceNew? : boolean, requestId?: string, configurationId?: string) : Promise<Record<string, any>[]> {\n        if(forceNew === undefined) {\n            forceNew = false;\n        }\n        \n        console.log(`SqCreatePdf2Client::getPublications: ids=[${ids.join(', ')}], forceNew=[${forceNew}]`);\n        let idsToRequest : string[] = [];\n        for (const id of ids) {\n            if (forceNew === true || !(id in this._publicationsCache)) {\n                idsToRequest.push(id);\n            } else {\n                // Brand already cached\n                this._logger.debug(`Brand ${id} already loaded. Check the request info`);\n                if (requestInfo !== undefined) {\n                    for (const requestInfoElement of requestInfo) {\n                        if (!(requestInfoElement in this._publicationsCache[id])) {\n                            // The request info element is not cached for this brand\n                            this._logger.debug(`Brand ${id} already loaded. But ${requestInfoElement} was not requested before.`);\n                            idsToRequest.push(id);\n                            break;\n                        }\n                    }\n                }\n\n            }\n        }\n\n        if(idsToRequest.length > 0) {\n            const publications = await this.getPublicationsInt(\n                idsToRequest, requestInfo);\n\n            for (const publication of publications) {\n                const brandId = <string> publication.Id;\n                this._publicationsCache[brandId] = publication;\n            }\n        }\n\n        let result : Record<string, any>[] = [];\n        for (const id of ids) {\n            if (id in this._publicationsCache) {\n                result.push(this._publicationsCache[id]);\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     *\n     * @param {string} publicationId\n     * @returns {Promise<null|object>}\n     */\n    async getPublication(publicationId : string, requestInfo? : string[] ) {\n\n        const publications = await this.getPublications([publicationId], requestInfo);\n        \n\n        for (let pubIdx in publications) {\n\n            const publication = publications[pubIdx];\n\n            console.log(\"processing publication: \", publication);\n\n            if (publication.Id === publicationId.toString()) {\n                return publication;\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * \n     * @param forceNew When true create a new ticket instead of the cached ticket\n     * @param requestId \n     * @param configurationId \n     * @returns \n     */\n    async getTicket(forceNew? : boolean, requestId?: string, configurationId?: string): Promise<string> {\n        if (forceNew === undefined) {\n            forceNew = false;\n        }\n        \n        if (requestId === undefined) {\n            requestId = this._generateRequestId();\n        }\n\n        if (configurationId === undefined) {\n            configurationId = this.configurationId;\n        }\n        console.log(`QqAwsServiceStudioClientClient::getTicket: forceNew=[${forceNew}], requestId=[${requestId}], configurationId=[${configurationId}]`);\n\n        const path = 'ticket';\n\n        const query = new URLSearchParams({\n            ConfigurationId: configurationId,\n            RequestId: requestId,\n            Forcenew: forceNew ? 'true' : 'false'\n        })\n\n        const result = await this._httpClient.request('GET', path, query);\n\n        return result;\n    }\n\n    /**\n     * @inheritdoc\n     */\n    async getStateByName(publicationId : string, type : string, name : string ) : Promise<null|any> {\n\n        const publication = await this.getPublication(publicationId, ['States']);\n\n        if (publication === null) {\n            return null;\n        }\n\n        for (const state of publication.States) {\n            //const state = publication.States[stateIdx];\n\n            if (state.Type.toLowerCase() === type.toLowerCase() && state.Name.toLowerCase() === name.toLowerCase()) {\n                return state;\n            }\n        }\n        \n        return null;\n    }\n\n\n\n\n    /**\n     *\n     * @param wflObject\n     * @param childId\n     * @param type\n     * @param parentType\n     * @returns \n     */\n    async getWflRelations(wflObject : any, childId : string, type : string = 'Contained', parentType : string = 'Dossier') : Promise<object[]> {\n\n        let result = [];\n\n        for (let relIdx in wflObject.Relations) {\n            const relation = wflObject.Relations[relIdx];\n\n            if (\n                relation.Child === childId &&\n                relation.Type.toLowerCase() === type.toLowerCase() &&\n                relation.ParentInfo.Type.toLowerCase() === parentType.toLowerCase()\n            ) {\n                result.push(relation)\n            }\n\n        }\n\n        return result;\n    }\n\n    // /**\n    //  *\n    //  * @param {string} bucket\n    //  * @param {string} key\n    //  *\n    //  * @returns {Promise<object>}\n    //  */\n    // async getDigitalArticle = async(bucket : string, key : string) : Promise<object> => {\n    //     const s3client = new S3Client({});\n    //     const response = await s3client.send(new GetObjectCommand(\n    //         {\n    //             Bucket: bucket,\n    //             Key: key\n    //         }\n    //     ));\n\n    //     if (!response.ETag) {\n    //         throw new Error('Error getting digital article from bucket.');\n    //     }\n\n    //     return response;\n    // }\n    \n    /**\n     *\n     * @param url\n     * @returns \n     */\n    async downloadFile(url : string, query? : URLSearchParams ) : Promise<ArrayBuffer>{\n        if (query === undefined) {\n            query = new URLSearchParams();\n        }\n\n        query.append('ticket', await this.getTicket());\n\n        const buffer = await this._httpClient.downloadFile(url, query);\n \n        return buffer;\n    }\n    \n    \n    /**\n     * @inheritdoc\n     */\n    async uploadFile(body : BodyInit, contentType : string, size : number){\n\n        if(this._studioBaseUrl === '') {\n            throw new ClientError(\"No studio base url set\");\n        }\n\n        const url = await this._httpClient.uploadFile(body, size, contentType, await this.getTicket(), this._studioBaseUrl )\n\n        return url;\n    }\n\n    /**\n     *\n     * @param objectIds\n     * @param rendition\n     * @param requestInfo\n     * @param lock\n     * @param areas\n     * @returns \n     */\n    async getObjects(\n        objectIds : string[], \n        rendition : string = 'native', \n        requestInfo : string[] = ['MetaData'],\n        lock : boolean = false, \n        areas : string[] = ['Workflow']\n    ) : Promise<WflObject[]> {\n\n        const query = this._getCommonQueryParameters();\n        query.append('ObjectIds', objectIds.join(','));\n        query.append('RequestInfo', requestInfo.join(','));\n        query.append('Rendition', rendition);\n\n        const response = await this._httpClient.request('get', 'objects', query);\n        //TODO: How to convert te result in a WflObject instance.\n        return response;\n\n    }\n\n    async createObjects(wflObjects : WflObject[], lock : boolean = false) : Promise<WflObject[]> {\n\n        const body = {\n            WflObjects: wflObjects,\n            RequestId: this._generateRequestId(),\n            ConfigurationId: this.configurationId,\n            Lock: lock\n        }\n\n        const response = await this._httpClient.request('post', 'objects', undefined, body);\n\n        return response;\n    }\n\n    /**\n     *\n     * @param parentIdOrInstance\n     * @param childIdsOrInstances\n     * @param type\n     * @returns \n     */\n    async createObjectRelations(\n        parentIdOrInstance : string | WflObject, \n        childIdsOrInstances : string[]|WflObject[], \n        type : RelationType = RelationType.Contained \n    ) : Promise<Relation[]> {\n        const parentId = this._getObjectId(parentIdOrInstance);\n        const childIds : string[] = [];\n\n        for(const childIdOrInstance of childIdsOrInstances) {\n            const childId = this._getObjectId(childIdOrInstance);\n            childIds.push(childId);\n        }\n\n        let relations = [];\n\n        for (const childId of childIds) {\n            relations.push(new Relation({\n                Parent: parentId,\n                Child: childId,\n                Type: type\n            }));\n        }\n\n        const body = {\n            RequestId : this._generateRequestId(),\n            Relations : relations,\n            ConfigurationId: this.configurationId\n        }\n\n        const response = await this._httpClient.request('post','objectrelations', undefined, body);\n        return response;\n    }\n\n    /**\n     * \n     * @param childIdsOrInstances \n     * @param permanent \n     * @param areas \n     * @returns \n     */\n    async deleteObjects(childIdsOrInstances : string[] | WflObject[], permanent : boolean = false, areas : string = 'Workflow') : Promise<object> {\n        const ids : string[] = [];\n        for(const childIdOrInstance of childIdsOrInstances) {\n            const childId = this._getObjectId(childIdOrInstance);\n            ids.push(childId);\n        }\n\n        const query = this._getCommonQueryParameters();\n        query.append('ObjectIds', ids.join(','));\n        query.append('Permanent', '');\n        query.append('Areas', areas);\n        query.append('RequestId', this._generateRequestId());\n        query.append('ConfigurationId', this.configurationId);\n\n        const response = await this._httpClient.request('delete', 'objects', query);\n\n        return response;\n    }\n\n    /**\n     * \n     * @param action Workflow Action type.\n     * @param context v10.40 Can be used to provide relevant information based on the dialog circumstances.\n     * @param metaData v8.0: MetaData value allows client app to round trip the data.\n     * @param targets v8.0: Object's targets. Data contained in Targets allow client app to round trip the data.\n     * @param defaultDossier v7.0: Dossier ID: Request to populate the Dossier property. \n     *                       The given Publication and Issue are used to get dossiers (to choose from). If no Issue specified, \n     *                       first one is taken. The dossier ID will be used to set the default value at Dossier property. \n     *                       If DefaultDossier is nil (or left out) no dossier property nor dossiers will be returned.\n     * @param parent v7.0: Parent ID: When creating objects that are placed (such as creating articles form layout) the client \n     *               knows that the object will be placed, but the server does not know yet. For placed objects, \n     *               the dialog has some fields disabled (greyed) like Publication/Brand, Issue and Category. Nil (or left out) \n     *               means object is not placed.\n     * @param template v7.0: Template ID : When creating objects, some properties should be taken from a template. \n     *                 Those should be pre-filled in for the new object at the Create workflow dialog. Provide the object ID of \n     *                 the template (that was picked by user) to let server pre-fill properties. Nil (or left out) means object \n     *                 is not created from template.\n     * @param areas v8.0: Area to search for the object. Nil means 'workflow' area only (for backwards compatibility reasons).\n     * @param multipleObjects v9.2: Indicate if the dialog is for multiple objects or single object. \n     *                        Nil means 'false' (for backwards compatibility reasons).\n     * @returns \n     */\n    async getDialog2(\n        action : string, \n        context? : string, \n        metaData? : MetaDataValue[], \n        targets? : Target[], \n        defaultDossier? : string,\n        parent? : string,\n        template? : string,\n        areas? : string[],\n        multipleObjects? : boolean\n    ) {\n        const body : Record<string, any> = {\n            RequestId : this._generateRequestId(),\n            ConfigurationId: this.configurationId,\n            Action : action\n        }\n\n        if(context) {\n            body['Context'] = context;\n        }\n\n        if(metaData) {\n            //TODO: Must be 'MetaData' (bug in Service)\n            body['Metadata'] = metaData;\n        }\n\n        if(targets) {\n            body['Targets'] = targets;\n        }\n\n        if(defaultDossier) {\n            body['DefaultDossier'] = defaultDossier;\n        }\n\n        if(parent) {\n            body['Parent'] = parent;\n        }\n\n        if(template) {\n            body['Template'] = template;\n        }\n\n        if(areas) {\n            body['Areas'] = areas;\n        }\n\n        if(multipleObjects) {\n            body['MultipleObjects'] = multipleObjects;\n        }\n\n        const response = await this._httpClient.request('post', 'dialog', undefined, body);\n        return response;\n    }\n\n    /**\n     * \n     * @param ids The brand id(s)\n     * @param requestInfo What elements to retrieve. \"PubChannels\",\"States\", \"Categories\"\n     * @param requestId \n     * @param configurationId \n     * @returns \n     */\n    private async getPublicationsInt(ids: string[], requestInfo? : string[], requestId?: string, configurationId?: string): Promise<Record<string, any>[]> {\n        if(requestInfo === undefined) {\n            requestInfo = [];\n        }\n        \n        if (requestId === undefined) {\n            requestId = this._generateRequestId();\n        }\n        console.log(`QqAwsServiceStudioClientClient::getPublications: ids=[${ids.join(',')}], requestInfo=[${requestInfo.join(', ')}], requestId=[${requestId}]`);\n\n        if (configurationId === undefined) {\n            configurationId = this.configurationId;\n        }\n        \n        const query =  this._getCommonQueryParameters(configurationId);\n        query.append('Ids', ids.join(','));\n        query.append('RequestInfo', requestInfo.join(', '));\n\n        const result = await this._httpClient.request('GET', 'publications', query);\n        return result;\n    }\n\n    /**\n     * Add the ConfigurationId and RequestId to the query\n     * \n     * \n     * @param configurationId Overrule the configurationId when required.\n     * @returns \n     */\n    private _getCommonQueryParameters(configurationId? : string) : URLSearchParams {\n        if (configurationId === undefined) {\n            configurationId = this.configurationId;\n        }\n        const query = new URLSearchParams({\n            ConfigurationId: configurationId,\n            RequestId: this._generateRequestId()\n        });\n\n        return query;\n    }\n\n    /**\n     * Get the parentId from the iddOrInstance\n     *\n     * @param iddOrInstance\n     * @returns The object id\n     * @throws ClientError when the id cannot be determined\n     */\n    private _getObjectId(idOrInstance : string | WflObject, ) : string {\n        if(idOrInstance instanceof WflObject || (\n            typeof idOrInstance === 'object' &&\n            '__classname__' in idOrInstance &&\n             idOrInstance['__classname__'] === 'Object')) {\n            const id = idOrInstance.MetaData?.BasicMetaData?.ID;\n            if(id === undefined || id === null) {\n                throw new ClientError(`childId is undefined`);\n            }\n            return id;\n        } else {\n            return idOrInstance;\n        }\n    }\n\n    _sanitizeUrl(url: string): string {\n        return url.replace(/\\/$/, \"\");\n    }\n\n    _generateRequestId() {\n        return uuidv4();\n    }\n\n\n}","export class ClientError extends Error {\n    constructor(msg: string) {\n        super(msg);\n        this.name = 'ClientError';\n    }\n}\n","export class HttpError extends Error {\n\n\n\n    /**\n     *\n     * @param {string} message\n     */\n    constructor(message: string) {\n        super(message);\n        this.name = \"HttpError\";\n    }\n}","import { HttpError } from \"./http-error\";\n\nexport class HttpResponseError extends HttpError {\n\n    readonly code: number;\n    readonly name: string;\n\n    /**\n     *\n     * @param {Response} response\n     */\n    constructor(message: string, response: Response) {\n        super(HttpResponseError.buildMessage(message, response));\n        this.code = response.status;\n        this.name = \"HttpResponseError\";\n    }\n\n    static buildMessage(message : string, response: Response) : string {\n        if(message) {\n            return `HTTP Error: ${message}: ${response.status} ${response.statusText}`;\n        } else {\n            return `HTTP Error: ${response.status} ${response.statusText}`;\n        }\n    }\n}","import { ClientError } from \"../client/client-error\";\nimport { IHttpClient } from \"./http-client-interface\";\nimport { HttpError } from \"./http-error\";\nimport { HttpResponseError } from \"./http-response-error\";\nimport {ResponseBase} from \"./response-base\";\nimport {v4 as uuidv4} from 'uuid';\nimport { LoggerInterface,  } from '@aws-lambda-powertools/logger/types';\nimport { BodyInit, HeadersInit } from \"undici-types/fetch\";\n\nexport class HttpClient implements IHttpClient {\n\n    \n    private headers : Record<string,string> = {}\n\n    private baseUrl: string = \".\";\n    \n    private logger : LoggerInterface;\n\n    constructor(logger : LoggerInterface) {\n        this.logger = logger;\n    }\n\n    /**\n     * \n     * @returns The configuration service base URL\n     */\n    getBaseUrl(): string {\n        return <string>this.baseUrl;\n    }\n\n    setBaseUrl(baseUrl : string) : void {\n        this.baseUrl = baseUrl;\n    }\n\n    setCommonHeaders(headers : Record<string,string>) : void{\n        this.headers = headers;\n    }\n\n\n    async request(httpMethod: string, path: string, query?: URLSearchParams, body?: any): Promise<any> {\n        httpMethod = httpMethod.toUpperCase();\n\n        if (query === undefined) {\n            query = new URLSearchParams();\n        }\n\n        const url = this.getBaseUrl() + '/' + path + (query.size > 0 ? '?' + query.toString() : '');\n\n        const request: RequestInit = {\n            method: httpMethod.toUpperCase(),\n            headers: { ...this.headers} // Clone headers\n        }\n\n        console.log(`HttpClient::_request: httpMethod=[${httpMethod}], url=[${url}]`);\n        if (httpMethod === 'POST') {\n            this.logger.debug(`HttpClient::_request: body=[${JSON.stringify(body)}]`);\n            console.log(\"HttpClient::_request: body:\", body);\n            request.body = JSON.stringify(body);\n            // @ts-ignore request.Headers is always set.\n            request.headers['Content-Type'] = 'application/json';\n        }\n\n        const response = await fetch(url, request);\n\n        let data: ResponseBase | null = null;\n\n        const contentType: string = <string>response.headers.get(\"Content-Type\");\n        switch (contentType) {\n            case \"application/json\":\n                data = (await response.json()) as ResponseBase;\n                break;\n            default:\n                throw new HttpResponseError(`Unsupported content type: ${contentType}`, response);\n        }\n\n        data = this._checkResponse(data);\n\n        return data.Result;\n    }\n\n\n    /**\n     *\n     * @param url\n     * @returns \n     */\n    async downloadFile(url : string, query?: URLSearchParams) : Promise<ArrayBuffer>{\n        if (query === undefined) {\n            query = new URLSearchParams();\n        } \n\n        const parsedUrl = new URL(url)\n\n        query.forEach((value, key) => {\n            parsedUrl.searchParams.set(key, value);\n        });\n\n\n        //url = url + (query.size > 0 ? '?' + query.toString() : '');\n        url = parsedUrl.toString();\n\n        \n        const response = await fetch(url);\n\n        if (!response.ok) {\n            throw new HttpResponseError(\"Object cannot be downloaded from Studio.\", response);\n        }\n\n        const buffer = await response.arrayBuffer();\n\n        console.log(`Downloaded ${buffer.byteLength} bytes`);\n\n        return buffer;\n    }\n\n    /**\n     * Upload a file to the Studio transfer server.\n     * \n     * \n     * @param body \n     * @param size\n     * @param contentType \n     * @param ticket \n     * @param studiobaseUrl The Studio base url\n     *\n     * @returns The url to the uploaded file\n     */\n    async uploadFile(body : BodyInit, size : number | null, contentType : string, ticket : string, studiobaseUrl : string) : Promise<string> {\n        this.logger.debug(`HttpClient::uploadFile: ticket=[${ticket}], studiobaseUrl=[${studiobaseUrl}]`)\n\n        const url = `${studiobaseUrl}/transferindex.php?ticket=${ticket}&fileguid=${uuidv4()}`;\n\n        const headers : HeadersInit = {\n            'Content-Type' : contentType,\n        }\n\n        if(size !== null) {\n            headers['Content-Length'] = String(size);\n        }\n\n        const response = await fetch(url, {\n            method: 'PUT',\n            // To prevent the error: RequestInit: duplex option is required when sending a body\n            // Note: The order is important!!!! The 'duplex' setting must be set before the body otherwise it will be ignored.\n            duplex: 'half',\n            body: body,\n            headers: headers\n        });\n\n        if (!response.ok) {\n            throw new HttpResponseError('Unable to upload file.',response);\n        }\n\n        return url;\n    }\n\n    /**\n     * @param {object} data\n     * @private\n     */\n    _checkResponse(data: ResponseBase | null) : ResponseBase {\n        console.log(\"HttpClient::_checkResponse: \", data);\n\n        if (data === null) {\n            throw new HttpError(\"No JSON data received\");\n        }\n\n        if (data.hasOwnProperty('Status')) {\n            if (data.Status !== 'ok') {\n                if (data.StatusMessage !== undefined) {\n                    throw new ClientError(`The status is not 'ok': ${data.Status}: ${data.StatusMessage}`);\n                } else {\n                    throw new ClientError(`The status is not 'ok': ${data.Status}`);\n                }\n            }\n        } else {\n            throw new HttpError(\"No 'Status' property found in response\");\n        }\n\n        if (!data.hasOwnProperty('Result')) {\n            throw new HttpError(\"No 'Result' property found in response\");\n        }\n\n        return data;\n    }\n\n    _sanitizeUrl(url: string): string {\n        return url.replace(/\\/$/, \"\");\n    }\n}","import { Attachment } from \"./attachment\";\nimport { EditionRenditionsInfo } from \"./edition-renditions-info\";\nimport { Element } from \"./element\";\nimport { InDesignArticle } from \"./indesign-article\";\nimport { Message } from \"./message\";\nimport { MessageList } from \"./message-list\";\nimport { MetaData } from \"./metadata\";\nimport { ObjectLabel } from \"./object-label\";\nimport { ObjectOperation } from \"./object-operations\";\nimport { Page } from \"./page\";\nimport { Placement } from \"./placement\";\nimport { Relation } from \"./relation\";\nimport { Target } from \"./target\";\n\nexport class WflObject {\n    public __classname__: string = 'Object';\n\n    public MetaData: MetaData | null = null;\n\n    public Relations: Relation[] | null = null;\n\n    public Pages: Page[] | null = null;\n\n    public Files: Attachment[] | null = null;\n\n    public Messages: Message[] | null = null;\n\n    public Elements: Element[] | null = null;\n\n    public Targets: Target[] | null = null;\n\n    public Renditions: EditionRenditionsInfo[] | null = null;\n\n    public MessageList: MessageList | null = null;\n\n    public ObjectLabels: ObjectLabel[] | null = null;\n\n    public InDesignArticles: InDesignArticle[] | null = null;\n\n    public Placements: Placement[] | null = null;\n\n    public Operations: ObjectOperation[] | null = null;\n\n    constructor(\n        params : WflObjectNamedParameters\n    ) {\n        this.MetaData = params.Metadata ?? null;\n        this.Relations = params.Relations ?? null;;\n        this.Pages = params.Pages ?? null;;\n        this.Files = params.Files ?? null;;\n        this.Messages = params.Messages ?? null;;\n        this.Elements = params.Elements ?? null;;\n        this.Targets = params.Targets ?? null;;\n        this.Renditions = params.Renditions ?? null;;\n        this.MessageList = params.MessageList ?? null;;\n        this.ObjectLabels = params.ObjectLabels ?? null;;\n        this.InDesignArticles = params.InDesignArticles ?? null;;\n        this.Placements = params.Placements ?? null;;\n        this.Operations = params.Operations ?? null;;\n    }\n\n}\n\nexport interface WflObjectNamedParameters {\n    Metadata?: MetaData\n    Relations?: Relation[]\n    Pages?: Page[]\n    Files?: Attachment[]\n    Messages?: Message[]\n    Elements?: Element[]\n    Targets?: Target[]\n    Renditions?: EditionRenditionsInfo[]\n    MessageList?: MessageList\n    ObjectLabels?: ObjectLabel[]\n    InDesignArticles?: InDesignArticle[]\n    Placements?: Placement[]\n    Operations?: ObjectOperation[]\n}","import { ObjectInfo } from \"./object-info\";\nimport { ObjectLabel } from \"./object-label\";\nimport { Placement } from \"./placement\";\nimport { Target } from \"./target\";\n\nexport enum RelationType {\n    Contained = \"Contained\",\n    Placed = \"Placed\",\n    DeletedContained = \"DeletedContained\"\n}\n\nexport class Relation {\n    public __classname__: string = 'Relation';\n\n    public Parent: string | null = null;\n    public Child: string | null = null;\n    public Type: RelationType | null = null;\n    public Placements: Placement[] | null = null;\n    public ParentVersion: string | null = null;\n    public ChildVersion: string | null = null;\n    public Rating: number | null = null;\n    public Targets: Target[] | null = null;\n    public ParentInfo: ObjectInfo | null = null;\n    public ChildInfo: ObjectInfo | null = null;\n    public ObjectLabels: ObjectLabel[] | null = null;\n\n    constructor(params: RelationNamedParameters) {\n        this.Parent = params.Parent ?? null;\n        this.Child = params.Child ?? null;\n        this.Type = params.Type ?? null;\n        this.Placements = params.Placements ?? null;\n        this.ParentVersion = params.ParentVersion ?? null;\n        this.ChildVersion = params.ChildVersion ?? null;\n        this.Rating = params.Rating ?? null;\n        this.Targets = params.Targets ?? null;\n        this.ParentInfo = params.ParentInfo ?? null;\n        this.ChildInfo = params.ChildInfo ?? null;\n        this.ObjectLabels = params.ObjectLabels ?? null;\n    }\n}\n\nexport interface RelationNamedParameters {\n    Parent: string\n    Child: string\n    Type: RelationType\n    Placements?: Placement[]\n    ParentVersion?: string\n    ChildVersion?: string\n    Rating?: number\n    Targets?: Target[]\n    ParentInfo?: ObjectInfo\n    ChildInfo?: ObjectInfo\n    ObjectLabels?: ObjectLabel[]\n}"],"mappings":"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","names":["uuidv4","uuidv4"]}