@nativescript/firebase-storage
Version:
NativeScript Firebase - Storage
541 lines • 17.8 kB
JavaScript
import { FirebaseApp, FirebaseError, deserialize, serialize, firebase } from '@nativescript/firebase-core';
import { TaskState, TaskEvent, StringFormat } from './common';
import { b64WithoutPrefix, getMIMEforBase64String } from './utils';
export { StringFormat, TaskEvent };
let defaultStorage;
const fb = firebase();
Object.defineProperty(fb, 'storage', {
value: (app) => {
if (!app) {
if (!defaultStorage) {
defaultStorage = new Storage();
}
return defaultStorage;
}
return new Storage(app);
},
writable: false,
});
export class TaskSnapshot {
static fromNative(value) {
if (value instanceof FIRStorageTaskSnapshot) {
const ss = new TaskSnapshot();
ss._native = value;
return ss;
}
return null;
}
get native() {
return this._native;
}
get ios() {
return this.native;
}
get bytesTransferred() {
return this.native?.progress?.completedUnitCount;
}
get error() {
if (!this.native.error) {
return null;
}
return FirebaseError.fromNative(this.native.error);
}
get metadata() {
return Metadata.fromNative(this.native.metadata);
}
get ref() {
return Reference.fromNative(this.native.reference);
}
get state() {
switch (this.native.status) {
case 5 /* FIRStorageTaskStatus.Failure */:
return TaskState.ERROR;
case 3 /* FIRStorageTaskStatus.Pause */:
return TaskState.PAUSED;
case 1 /* FIRStorageTaskStatus.Resume */:
case 2 /* FIRStorageTaskStatus.Progress */:
return TaskState.RUNNING;
case 4 /* FIRStorageTaskStatus.Success */:
return TaskState.SUCCESS;
default:
return TaskState.UNKNOWN;
}
}
get task() {
return Task.fromNative(this.native.task);
}
get totalBytes() {
return this.native?.progress?.totalUnitCount;
}
}
export class Task {
static fromNative(value) {
if (value instanceof FIRStorageUploadTask || value instanceof FIRStorageDownloadTask) {
const task = new Task();
task._native = value;
return task;
}
return null;
}
get native() {
return this._native;
}
get ios() {
return this.native;
}
get snapshot() {
return TaskSnapshot.fromNative(this.native.snapshot);
}
cancel() {
this.native?.cancel();
return this.native.snapshot.progress.cancelled;
}
on(event, nextOrObserver, error, complete) {
if (event !== TaskEvent.STATE_CHANGED) {
return;
}
if (nextOrObserver) {
if (typeof nextOrObserver === 'function') {
this.native.observeStatusHandler(2 /* FIRStorageTaskStatus.Progress */, (snapshot) => {
nextOrObserver(TaskSnapshot.fromNative(snapshot));
});
this.native.observeStatusHandler(3 /* FIRStorageTaskStatus.Pause */, (snapshot) => {
nextOrObserver(TaskSnapshot.fromNative(snapshot));
});
this.native.observeStatusHandler(1 /* FIRStorageTaskStatus.Resume */, (snapshot) => {
nextOrObserver(TaskSnapshot.fromNative(snapshot));
});
}
else if (typeof nextOrObserver === 'object') {
this.native.observeStatusHandler(2 /* FIRStorageTaskStatus.Progress */, (snapshot) => {
nextOrObserver?.next(TaskSnapshot.fromNative(snapshot));
});
this.native.observeStatusHandler(3 /* FIRStorageTaskStatus.Pause */, (snapshot) => {
nextOrObserver?.next(TaskSnapshot.fromNative(snapshot));
});
this.native.observeStatusHandler(1 /* FIRStorageTaskStatus.Resume */, (snapshot) => {
nextOrObserver?.next(TaskSnapshot.fromNative(snapshot));
});
}
}
if (error || typeof nextOrObserver === 'function' || typeof nextOrObserver === 'object') {
this.native.observeStatusHandler(5 /* FIRStorageTaskStatus.Failure */, (snapshot) => {
if (nextOrObserver) {
if (typeof nextOrObserver === 'function') {
nextOrObserver(TaskSnapshot.fromNative(snapshot));
}
else if (typeof nextOrObserver === 'object') {
nextOrObserver?.next(TaskSnapshot.fromNative(snapshot));
nextOrObserver?.error(FirebaseError.fromNative(snapshot.error));
}
}
if (error) {
error(FirebaseError.fromNative(snapshot.error));
}
});
}
if (complete || typeof nextOrObserver === 'function' || typeof nextOrObserver === 'object') {
this.native.observeStatusHandler(4 /* FIRStorageTaskStatus.Success */, (snapshot) => {
if (nextOrObserver) {
if (typeof nextOrObserver === 'function') {
nextOrObserver(TaskSnapshot.fromNative(snapshot));
}
else if (typeof nextOrObserver === 'object') {
nextOrObserver?.next(TaskSnapshot.fromNative(snapshot));
nextOrObserver?.complete?.();
}
}
if (complete) {
complete();
}
});
}
}
pause() {
this.native?.pause();
return this.native.snapshot.progress.paused;
}
resume() {
this.native?.resume();
return true;
}
}
export class ListResult {
static fromNative(value) {
if (value instanceof FIRStorageListResult) {
const list = new ListResult();
list._native = value;
return list;
}
return null;
}
get native() {
return this._native;
}
get ios() {
return this.native;
}
get items() {
const items = this.native.items;
const count = items.count;
const result = [];
for (let i = 0; i < count; i++) {
result.push(Reference.fromNative(items.objectAtIndex(i)));
}
return result;
}
get nextPageToken() {
return this.native.pageToken;
}
get prefixes() {
const items = this.native.prefixes;
const count = items.count;
const result = [];
for (let i = 0; i < count; i++) {
result.push(Reference.fromNative(items.objectAtIndex(i)));
}
return result;
}
}
export class Metadata {
constructor() {
this._native = FIRStorageMetadata.new();
}
static fromNative(value) {
if (value instanceof FIRStorageMetadata) {
const meta = new Metadata();
meta._native = value;
return meta;
}
return null;
}
get native() {
return this._native;
}
get ios() {
return this.native;
}
get bucket() {
return this.native?.bucket;
}
get cacheControl() {
return this.native?.cacheControl;
}
set cacheControl(value) {
this.native.cacheControl = value;
}
get contentDisposition() {
return this.native?.contentDisposition;
}
set contentDisposition(value) {
this.native.contentDisposition = value;
}
get contentEncoding() {
return this.native?.contentEncoding;
}
set contentEncoding(value) {
this.native.contentEncoding = value;
}
get contentLanguage() {
return this.native?.contentLanguage;
}
set contentLanguage(value) {
this.native.contentLanguage = value;
}
get contentType() {
return this.native?.contentType;
}
set contentType(value) {
this.native.contentType = value;
}
get customMetadata() {
return deserialize(this.native?.customMetadata);
}
set customMetadata(value) {
this.native.customMetadata = serialize(value);
}
get fullPath() {
return this.native?.path;
}
get generation() {
return String(this.native.generation);
}
get md5hash() {
return this.native?.md5Hash;
}
get metageneration() {
return String(this.native.metageneration);
}
get name() {
return this.native?.name;
}
get size() {
return this.native?.size;
}
get timeCreated() {
return this.native.timeCreated;
}
get updated() {
return this.native.updated;
}
}
export class Reference {
static fromNative(value) {
if (value instanceof FIRStorageReference) {
const ref = new Reference();
ref._native = value;
return ref;
}
return null;
}
get native() {
return this._native;
}
get ios() {
return this.native;
}
get bucket() {
return this.native?.bucket;
}
get fullPath() {
return this.native?.fullPath;
}
get name() {
return this.native?.name;
}
get parent() {
return Reference.fromNative(this.native.parent());
}
get root() {
return Reference.fromNative(this.native.root());
}
get storage() {
return Storage.fromNative(this.native.storage);
}
child(path) {
return Reference.fromNative(this.native.child(path));
}
delete() {
return new Promise((resolve, reject) => {
this.native.deleteWithCompletion((error) => {
if (error) {
reject(FirebaseError.fromNative(error));
}
else {
resolve();
}
});
});
}
getDownloadURL() {
return new Promise((resolve, reject) => {
this.native.downloadURLWithCompletion((url, error) => {
if (error) {
reject(FirebaseError.fromNative(error));
}
else {
resolve(url.absoluteString);
}
});
});
}
getMetadata() {
return new Promise((resolve, reject) => {
this.native.metadataWithCompletion((storageMetadata, error) => {
if (error) {
reject(FirebaseError.fromNative(error));
}
else {
resolve(Metadata.fromNative(storageMetadata));
}
});
});
}
list(options) {
return new Promise((resolve, reject) => {
if (options?.pageToken) {
this.native.listWithMaxResultsPageTokenCompletion(options?.maxResults ?? 1000, options.pageToken, (result, error) => {
if (error) {
reject(FirebaseError.fromNative(error));
}
else {
resolve(ListResult.fromNative(result));
}
});
}
else {
this.native.listWithMaxResultsCompletion(options?.maxResults ?? 1000, (result, error) => {
if (error) {
reject(FirebaseError.fromNative(error));
}
else {
resolve(ListResult.fromNative(result));
}
});
}
});
}
listAll() {
return new Promise((resolve, reject) => {
this.native.listAllWithCompletion((result, error) => {
if (error) {
reject(FirebaseError.fromNative(error));
}
else {
resolve(ListResult.fromNative(result));
}
});
});
}
put(data, metadata) {
if (data instanceof Blob) {
const ab = Blob.InternalAccessor.getBuffer(data).buffer.slice(0);
if (metadata) {
return Task.fromNative(this.native.putDataMetadata(NSData.dataWithData(ab), metadata.native));
}
return Task.fromNative(this.native.putData(NSData.dataWithData(ab)));
}
else if (data instanceof Uint8Array || data instanceof ArrayBuffer) {
if (metadata) {
return Task.fromNative(this.native.putDataMetadata(NSData.dataWithData(data), metadata.native));
}
return Task.fromNative(this.native.putData(NSData.dataWithData(data)));
}
}
putString(data, format, metadata) {
let nsData;
switch (format) {
case StringFormat.BASE64:
nsData = NSData.alloc().initWithBase64EncodedStringOptions(data, 1 /* NSDataBase64DecodingOptions.IgnoreUnknownCharacters */);
break;
case StringFormat.BASE64URL:
{
let base64Encoded = data.replace(/-/g, '+').replace(/_/g, '/');
while (base64Encoded.length % 4 != 0) {
base64Encoded = base64Encoded + '=';
}
nsData = NSData.alloc().initWithBase64EncodedStringOptions(data, 1 /* NSDataBase64DecodingOptions.IgnoreUnknownCharacters */);
}
break;
case StringFormat.DATA_URL: {
const base64 = b64WithoutPrefix(data);
const mime = getMIMEforBase64String(data);
const meta = metadata || new Metadata();
if (!metadata.contentType) {
meta.contentType = mime;
}
return Task.fromNative(this.native.putDataMetadata(NSData.alloc().initWithBase64EncodedStringOptions(base64, 1 /* NSDataBase64DecodingOptions.IgnoreUnknownCharacters */), meta.native));
}
default: {
const text = NSString.stringWithString(data);
const nativeData = text.dataUsingEncoding(NSUTF8StringEncoding);
const encodedString = nativeData.base64EncodedStringWithOptions(1 /* NSDataBase64EncodingOptions.Encoding64CharacterLineLength */);
nsData = NSData.alloc().initWithBase64EncodedStringOptions(encodedString, 1 /* NSDataBase64DecodingOptions.IgnoreUnknownCharacters */);
break;
}
}
if (metadata) {
return Task.fromNative(this.native.putDataMetadata(nsData, metadata.native));
}
return Task.fromNative(this.native.putData(nsData));
}
putFile(path, metadata) {
let task = null;
try {
const url = path?.startsWith?.('/') ? NSURL.fileURLWithPath(path) : NSURL.URLWithString(path);
if (metadata) {
task = Task.fromNative(this.native.putFileMetadata(url, metadata.native));
}
else {
task = Task.fromNative(this.native.putFile(url));
}
}
catch (e) { }
return task;
}
updateMetadata(metadata) {
return new Promise((resolve, reject) => {
this.native.updateMetadataCompletion(metadata.native, (metadata, error) => {
if (error) {
reject(FirebaseError.fromNative(error));
}
{
resolve(Metadata.fromNative(metadata));
}
});
});
}
writeToFile(localFilePath) {
let url;
if (localFilePath?.indexOf('file:') > -1) {
url = NSURL.URLWithString(localFilePath);
}
else {
url = NSURL.fileURLWithPath(localFilePath);
}
return Task.fromNative(this.native.writeToFile(url));
}
}
export class Storage {
constructor(app) {
if (app?.native) {
this._native = FIRStorage.storageForApp(app.native);
}
else {
if (defaultStorage) {
return defaultStorage;
}
defaultStorage = this;
this._native = FIRStorage.storage();
}
}
static fromNative(storage) {
if (storage instanceof FIRStorage) {
const store = new Storage();
store._native = storage;
return store;
}
return null;
}
useEmulator(host, port) {
this.native.useEmulatorWithHostPort(host, port);
}
ref(path) {
return Reference.fromNative(this.native.referenceWithPath(path || '/'));
}
refFromURL(url) {
return Reference.fromNative(this.native.referenceForURL(url));
}
get native() {
return this._native;
}
get ios() {
return this.native;
}
get app() {
if (!this._app) {
// @ts-ignore
this._app = FirebaseApp.fromNative(this.native.app);
}
return this._app;
}
get maxDownloadRetryTime() {
return this.native?.maxDownloadRetryTime;
}
set maxDownloadRetryTime(value) {
this.native.maxDownloadRetryTime = value;
}
get maxOperationRetryTime() {
return this.native?.maxOperationRetryTime;
}
set maxOperationRetryTime(value) {
this.native.maxOperationRetryTime = value;
}
get maxUploadRetryTime() {
return this.native?.maxUploadRetryTime;
}
set maxUploadRetryTime(value) {
this.native.maxUploadRetryTime = value;
}
}
//# sourceMappingURL=index.ios.js.map