53 lines
2.0 KiB
JavaScript
53 lines
2.0 KiB
JavaScript
import nestedProp from "nested-property";
|
|
import { joinURL } from "../tools/url.js";
|
|
import { encodePath } from "../tools/path.js";
|
|
import { generateLockXML, parseGenericResponse } from "../tools/xml.js";
|
|
import { request, prepareRequestOptions } from "../request.js";
|
|
import { createErrorFromResponse, handleResponseCode } from "../response.js";
|
|
const DEFAULT_TIMEOUT = "Infinite, Second-4100000000";
|
|
export async function lock(context, path, options = {}) {
|
|
const { refreshToken, timeout = DEFAULT_TIMEOUT } = options;
|
|
const headers = {
|
|
Accept: "text/plain,application/xml",
|
|
Timeout: timeout
|
|
};
|
|
if (refreshToken) {
|
|
headers.If = refreshToken;
|
|
}
|
|
const requestOptions = prepareRequestOptions({
|
|
url: joinURL(context.remoteURL, encodePath(path)),
|
|
method: "LOCK",
|
|
headers,
|
|
data: generateLockXML(context.contactHref)
|
|
}, context, options);
|
|
const response = await request(requestOptions, context);
|
|
handleResponseCode(context, response);
|
|
const responseData = await response.text();
|
|
const lockPayload = parseGenericResponse(responseData);
|
|
const token = nestedProp.get(lockPayload, "prop.lockdiscovery.activelock.locktoken.href");
|
|
const serverTimeout = nestedProp.get(lockPayload, "prop.lockdiscovery.activelock.timeout");
|
|
if (!token) {
|
|
const err = createErrorFromResponse(response, "No lock token received: ");
|
|
throw err;
|
|
}
|
|
return {
|
|
token,
|
|
serverTimeout
|
|
};
|
|
}
|
|
export async function unlock(context, path, token, options = {}) {
|
|
const requestOptions = prepareRequestOptions({
|
|
url: joinURL(context.remoteURL, encodePath(path)),
|
|
method: "UNLOCK",
|
|
headers: {
|
|
"Lock-Token": token
|
|
}
|
|
}, context, options);
|
|
const response = await request(requestOptions, context);
|
|
handleResponseCode(context, response);
|
|
if (response.status !== 204 && response.status !== 200) {
|
|
const err = createErrorFromResponse(response);
|
|
throw err;
|
|
}
|
|
}
|