1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 export type KeepManifest = KeepManifestStream[];
7 export interface KeepManifestStream {
10 files: Array<KeepManifestStreamFile>;
13 export interface KeepManifestStreamFile {
20 * Documentation [http://doc.arvados.org/api/storage.html](http://doc.arvados.org/api/storage.html)
22 export const parseKeepManifestText = (text: string) =>
23 text.split(/\n/).map(parseKeepManifestStream);
26 * Documentation [http://doc.arvados.org/api/storage.html](http://doc.arvados.org/api/storage.html)
28 export const parseKeepManifestStream = (stream: string): KeepManifestStream => {
29 const tokens = stream.split(' ');
31 streamName: streamName(tokens),
32 locators: locators(tokens),
37 const FILE_LOCATOR_REGEXP = /^([0-9a-f]{32})\+([0-9]+)(\+[A-Z][-A-Za-z0-9@_]*)*$/;
39 const FILE_REGEXP = /([0-9]+):([0-9]+):(.*)/;
41 const streamName = (tokens: string[]) => tokens[0];
43 const locators = (tokens: string[]) => tokens.filter(isFileLocator);
45 const files = (tokens: string[]) => tokens.filter(isFile).map(parseFile);
47 const isFileLocator = (token: string) => FILE_LOCATOR_REGEXP.test(token);
49 const isFile = (token: string) => FILE_REGEXP.test(token);
51 const parseFile = (token: string): KeepManifestStreamFile => {
52 const match = FILE_REGEXP.exec(token);
53 const [position, size, fileName] = match!.slice(1);
54 return { fileName, position, size: parseInt(size, 10) };