kura-expo-fs
Version:
The FileSystem API abstraction library, Expo Filesystem Plugin
128 lines (123 loc) • 3.54 kB
text/typescript
import {
cacheDirectory,
copyAsync,
deleteAsync,
downloadAsync,
FileSystemSessionType,
FileSystemUploadType,
getInfoAsync,
uploadAsync,
} from "expo-file-system";
import {
AbstractAccessor,
DIR_SEPARATOR,
FileSystemObject,
LAST_DIR_SEPARATORS,
Transferer,
} from "kura";
interface ExpoFsTransfererOptions {
background?: boolean;
getOnly?: boolean;
threshold?: number;
}
export class ExpoFsTransferer extends Transferer {
public constructor(private options?: ExpoFsTransfererOptions) {
super();
if (!options) {
options = {};
}
if (options.getOnly == null) {
options.getOnly = false;
}
if (options.background == null) {
options.background = false;
}
}
public async transfer(
fromAccessor: AbstractAccessor,
fromObj: FileSystemObject,
toAccessor: AbstractAccessor,
toObj: FileSystemObject
) {
if (
this.options.threshold != null &&
fromObj.size < this.options.threshold
) {
await super.transfer(fromAccessor, fromObj, toAccessor, toObj);
return;
}
const fromUrl = await fromAccessor.getURL(fromObj.fullPath, "GET");
const toUrl = await toAccessor.getURL(toObj.fullPath, "PUT");
if (
!fromUrl ||
!toUrl ||
(this.options.getOnly && !toUrl.startsWith("file:"))
) {
await super.transfer(fromAccessor, fromObj, toAccessor, toObj);
return;
}
if (fromUrl.startsWith("file:")) {
if (toUrl.startsWith("file:")) {
await copyAsync({ from: fromUrl, to: toUrl });
} else {
const uRes = await uploadAsync(toUrl, fromUrl, {
httpMethod: "PUT",
headers: {
"Content-Length": fromObj.size + "",
},
sessionType: this.options.background
? FileSystemSessionType.BACKGROUND
: FileSystemSessionType.FOREGROUND,
uploadType: FileSystemUploadType.BINARY_CONTENT,
});
if (!(uRes.status + "").startsWith("2")) {
throw uRes;
}
}
} else {
if (toUrl.startsWith("file:")) {
const result = await downloadAsync(fromUrl, toUrl, {
sessionType: this.options.background
? FileSystemSessionType.BACKGROUND
: FileSystemSessionType.FOREGROUND,
});
if (!(result.status + "").startsWith("2")) {
throw result;
}
} else {
const tempUri =
cacheDirectory.replace(LAST_DIR_SEPARATORS, "") +
DIR_SEPARATOR +
Date.now();
try {
const dRes = await downloadAsync(fromUrl, tempUri, {
sessionType: this.options.background
? FileSystemSessionType.BACKGROUND
: FileSystemSessionType.FOREGROUND,
});
if (!(dRes.status + "").startsWith("2")) {
throw dRes;
}
const info = await getInfoAsync(tempUri);
const uRes = await uploadAsync(toUrl, tempUri, {
httpMethod: "PUT",
headers: {
"Content-Length": info.size + "",
},
sessionType: this.options.background
? FileSystemSessionType.BACKGROUND
: FileSystemSessionType.FOREGROUND,
uploadType: FileSystemUploadType.BINARY_CONTENT,
});
if (!(uRes.status + "").startsWith("2")) {
throw uRes;
}
} finally {
try {
deleteAsync(tempUri);
} catch {}
}
}
}
}
}