@dereekb/dbx-firebase 12.5.8 → 12.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/modules/storagefile/container/index.mjs +2 -1
- package/esm2022/lib/modules/storagefile/container/storagefile.download.button.component.mjs +210 -0
- package/esm2022/lib/modules/storagefile/index.mjs +3 -1
- package/esm2022/lib/modules/storagefile/service/index.mjs +3 -0
- package/esm2022/lib/modules/storagefile/service/storagefile.download.service.mjs +120 -0
- package/esm2022/lib/modules/storagefile/service/storagefile.download.storage.service.mjs +89 -0
- package/esm2022/lib/modules/storagefile/storagefile.providers.mjs +33 -0
- package/esm2022/lib/modules/storagefile/store/storagefile.document.store.mjs +3 -2
- package/esm2022/lib/providers.mjs +6 -2
- package/fesm2022/dereekb-dbx-firebase.mjs +440 -7
- package/fesm2022/dereekb-dbx-firebase.mjs.map +1 -1
- package/lib/modules/storagefile/container/index.d.ts +1 -0
- package/lib/modules/storagefile/container/storagefile.download.button.component.d.ts +87 -0
- package/lib/modules/storagefile/index.d.ts +2 -0
- package/lib/modules/storagefile/service/index.d.ts +2 -0
- package/lib/modules/storagefile/service/storagefile.download.service.d.ts +48 -0
- package/lib/modules/storagefile/service/storagefile.download.storage.service.d.ts +52 -0
- package/lib/modules/storagefile/storagefile.providers.d.ts +13 -0
- package/lib/modules/storagefile/storagefile.upload.module.d.ts +1 -1
- package/lib/modules/storagefile/store/storagefile.document.store.d.ts +1 -0
- package/lib/providers.d.ts +4 -0
- package/package.json +1 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
export * from './storagefile.download.button.component';
|
|
1
2
|
export * from './storagefile.upload.action.handler.directive';
|
|
2
3
|
export * from './storagefile.upload.error';
|
|
3
4
|
export * from './storagefile.upload.handler';
|
|
4
5
|
export * from './storagefile.upload.initialize.document.directive';
|
|
5
6
|
export * from './storagefile.upload.store.directive';
|
|
6
7
|
export * from './storagefile.upload.sync.directive';
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL2NvbnRhaW5lci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsK0NBQStDLENBQUM7QUFDOUQsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLHFDQUFxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zdG9yYWdlZmlsZS5kb3dubG9hZC5idXR0b24uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLmFjdGlvbi5oYW5kbGVyLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnVwbG9hZC5lcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnVwbG9hZC5oYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLmluaXRpYWxpemUuZG9jdW1lbnQuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLnN0b3JlLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnVwbG9hZC5zeW5jLmRpcmVjdGl2ZSc7XG4iXX0=
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal } from '@angular/core';
|
|
2
|
+
import { DbxActionDialogDirective, DbxActionModule, DbxActionSnackbarErrorDirective, DbxAnchorComponent, DbxButtonComponent, DbxEmbedDialogComponent } from '@dereekb/dbx-web';
|
|
3
|
+
import { dateFromDateOrTimeNumber, isPast, MS_IN_SECOND } from '@dereekb/util';
|
|
4
|
+
import { DbxFirebaseStorageFileDownloadService } from '../service/storagefile.download.service';
|
|
5
|
+
import { toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
6
|
+
import { distinctUntilChanged, interval, map, of, shareReplay, switchMap } from 'rxjs';
|
|
7
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@dereekb/dbx-core";
|
|
10
|
+
export class DbxFirebaseStorageFileDownloadButton {
|
|
11
|
+
dbxFirebaseStorageFileDownloadService = inject(DbxFirebaseStorageFileDownloadService);
|
|
12
|
+
matDialog = inject(MatDialog);
|
|
13
|
+
/**
|
|
14
|
+
* The StorageFileKey to set up the download button for.
|
|
15
|
+
*/
|
|
16
|
+
storageFileKey = input();
|
|
17
|
+
/**
|
|
18
|
+
* The download URL to use for the download button.
|
|
19
|
+
*/
|
|
20
|
+
storageFileDownloadUrl = input();
|
|
21
|
+
/**
|
|
22
|
+
* The MIME type to use the embed component.
|
|
23
|
+
*/
|
|
24
|
+
embedMimeType = input();
|
|
25
|
+
/**
|
|
26
|
+
* Whether or not to show a preview button.
|
|
27
|
+
*
|
|
28
|
+
* Defaults to true.
|
|
29
|
+
*/
|
|
30
|
+
showPreviewButton = input(true);
|
|
31
|
+
/**
|
|
32
|
+
* Output event emitted when the download URL changes.
|
|
33
|
+
*/
|
|
34
|
+
downloadUrlChange = output();
|
|
35
|
+
config = input();
|
|
36
|
+
configSignal = computed(() => {
|
|
37
|
+
const config = this.config();
|
|
38
|
+
const result = {
|
|
39
|
+
buttonStyle: config?.buttonStyle,
|
|
40
|
+
previewButtonStyle: config?.previewButtonStyle,
|
|
41
|
+
icon: config?.icon ?? 'cloud_download',
|
|
42
|
+
text: config?.text ?? 'Start Download',
|
|
43
|
+
downloadReadyIcon: config?.downloadReadyIcon ?? 'download',
|
|
44
|
+
downloadReadyText: config?.downloadReadyText ?? 'Save File',
|
|
45
|
+
previewIcon: config?.previewIcon ?? 'preview',
|
|
46
|
+
previewText: config?.previewText ?? 'View File'
|
|
47
|
+
};
|
|
48
|
+
return result;
|
|
49
|
+
});
|
|
50
|
+
preloadSignal = computed(() => {
|
|
51
|
+
const config = this.configSignal();
|
|
52
|
+
return config.preload ?? false;
|
|
53
|
+
});
|
|
54
|
+
downloadUrlSignal = signal(undefined);
|
|
55
|
+
downloadUrlExpiresAtSignal = signal(undefined);
|
|
56
|
+
storageFileKey$ = toObservable(this.storageFileKey).pipe(distinctUntilChanged(), shareReplay(1));
|
|
57
|
+
hasDownloadUrlSignal = computed(() => Boolean(this.downloadUrlSignal()));
|
|
58
|
+
buttonStyleSignal = computed(() => {
|
|
59
|
+
const config = this.configSignal();
|
|
60
|
+
const result = {
|
|
61
|
+
type: 'raised',
|
|
62
|
+
...config.buttonStyle
|
|
63
|
+
};
|
|
64
|
+
return result;
|
|
65
|
+
});
|
|
66
|
+
previewButtonStyleSignal = computed(() => {
|
|
67
|
+
const config = this.configSignal();
|
|
68
|
+
const result = {
|
|
69
|
+
type: 'raised',
|
|
70
|
+
...config.previewButtonStyle
|
|
71
|
+
};
|
|
72
|
+
return result;
|
|
73
|
+
});
|
|
74
|
+
iconSignal = computed(() => {
|
|
75
|
+
const config = this.configSignal();
|
|
76
|
+
const hasDownloadUrl = this.hasDownloadUrlSignal();
|
|
77
|
+
return hasDownloadUrl ? (config.downloadReadyIcon ?? config.icon) : config.icon;
|
|
78
|
+
});
|
|
79
|
+
textSignal = computed(() => {
|
|
80
|
+
const config = this.configSignal();
|
|
81
|
+
const hasDownloadUrl = this.hasDownloadUrlSignal();
|
|
82
|
+
return hasDownloadUrl ? (config.downloadReadyText ?? config.text) : config.text;
|
|
83
|
+
});
|
|
84
|
+
previewIconSignal = computed(() => {
|
|
85
|
+
const config = this.configSignal();
|
|
86
|
+
return config.previewIcon;
|
|
87
|
+
});
|
|
88
|
+
previewTextSignal = computed(() => {
|
|
89
|
+
const config = this.configSignal();
|
|
90
|
+
return config.previewText;
|
|
91
|
+
});
|
|
92
|
+
anchorSignal = computed(() => {
|
|
93
|
+
const downloadUrl = this.downloadUrlSignal();
|
|
94
|
+
let result;
|
|
95
|
+
if (downloadUrl) {
|
|
96
|
+
result = {
|
|
97
|
+
url: downloadUrl
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return result;
|
|
101
|
+
});
|
|
102
|
+
storageFileDownloadUrlEffect = effect(() => {
|
|
103
|
+
const downloadUrl = this.storageFileDownloadUrl();
|
|
104
|
+
if (downloadUrl || downloadUrl === null) {
|
|
105
|
+
this.downloadUrlSignal.set(downloadUrl);
|
|
106
|
+
}
|
|
107
|
+
}, {
|
|
108
|
+
allowSignalWrites: true
|
|
109
|
+
});
|
|
110
|
+
// Preview
|
|
111
|
+
showPreviewButtonSignal = computed(() => {
|
|
112
|
+
const config = this.configSignal();
|
|
113
|
+
const hasDownloadUrl = this.hasDownloadUrlSignal();
|
|
114
|
+
return hasDownloadUrl && (config.showPreviewButton ?? true);
|
|
115
|
+
});
|
|
116
|
+
handleOpenPreviewDialog = () => {
|
|
117
|
+
const srcUrl = this.downloadUrlSignal();
|
|
118
|
+
const embedMimeType = this.embedMimeType();
|
|
119
|
+
return DbxEmbedDialogComponent.openDialog(this.matDialog, {
|
|
120
|
+
srcUrl,
|
|
121
|
+
embedMimeType,
|
|
122
|
+
sanitizeUrl: true
|
|
123
|
+
});
|
|
124
|
+
};
|
|
125
|
+
// Cached Url Effect
|
|
126
|
+
// When the key changes, check the cache to see if it is already available, and populate the download url if it is.
|
|
127
|
+
cachedUrlForStorageFileKey$ = this.storageFileKey$.pipe(switchMap((key) => (key ? this.dbxFirebaseStorageFileDownloadService.getCachedDownloadPairForStorageFile(key) : of(null))), shareReplay(1));
|
|
128
|
+
cachedUrlForStorageFileKeySignal = toSignal(this.cachedUrlForStorageFileKey$);
|
|
129
|
+
cachedUrlEffect = effect(() => {
|
|
130
|
+
const cachedPair = this.cachedUrlForStorageFileKeySignal();
|
|
131
|
+
if (cachedPair) {
|
|
132
|
+
this.downloadUrlSignal.set(cachedPair.downloadUrl);
|
|
133
|
+
this.downloadUrlExpiresAtSignal.set(cachedPair.expiresAt);
|
|
134
|
+
}
|
|
135
|
+
}, {
|
|
136
|
+
allowSignalWrites: true
|
|
137
|
+
});
|
|
138
|
+
// Expiration Effect
|
|
139
|
+
downloadUrlExpiresAt$ = toObservable(this.downloadUrlExpiresAtSignal).pipe(map(dateFromDateOrTimeNumber), distinctUntilChanged(), shareReplay(1));
|
|
140
|
+
downloadUrlHasExpired$ = this.downloadUrlExpiresAt$.pipe(switchMap((x) => {
|
|
141
|
+
let obs;
|
|
142
|
+
if (x) {
|
|
143
|
+
obs = interval(MS_IN_SECOND).pipe(map(() => isPast(x)), distinctUntilChanged(), shareReplay(1));
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
obs = of(false);
|
|
147
|
+
}
|
|
148
|
+
return obs;
|
|
149
|
+
}), distinctUntilChanged(), shareReplay(1));
|
|
150
|
+
downloadUrlHasExpiredSignal = toSignal(this.downloadUrlHasExpired$);
|
|
151
|
+
downloadUrlHasExpiredEffect = effect(() => {
|
|
152
|
+
const expired = this.downloadUrlHasExpiredSignal();
|
|
153
|
+
if (expired) {
|
|
154
|
+
this.downloadUrlSignal.set(undefined);
|
|
155
|
+
this.downloadUrlExpiresAtSignal.set(undefined);
|
|
156
|
+
}
|
|
157
|
+
}, {
|
|
158
|
+
allowSignalWrites: true
|
|
159
|
+
});
|
|
160
|
+
// Output Effect
|
|
161
|
+
downloadUrlChangeEffect = effect(() => {
|
|
162
|
+
const downloadUrl = this.downloadUrlSignal();
|
|
163
|
+
this.downloadUrlChange.emit(downloadUrl);
|
|
164
|
+
});
|
|
165
|
+
// Handlers
|
|
166
|
+
handleGetDownloadUrl = (value) => {
|
|
167
|
+
return this.dbxFirebaseStorageFileDownloadService.downloadPairForStorageFile(value);
|
|
168
|
+
};
|
|
169
|
+
handleGetDownloadUrlSuccess = (value) => {
|
|
170
|
+
this.downloadUrlSignal.set(value.downloadUrl);
|
|
171
|
+
this.downloadUrlExpiresAtSignal.set(value.expiresAt);
|
|
172
|
+
};
|
|
173
|
+
handleGetDownloadUrlError = (error) => {
|
|
174
|
+
this.downloadUrlSignal.set(undefined);
|
|
175
|
+
this.downloadUrlExpiresAtSignal.set(undefined);
|
|
176
|
+
};
|
|
177
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
178
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DbxFirebaseStorageFileDownloadButton, isStandalone: true, selector: "dbx-firebase-storagefile-download-button", inputs: { storageFileKey: { classPropertyName: "storageFileKey", publicName: "storageFileKey", isSignal: true, isRequired: false, transformFunction: null }, storageFileDownloadUrl: { classPropertyName: "storageFileDownloadUrl", publicName: "storageFileDownloadUrl", isSignal: true, isRequired: false, transformFunction: null }, embedMimeType: { classPropertyName: "embedMimeType", publicName: "embedMimeType", isSignal: true, isRequired: false, transformFunction: null }, showPreviewButton: { classPropertyName: "showPreviewButton", publicName: "showPreviewButton", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { downloadUrlChange: "downloadUrlChange" }, ngImport: i0, template: `
|
|
179
|
+
<dbx-anchor dbxActionAnchor [anchor]="anchorSignal()" dbxAction [dbxActionAutoTrigger]="preloadSignal()" dbxActionSnackbarError [dbxActionDisabled]="!storageFileKey()" [dbxActionValue]="storageFileKey" [dbxActionHandler]="handleGetDownloadUrl" [dbxActionSuccessHandler]="handleGetDownloadUrlSuccess" [dbxActionErrorHandler]="handleGetDownloadUrlError">
|
|
180
|
+
<dbx-button dbxActionButton [buttonStyle]="buttonStyleSignal()" [icon]="iconSignal()" [text]="textSignal()"></dbx-button>
|
|
181
|
+
</dbx-anchor>
|
|
182
|
+
@if (showPreviewButtonSignal()) {
|
|
183
|
+
<ng-container dbxAction [dbxActionDialog]="handleOpenPreviewDialog" dbxActionHandlerValue>
|
|
184
|
+
<span class="dbx-button-spacer"></span>
|
|
185
|
+
<dbx-button dbxActionButton [buttonStyle]="previewButtonStyleSignal()" [icon]="previewIconSignal()" [text]="previewTextSignal()"></dbx-button>
|
|
186
|
+
</ng-container>
|
|
187
|
+
}
|
|
188
|
+
`, isInline: true, dependencies: [{ kind: "component", type: DbxButtonComponent, selector: "dbx-button", inputs: ["bar", "type", "buttonStyle", "color", "spinnerColor", "customButtonColor", "customTextColor", "customSpinnerColor", "basic", "raised", "stroked", "flat", "iconOnly", "fab", "mode"] }, { kind: "ngmodule", type: DbxActionModule }, { kind: "directive", type: i1.DbxActionDirective, selector: "dbx-action,[dbxAction],dbx-action-context,[dbxActionContext]", exportAs: ["action", "dbxAction"] }, { kind: "directive", type: i1.DbxActionHandlerDirective, selector: "[dbxActionHandler]", inputs: ["dbxActionHandler"] }, { kind: "directive", type: i1.DbxActionHandlerValueDirective, selector: "[dbxActionHandlerValue]", inputs: ["dbxActionHandlerValue"] }, { kind: "directive", type: i1.DbxActionDisabledDirective, selector: "[dbxActionDisabled]", inputs: ["dbxActionDisabled"] }, { kind: "directive", type: i1.DbxActionAutoTriggerDirective, selector: "dbxActionAutoTrigger,[dbxActionAutoTrigger]", inputs: ["triggerDebounce", "triggerThrottle", "triggerErrorThrottle", "maxErrorsForThrottle", "triggerLimit", "dbxActionAutoTrigger", "useFastTriggerPreset", "useInstantTriggerPreset"] }, { kind: "directive", type: i1.DbxActionValueDirective, selector: "dbxActionValue,[dbxActionValue]", inputs: ["dbxActionValue"] }, { kind: "directive", type: i1.DbxActionSuccessHandlerDirective, selector: "[dbxActionSuccessHandler]", inputs: ["dbxActionSuccessHandler"] }, { kind: "directive", type: i1.DbxActionErrorHandlerDirective, selector: "[dbxActionErrorHandler]", inputs: ["dbxActionErrorHandler"] }, { kind: "directive", type: i1.DbxActionButtonDirective, selector: "[dbxActionButton]" }, { kind: "directive", type: DbxActionSnackbarErrorDirective, selector: "[dbxActionSnackbarError]", inputs: ["dbxActionSnackbarError"] }, { kind: "directive", type: DbxActionDialogDirective, selector: "[dbxActionDialog]", inputs: ["dbxActionDialog", "dbxActionDialogIsModified", "dbxActionDialogIsEqual"], exportAs: ["dbxActionDialog"] }, { kind: "component", type: DbxAnchorComponent, selector: "dbx-anchor, [dbx-anchor]", inputs: ["block"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
189
|
+
}
|
|
190
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadButton, decorators: [{
|
|
191
|
+
type: Component,
|
|
192
|
+
args: [{
|
|
193
|
+
selector: 'dbx-firebase-storagefile-download-button',
|
|
194
|
+
template: `
|
|
195
|
+
<dbx-anchor dbxActionAnchor [anchor]="anchorSignal()" dbxAction [dbxActionAutoTrigger]="preloadSignal()" dbxActionSnackbarError [dbxActionDisabled]="!storageFileKey()" [dbxActionValue]="storageFileKey" [dbxActionHandler]="handleGetDownloadUrl" [dbxActionSuccessHandler]="handleGetDownloadUrlSuccess" [dbxActionErrorHandler]="handleGetDownloadUrlError">
|
|
196
|
+
<dbx-button dbxActionButton [buttonStyle]="buttonStyleSignal()" [icon]="iconSignal()" [text]="textSignal()"></dbx-button>
|
|
197
|
+
</dbx-anchor>
|
|
198
|
+
@if (showPreviewButtonSignal()) {
|
|
199
|
+
<ng-container dbxAction [dbxActionDialog]="handleOpenPreviewDialog" dbxActionHandlerValue>
|
|
200
|
+
<span class="dbx-button-spacer"></span>
|
|
201
|
+
<dbx-button dbxActionButton [buttonStyle]="previewButtonStyleSignal()" [icon]="previewIconSignal()" [text]="previewTextSignal()"></dbx-button>
|
|
202
|
+
</ng-container>
|
|
203
|
+
}
|
|
204
|
+
`,
|
|
205
|
+
imports: [DbxButtonComponent, DbxActionModule, DbxActionSnackbarErrorDirective, DbxActionDialogDirective, DbxAnchorComponent],
|
|
206
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
207
|
+
standalone: true
|
|
208
|
+
}]
|
|
209
|
+
}] });
|
|
210
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUuZG93bmxvYWQuYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1maXJlYmFzZS9zcmMvbGliL21vZHVsZXMvc3RvcmFnZWZpbGUvY29udGFpbmVyL3N0b3JhZ2VmaWxlLmRvd25sb2FkLmJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsd0JBQXdCLEVBQTJCLGVBQWUsRUFBRSwrQkFBK0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBa0IsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV4TixPQUFPLEVBQXVCLHdCQUF3QixFQUF3QixNQUFNLEVBQVMsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pJLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBR2hHLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbkcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7QUF5Q3JELE1BQU0sT0FBTyxvQ0FBb0M7SUFDdEMscUNBQXFDLEdBQUcsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDdEYsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV2Qzs7T0FFRztJQUNNLGNBQWMsR0FBRyxLQUFL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QztRQUN0QyxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQzt3R0F0T1Msb0NBQW9DOzRGQUFwQyxvQ0FBb0MsMDRCQWZyQzs7Ozs7Ozs7OztHQVVULDREQUNTLGtCQUFrQixzUEFBRSxlQUFlLGkyQ0FBRSwrQkFBK0IseUdBQUUsd0JBQXdCLGlMQUFFLGtCQUFrQjs7NEZBSWpILG9DQUFvQztrQkFqQmhELFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDBDQUEwQztvQkFDcEQsUUFBUSxFQUFFOzs7Ozs7Ozs7O0dBVVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLCtCQUErQixFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixDQUFDO29CQUM3SCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERieEFjdGlvbkRpYWxvZ0RpcmVjdGl2ZSwgRGJ4QWN0aW9uRGlhbG9nRnVuY3Rpb24sIERieEFjdGlvbk1vZHVsZSwgRGJ4QWN0aW9uU25hY2tiYXJFcnJvckRpcmVjdGl2ZSwgRGJ4QW5jaG9yQ29tcG9uZW50LCBEYnhCdXR0b25Db21wb25lbnQsIERieEJ1dHRvblN0eWxlLCBEYnhFbWJlZERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJ0BkZXJlZWtiL2RieC13ZWInO1xuaW1wb3J0IHsgU3RvcmFnZUZpbGVLZXksIFN0b3JhZ2VGaWxlUHVibGljRG93bmxvYWRVcmwsIFN0b3JhZ2VGaWxlU2lnbmVkRG93bmxvYWRVcmwgfSBmcm9tICdAZGVyZWVrYi9maXJlYmFzZSc7XG5pbXBvcnQgeyBDb250ZW50VHlwZU1pbWVUeXBlLCBkYXRlRnJvbURhdGVPclRpbWVOdW1iZXIsIERhdGVPclVuaXhUaW1lTnVtYmVyLCBpc1Bhc3QsIE1heWJlLCBNU19JTl9TRUNPTkQgfSBmcm9tICdAZGVyZWVrYi91dGlsJztcbmltcG9ydCB7IERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL3N0b3JhZ2VmaWxlLmRvd25sb2FkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2xpY2thYmxlQW5jaG9yIH0gZnJvbSAnQGRlcmVla2IvZGJ4LWNvcmUnO1xuaW1wb3J0IHsgV29ya1VzaW5nT2JzZXJ2YWJsZSB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlLCB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBpbnRlcnZhbCwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpciB9IGZyb20gJy4uL3NlcnZpY2Uvc3RvcmFnZWZpbGUuZG93bmxvYWQuc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZEJ1dHRvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRCdXR0b25Db25maWcge1xuICByZWFkb25seSBidXR0b25TdHlsZT86IE1heWJlPERieEJ1dHRvblN0eWxlPjtcbiAgcmVhZG9ubHkgcHJldmlld0J1dHRvblN0eWxlPzogTWF5YmU8RGJ4QnV0dG9uU3R5bGU+O1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gcHJlLWxvYWQgdGhlIGRvd25sb2FkIHVybCBmcm9tIHRoZSBzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBwcmVsb2FkPzogTWF5YmU8Ym9vbGVhbj47XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzaG93IGEgcHJldmlldyBidXR0b24uXG4gICAqL1xuICByZWFkb25seSBzaG93UHJldmlld0J1dHRvbj86IE1heWJlPGJvb2xlYW4+O1xuICByZWFkb25seSBpY29uPzogTWF5YmU8c3RyaW5nPjtcbiAgcmVhZG9ubHkgdGV4dD86IE1heWJlPHN0cmluZz47XG4gIHJlYWRvbmx5IGRvd25sb2FkUmVhZHlJY29uPzogTWF5YmU8c3RyaW5nPjtcbiAgcmVhZG9ubHkgZG93bmxvYWRSZWFkeVRleHQ/OiBNYXliZTxzdHJpbmc+O1xuICByZWFkb25seSBwcmV2aWV3SWNvbj86IE1heWJlPHN0cmluZz47XG4gIHJlYWRvbmx5IHByZXZpZXdUZXh0PzogTWF5YmU8c3RyaW5nPjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGJ4LWZpcmViYXNlLXN0b3JhZ2VmaWxlLWRvd25sb2FkLWJ1dHRvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRieC1hbmNob3IgZGJ4QWN0aW9uQW5jaG9yIFthbmNob3JdPVwiYW5jaG9yU2lnbmFsKClcIiBkYnhBY3Rpb24gW2RieEFjdGlvbkF1dG9UcmlnZ2VyXT1cInByZWxvYWRTaWduYWwoKVwiIGRieEFjdGlvblNuYWNrYmFyRXJyb3IgW2RieEFjdGlvbkRpc2FibGVkXT1cIiFzdG9yYWdlRmlsZUtleSgpXCIgW2RieEFjdGlvblZhbHVlXT1cInN0b3JhZ2VGaWxlS2V5XCIgW2RieEFjdGlvbkhhbmRsZXJdPVwiaGFuZGxlR2V0RG93bmxvYWRVcmxcIiBbZGJ4QWN0aW9uU3VjY2Vzc0hhbmRsZXJdPVwiaGFuZGxlR2V0RG93bmxvYWRVcmxTdWNjZXNzXCIgW2RieEFjdGlvbkVycm9ySGFuZGxlcl09XCJoYW5kbGVHZXREb3dubG9hZFVybEVycm9yXCI+XG4gICAgICA8ZGJ4LWJ1dHRvbiBkYnhBY3Rpb25CdXR0b24gW2J1dHRvblN0eWxlXT1cImJ1dHRvblN0eWxlU2lnbmFsKClcIiBbaWNvbl09XCJpY29uU2lnbmFsKClcIiBbdGV4dF09XCJ0ZXh0U2lnbmFsKClcIj48L2RieC1idXR0b24+XG4gICAgPC9kYngtYW5jaG9yPlxuICAgIEBpZiAoc2hvd1ByZXZpZXdCdXR0b25TaWduYWwoKSkge1xuICAgICAgPG5nLWNvbnRhaW5lciBkYnhBY3Rpb24gW2RieEFjdGlvbkRpYWxvZ109XCJoYW5kbGVPcGVuUHJldmlld0RpYWxvZ1wiIGRieEFjdGlvbkhhbmRsZXJWYWx1ZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkYngtYnV0dG9uLXNwYWNlclwiPjwvc3Bhbj5cbiAgICAgICAgPGRieC1idXR0b24gZGJ4QWN0aW9uQnV0dG9uIFtidXR0b25TdHlsZV09XCJwcmV2aWV3QnV0dG9uU3R5bGVTaWduYWwoKVwiIFtpY29uXT1cInByZXZpZXdJY29uU2lnbmFsKClcIiBbdGV4dF09XCJwcmV2aWV3VGV4dFNpZ25hbCgpXCI+PC9kYngtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgfVxuICBgLFxuICBpbXBvcnRzOiBbRGJ4QnV0dG9uQ29tcG9uZW50LCBEYnhBY3Rpb25Nb2R1bGUsIERieEFjdGlvblNuYWNrYmFyRXJyb3JEaXJlY3RpdmUsIERieEFjdGlvbkRpYWxvZ0RpcmVjdGl2ZSwgRGJ4QW5jaG9yQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkQnV0dG9uIHtcbiAgcmVhZG9ubHkgZGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZSA9IGluamVjdChEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgbWF0RGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG5cbiAgLyoqXG4gICAqIFRoZSBTdG9yYWdlRmlsZUtleSB0byBzZXQgdXAgdGhlIGRvd25sb2FkIGJ1dHRvbiBmb3IuXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlRmlsZUtleSA9IGlucHV0PE1heWJlPFN0b3JhZ2VGaWxlS2V5Pj4oKTtcblxuICAvKipcbiAgICogVGhlIGRvd25sb2FkIFVSTCB0byB1c2UgZm9yIHRoZSBkb3dubG9hZCBidXR0b24uXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlRmlsZURvd25sb2FkVXJsID0gaW5wdXQ8TWF5YmU8U3RvcmFnZUZpbGVTaWduZWREb3dubG9hZFVybCB8IFN0b3JhZ2VGaWxlUHVibGljRG93bmxvYWRVcmw+PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgTUlNRSB0eXBlIHRvIHVzZSB0aGUgZW1iZWQgY29tcG9uZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgZW1iZWRNaW1lVHlwZSA9IGlucHV0PE1heWJlPENvbnRlbnRUeXBlTWltZVR5cGUgfCBzdHJpbmc+PigpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzaG93IGEgcHJldmlldyBidXR0b24uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICByZWFkb25seSBzaG93UHJldmlld0J1dHRvbiA9IGlucHV0PE1heWJlPGJvb2xlYW4+Pih0cnVlKTtcblxuICAvKipcbiAgICogT3V0cHV0IGV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZG93bmxvYWQgVVJMIGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSBkb3dubG9hZFVybENoYW5nZSA9IG91dHB1dDxNYXliZTxTdG9yYWdlRmlsZVNpZ25lZERvd25sb2FkVXJsPj4oKTtcblxuICByZWFkb25seSBjb25maWcgPSBpbnB1dDxNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRCdXR0b25Db25maWc+PigpO1xuXG4gIHJlYWRvbmx5IGNvbmZpZ1NpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZygpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRCdXR0b25Db25maWcgPSB7XG4gICAgICBidXR0b25TdHlsZTogY29uZmlnPy5idXR0b25TdHlsZSxcbiAgICAgIHByZXZpZXdCdXR0b25TdHlsZTogY29uZmlnPy5wcmV2aWV3QnV0dG9uU3R5bGUsXG4gICAgICBpY29uOiBjb25maWc/Lmljb24gPz8gJ2Nsb3VkX2Rvd25sb2FkJyxcbiAgICAgIHRleHQ6IGNvbmZpZz8udGV4dCA/PyAnU3RhcnQgRG93bmxvYWQnLFxuICAgICAgZG93bmxvYWRSZWFkeUljb246IGNvbmZpZz8uZG93bmxvYWRSZWFkeUljb24gPz8gJ2Rvd25sb2FkJyxcbiAgICAgIGRvd25sb2FkUmVhZHlUZXh0OiBjb25maWc/LmRvd25sb2FkUmVhZHlUZXh0ID8/ICdTYXZlIEZpbGUnLFxuICAgICAgcHJldmlld0ljb246IGNvbmZpZz8ucHJldmlld0ljb24gPz8gJ3ByZXZpZXcnLFxuICAgICAgcHJldmlld1RleHQ6IGNvbmZpZz8ucHJldmlld1RleHQgPz8gJ1ZpZXcgRmlsZSdcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcHJlbG9hZFNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1NpZ25hbCgpO1xuICAgIHJldHVybiBjb25maWcucHJlbG9hZCA/PyBmYWxzZTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZG93bmxvYWRVcmxTaWduYWwgPSBzaWduYWw8TWF5YmU8U3RvcmFnZUZpbGVTaWduZWREb3dubG9hZFVybD4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsID0gc2lnbmFsPE1heWJlPERhdGVPclVuaXhUaW1lTnVtYmVyPj4odW5kZWZpbmVkKTtcblxuICByZWFkb25seSBzdG9yYWdlRmlsZUtleSQgPSB0b09ic2VydmFibGUodGhpcy5zdG9yYWdlRmlsZUtleSkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgaGFzRG93bmxvYWRVcmxTaWduYWwgPSBjb21wdXRlZCgoKSA9PiBCb29sZWFuKHRoaXMuZG93bmxvYWRVcmxTaWduYWwoKSkpO1xuXG4gIHJlYWRvbmx5IGJ1dHRvblN0eWxlU2lnbmFsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnU2lnbmFsKCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IERieEJ1dHRvblN0eWxlID0ge1xuICAgICAgdHlwZTogJ3JhaXNlZCcsXG4gICAgICAuLi5jb25maWcuYnV0dG9uU3R5bGVcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcHJldmlld0J1dHRvblN0eWxlU2lnbmFsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnU2lnbmFsKCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IERieEJ1dHRvblN0eWxlID0ge1xuICAgICAgdHlwZTogJ3JhaXNlZCcsXG4gICAgICAuLi5jb25maWcucHJldmlld0J1dHRvblN0eWxlXG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGljb25TaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTaWduYWwoKTtcbiAgICBjb25zdCBoYXNEb3dubG9hZFVybCA9IHRoaXMuaGFzRG93bmxvYWRVcmxTaWduYWwoKTtcbiAgICByZXR1cm4gaGFzRG93bmxvYWRVcmwgPyAoY29uZmlnLmRvd25sb2FkUmVhZHlJY29uID8/IGNvbmZpZy5pY29uKSA6IGNvbmZpZy5pY29uO1xuICB9KTtcblxuICByZWFkb25seSB0ZXh0U2lnbmFsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnU2lnbmFsKCk7XG4gICAgY29uc3QgaGFzRG93bmxvYWRVcmwgPSB0aGlzLmhhc0Rvd25sb2FkVXJsU2lnbmFsKCk7XG4gICAgcmV0dXJuIGhhc0Rvd25sb2FkVXJsID8gKGNvbmZpZy5kb3dubG9hZFJlYWR5VGV4dCA/PyBjb25maWcudGV4dCkgOiBjb25maWcudGV4dDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcHJldmlld0ljb25TaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTaWduYWwoKTtcbiAgICByZXR1cm4gY29uZmlnLnByZXZpZXdJY29uO1xuICB9KTtcblxuICByZWFkb25seSBwcmV2aWV3VGV4dFNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1NpZ25hbCgpO1xuICAgIHJldHVybiBjb25maWcucHJldmlld1RleHQ7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFuY2hvclNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBkb3dubG9hZFVybCA9IHRoaXMuZG93bmxvYWRVcmxTaWduYWwoKTtcblxuICAgIGxldCByZXN1bHQ6IE1heWJlPENsaWNrYWJsZUFuY2hvcj47XG5cbiAgICBpZiAoZG93bmxvYWRVcmwpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgdXJsOiBkb3dubG9hZFVybFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcblxuICByZWFkb25seSBzdG9yYWdlRmlsZURvd25sb2FkVXJsRWZmZWN0ID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGRvd25sb2FkVXJsID0gdGhpcy5zdG9yYWdlRmlsZURvd25sb2FkVXJsKCk7XG5cbiAgICAgIGlmIChkb3dubG9hZFVybCB8fCBkb3dubG9hZFVybCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRvd25sb2FkVXJsU2lnbmFsLnNldChkb3dubG9hZFVybCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZVxuICAgIH1cbiAgKTtcblxuICAvLyBQcmV2aWV3XG4gIHJlYWRvbmx5IHNob3dQcmV2aWV3QnV0dG9uU2lnbmFsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnU2lnbmFsKCk7XG4gICAgY29uc3QgaGFzRG93bmxvYWRVcmwgPSB0aGlzLmhhc0Rvd25sb2FkVXJsU2lnbmFsKCk7XG4gICAgcmV0dXJuIGhhc0Rvd25sb2FkVXJsICYmIChjb25maWcuc2hvd1ByZXZpZXdCdXR0b24gPz8gdHJ1ZSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhhbmRsZU9wZW5QcmV2aWV3RGlhbG9nOiBEYnhBY3Rpb25EaWFsb2dGdW5jdGlvbiA9ICgpID0+IHtcbiAgICBjb25zdCBzcmNVcmwgPSB0aGlzLmRvd25sb2FkVXJsU2lnbmFsKCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGVtYmVkTWltZVR5cGUgPSB0aGlzLmVtYmVkTWltZVR5cGUoKTtcblxuICAgIHJldHVybiBEYnhFbWJlZERpYWxvZ0NvbXBvbmVudC5vcGVuRGlhbG9nKHRoaXMubWF0RGlhbG9nLCB7XG4gICAgICBzcmNVcmwsXG4gICAgICBlbWJlZE1pbWVUeXBlLFxuICAgICAgc2FuaXRpemVVcmw6IHRydWVcbiAgICB9KTtcbiAgfTtcblxuICAvLyBDYWNoZWQgVXJsIEVmZmVjdFxuICAvLyBXaGVuIHRoZSBrZXkgY2hhbmdlcywgY2hlY2sgdGhlIGNhY2hlIHRvIHNlZSBpZiBpdCBpcyBhbHJlYWR5IGF2YWlsYWJsZSwgYW5kIHBvcHVsYXRlIHRoZSBkb3dubG9hZCB1cmwgaWYgaXQgaXMuXG4gIHJlYWRvbmx5IGNhY2hlZFVybEZvclN0b3JhZ2VGaWxlS2V5JCA9IHRoaXMuc3RvcmFnZUZpbGVLZXkkLnBpcGUoXG4gICAgc3dpdGNoTWFwKChrZXkpID0+IChrZXkgPyB0aGlzLmRieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2UuZ2V0Q2FjaGVkRG93bmxvYWRQYWlyRm9yU3RvcmFnZUZpbGUoa2V5KSA6IG9mKG51bGwpKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbiAgcmVhZG9ubHkgY2FjaGVkVXJsRm9yU3RvcmFnZUZpbGVLZXlTaWduYWwgPSB0b1NpZ25hbCh0aGlzLmNhY2hlZFVybEZvclN0b3JhZ2VGaWxlS2V5JCk7XG5cbiAgcmVhZG9ubHkgY2FjaGVkVXJsRWZmZWN0ID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlZFBhaXIgPSB0aGlzLmNhY2hlZFVybEZvclN0b3JhZ2VGaWxlS2V5U2lnbmFsKCk7XG5cbiAgICAgIGlmIChjYWNoZWRQYWlyKSB7XG4gICAgICAgIHRoaXMuZG93bmxvYWRVcmxTaWduYWwuc2V0KGNhY2hlZFBhaXIuZG93bmxvYWRVcmwpO1xuICAgICAgICB0aGlzLmRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsLnNldChjYWNoZWRQYWlyLmV4cGlyZXNBdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZVxuICAgIH1cbiAgKTtcblxuICAvLyBFeHBpcmF0aW9uIEVmZmVjdFxuICByZWFkb25seSBkb3dubG9hZFVybEV4cGlyZXNBdCQgPSB0b09ic2VydmFibGUodGhpcy5kb3dubG9hZFVybEV4cGlyZXNBdFNpZ25hbCkucGlwZShtYXAoZGF0ZUZyb21EYXRlT3JUaW1lTnVtYmVyKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGRvd25sb2FkVXJsSGFzRXhwaXJlZCQgPSB0aGlzLmRvd25sb2FkVXJsRXhwaXJlc0F0JC5waXBlKFxuICAgIHN3aXRjaE1hcCgoeCkgPT4ge1xuICAgICAgbGV0IG9iczogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgICAgaWYgKHgpIHtcbiAgICAgICAgb2JzID0gaW50ZXJ2YWwoTVNfSU5fU0VDT05EKS5waXBlKFxuICAgICAgICAgIG1hcCgoKSA9PiBpc1Bhc3QoeCkpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9icyA9IG9mKGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9icztcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZG93bmxvYWRVcmxIYXNFeHBpcmVkU2lnbmFsID0gdG9TaWduYWwodGhpcy5kb3dubG9hZFVybEhhc0V4cGlyZWQkKTtcbiAgcmVhZG9ubHkgZG93bmxvYWRVcmxIYXNFeHBpcmVkRWZmZWN0ID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGV4cGlyZWQgPSB0aGlzLmRvd25sb2FkVXJsSGFzRXhwaXJlZFNpZ25hbCgpO1xuXG4gICAgICBpZiAoZXhwaXJlZCkge1xuICAgICAgICB0aGlzLmRvd25sb2FkVXJsU2lnbmFsLnNldCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsLnNldCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgYWxsb3dTaWduYWxXcml0ZXM6IHRydWVcbiAgICB9XG4gICk7XG5cbiAgLy8gT3V0cHV0IEVmZmVjdFxuICByZWFkb25seSBkb3dubG9hZFVybENoYW5nZUVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZG93bmxvYWRVcmwgPSB0aGlzLmRvd25sb2FkVXJsU2lnbmFsKCk7XG4gICAgdGhpcy5kb3dubG9hZFVybENoYW5nZS5lbWl0KGRvd25sb2FkVXJsKTtcbiAgfSk7XG5cbiAgLy8gSGFuZGxlcnNcbiAgcmVhZG9ubHkgaGFuZGxlR2V0RG93bmxvYWRVcmw6IFdvcmtVc2luZ09ic2VydmFibGU8U3RvcmFnZUZpbGVLZXksIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+ID0gKHZhbHVlOiBTdG9yYWdlRmlsZUtleSkgPT4ge1xuICAgIHJldHVybiB0aGlzLmRieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2UuZG93bmxvYWRQYWlyRm9yU3RvcmFnZUZpbGUodmFsdWUpO1xuICB9O1xuXG4gIHJlYWRvbmx5IGhhbmRsZUdldERvd25sb2FkVXJsU3VjY2VzcyA9ICh2YWx1ZTogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpcikgPT4ge1xuICAgIHRoaXMuZG93bmxvYWRVcmxTaWduYWwuc2V0KHZhbHVlLmRvd25sb2FkVXJsKTtcbiAgICB0aGlzLmRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsLnNldCh2YWx1ZS5leHBpcmVzQXQpO1xuICB9O1xuXG4gIHJlYWRvbmx5IGhhbmRsZUdldERvd25sb2FkVXJsRXJyb3IgPSAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICB0aGlzLmRvd25sb2FkVXJsU2lnbmFsLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMuZG93bmxvYWRVcmxFeHBpcmVzQXRTaWduYWwuc2V0KHVuZGVmaW5lZCk7XG4gIH07XG59XG4iXX0=
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export * from './container';
|
|
2
2
|
export * from './store';
|
|
3
|
+
export * from './service';
|
|
3
4
|
export * from './storagefile.upload.module';
|
|
4
|
-
|
|
5
|
+
export * from './storagefile.providers';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29udGFpbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnByb3ZpZGVycyc7XG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './storagefile.download.service';
|
|
2
|
+
export * from './storagefile.download.storage.service';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL3NlcnZpY2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHdDQUF3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zdG9yYWdlZmlsZS5kb3dubG9hZC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUuZG93bmxvYWQuc3RvcmFnZS5zZXJ2aWNlJztcbiJdfQ==
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { StorageFileFunctions, firestoreModelId, firestoreModelKey, storageFileIdentity } from '@dereekb/firebase';
|
|
3
|
+
import { addMilliseconds, MS_IN_DAY, MS_IN_HOUR, MS_IN_MINUTE, SECONDS_IN_MINUTE, unixTimeNumberForNow, unixTimeNumberFromDate } from '@dereekb/util';
|
|
4
|
+
import { DbxFirebaseStorageFileDownloadStorage } from './storagefile.download.storage.service';
|
|
5
|
+
import { distinctUntilChanged, filter, first, from, interval, map, of, shareReplay, startWith, switchMap, tap } from 'rxjs';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* Service used for retrieving download links for StorageFiles.
|
|
9
|
+
*/
|
|
10
|
+
export class DbxFirebaseStorageFileDownloadService {
|
|
11
|
+
/**
|
|
12
|
+
* Expiration duration for cached download URLs.
|
|
13
|
+
*/
|
|
14
|
+
_expiresAfterTime = 3 * MS_IN_DAY;
|
|
15
|
+
/**
|
|
16
|
+
* When reading cached values, this buffer is added to the expiration time to prevent the URL from expiring while it is being used.
|
|
17
|
+
*/
|
|
18
|
+
_expiresAfterTimeBuffer = SECONDS_IN_MINUTE * 10;
|
|
19
|
+
storageFileFunctions = inject(StorageFileFunctions);
|
|
20
|
+
storageFileDownloadStorage = inject(DbxFirebaseStorageFileDownloadStorage);
|
|
21
|
+
// MARK: Config
|
|
22
|
+
getExpiresAfterTime() {
|
|
23
|
+
return this._expiresAfterTime;
|
|
24
|
+
}
|
|
25
|
+
setExpiresAfterTime(expiresAfter) {
|
|
26
|
+
const maxAllowed = MS_IN_DAY * 20;
|
|
27
|
+
if (expiresAfter > maxAllowed) {
|
|
28
|
+
throw new Error(`Expires after time cannot be greater than 20 days.`);
|
|
29
|
+
}
|
|
30
|
+
else if (expiresAfter < MS_IN_HOUR) {
|
|
31
|
+
throw new Error(`Expires after time cannot be less than 1 hour.`);
|
|
32
|
+
}
|
|
33
|
+
this._expiresAfterTime = expiresAfter;
|
|
34
|
+
}
|
|
35
|
+
// MARK: Download
|
|
36
|
+
/**
|
|
37
|
+
* Returns an observable that returns the cached download URL pair for the StorageFile, and emits null once it expires.
|
|
38
|
+
*
|
|
39
|
+
* @param storageFileIdOrKey
|
|
40
|
+
* @returns
|
|
41
|
+
*/
|
|
42
|
+
getCachedDownloadPairForStorageFile(storageFileIdOrKey) {
|
|
43
|
+
const storageFileId = firestoreModelId(storageFileIdOrKey);
|
|
44
|
+
return this.storageFileDownloadStorage.getDownloadUrlPair(storageFileId).pipe(switchMap((pair) => {
|
|
45
|
+
let result;
|
|
46
|
+
if (pair) {
|
|
47
|
+
const expiresAt = pair.expiresAt - this._expiresAfterTimeBuffer;
|
|
48
|
+
// every minute emit the result again
|
|
49
|
+
result = interval(MS_IN_MINUTE)
|
|
50
|
+
.pipe(map(() => {
|
|
51
|
+
const now = unixTimeNumberForNow();
|
|
52
|
+
const isExpired = now > expiresAt;
|
|
53
|
+
return isExpired ? null : pair; // emit null once expired
|
|
54
|
+
}))
|
|
55
|
+
.pipe(filter((x) => x == null), first(), startWith(pair), distinctUntilChanged(), shareReplay(1));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
result = of(null);
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Retrieves the download URL for the StorageFile using the default parameters.
|
|
65
|
+
*
|
|
66
|
+
* These URLs are cached locally to prevent extra/redundant calls to the server.
|
|
67
|
+
*
|
|
68
|
+
* @param storageFileIdOrKey
|
|
69
|
+
* @returns
|
|
70
|
+
*/
|
|
71
|
+
downloadPairForStorageFile(storageFileIdOrKey) {
|
|
72
|
+
const storageFileId = firestoreModelId(storageFileIdOrKey);
|
|
73
|
+
const obs = this.getCachedDownloadPairForStorageFile(storageFileId).pipe(switchMap((cachedPair) => {
|
|
74
|
+
let result;
|
|
75
|
+
const downloadAndCacheResult = () => {
|
|
76
|
+
const expiresAt = addMilliseconds(new Date(), this._expiresAfterTime);
|
|
77
|
+
return from(this.createDownloadPairForStorageFile(storageFileIdOrKey, { expiresAt })).pipe(tap((downloadUrlPair) => {
|
|
78
|
+
// add to the cache
|
|
79
|
+
this.storageFileDownloadStorage.addDownloadUrl(downloadUrlPair).pipe(first()).subscribe();
|
|
80
|
+
}));
|
|
81
|
+
};
|
|
82
|
+
if (cachedPair) {
|
|
83
|
+
result = of(cachedPair);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
result = downloadAndCacheResult();
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}), first(), shareReplay(1));
|
|
90
|
+
return obs;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Creates a new download URL for the StorageFile.
|
|
94
|
+
*
|
|
95
|
+
* @param storageFileIdOrKey
|
|
96
|
+
* @param inputParams
|
|
97
|
+
* @returns
|
|
98
|
+
*/
|
|
99
|
+
createDownloadPairForStorageFile(storageFileIdOrKey, inputParams) {
|
|
100
|
+
const storageFileId = firestoreModelId(storageFileIdOrKey);
|
|
101
|
+
const expiresAt = inputParams?.expiresAt ?? addMilliseconds(new Date(), this._expiresAfterTime);
|
|
102
|
+
const params = {
|
|
103
|
+
...inputParams,
|
|
104
|
+
key: firestoreModelKey(storageFileIdentity, storageFileId)
|
|
105
|
+
};
|
|
106
|
+
return this.storageFileFunctions.storageFile.readStorageFile.download(params).then((x) => {
|
|
107
|
+
return {
|
|
108
|
+
id: storageFileId,
|
|
109
|
+
downloadUrl: x.url,
|
|
110
|
+
expiresAt: unixTimeNumberFromDate(expiresAt)
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
115
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadService });
|
|
116
|
+
}
|
|
117
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadService, decorators: [{
|
|
118
|
+
type: Injectable
|
|
119
|
+
}] });
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUuZG93bmxvYWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1maXJlYmFzZS9zcmMvbGliL21vZHVsZXMvc3RvcmFnZWZpbGUvc2VydmljZS9zdG9yYWdlZmlsZS5kb3dubG9hZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBNEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3SyxPQUFPLEVBQUUsZUFBZSxFQUF1QixTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBVyxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwTCxPQUFPLEVBQUUscUNBQXFDLEVBQXlDLE1BQU0sd0NBQXdDLENBQUM7QUFDdEksT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFFeEk7O0dBRUc7QUFFSCxNQUFNLE9BQU8scUNBQXFDO0lBQ2hEOztPQUVHO0lBQ08saUJBQWlCLEdBQWlCLENBQUMsR0FBRyxTQUFTLENBQUM7SUFFMUQ7O09BRUc7SUFDTyx1QkFBdUIsR0FBWSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFFM0Qsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDcEQsMEJBQTBCLEdBQUcsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFFcEYsZUFBZTtJQUNmLG1CQUFtQjtR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amVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JhZ2VGaWxlRnVuY3Rpb25zLCBEb3dubG9hZFN0b3JhZ2VGaWxlUGFyYW1zLCBTdG9yYWdlRmlsZUtleSwgU3RvcmFnZUZpbGVJZCwgZmlyZXN0b3JlTW9kZWxJZCwgZmlyZXN0b3JlTW9kZWxLZXksIHN0b3JhZ2VGaWxlSWRlbnRpdHkgfSBmcm9tICdAZGVyZWVrYi9maXJlYmFzZSc7XG5pbXBvcnQgeyBhZGRNaWxsaXNlY29uZHMsIE1heWJlLCBNaWxsaXNlY29uZHMsIE1TX0lOX0RBWSwgTVNfSU5fSE9VUiwgTVNfSU5fTUlOVVRFLCBTZWNvbmRzLCBTRUNPTkRTX0lOX01JTlVURSwgdW5peFRpbWVOdW1iZXJGb3JOb3csIHVuaXhUaW1lTnVtYmVyRnJvbURhdGUgfSBmcm9tICdAZGVyZWVrYi91dGlsJztcbmltcG9ydCB7IERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFN0b3JhZ2UsIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXIgfSBmcm9tICcuL3N0b3JhZ2VmaWxlLmRvd25sb2FkLnN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBmaXJzdCwgZnJvbSwgaW50ZXJ2YWwsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogU2VydmljZSB1c2VkIGZvciByZXRyaWV2aW5nIGRvd25sb2FkIGxpbmtzIGZvciBTdG9yYWdlRmlsZXMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEV4cGlyYXRpb24gZHVyYXRpb24gZm9yIGNhY2hlZCBkb3dubG9hZCBVUkxzLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9leHBpcmVzQWZ0ZXJUaW1lOiBNaWxsaXNlY29uZHMgPSAzICogTVNfSU5fREFZO1xuXG4gIC8qKlxuICAgKiBXaGVuIHJlYWRpbmcgY2FjaGVkIHZhbHVlcywgdGhpcyBidWZmZXIgaXMgYWRkZWQgdG8gdGhlIGV4cGlyYXRpb24gdGltZSB0byBwcmV2ZW50IHRoZSBVUkwgZnJvbSBleHBpcmluZyB3aGlsZSBpdCBpcyBiZWluZyB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9leHBpcmVzQWZ0ZXJUaW1lQnVmZmVyOiBTZWNvbmRzID0gU0VDT05EU19JTl9NSU5VVEUgKiAxMDtcblxuICByZWFkb25seSBzdG9yYWdlRmlsZUZ1bmN0aW9ucyA9IGluamVjdChTdG9yYWdlRmlsZUZ1bmN0aW9ucyk7XG4gIHJlYWRvbmx5IHN0b3JhZ2VGaWxlRG93bmxvYWRTdG9yYWdlID0gaW5qZWN0KERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFN0b3JhZ2UpO1xuXG4gIC8vIE1BUks6IENvbmZpZ1xuICBnZXRFeHBpcmVzQWZ0ZXJUaW1lKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2V4cGlyZXNBZnRlclRpbWU7XG4gIH1cblxuICBzZXRFeHBpcmVzQWZ0ZXJUaW1lKGV4cGlyZXNBZnRlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbWF4QWxsb3dlZCA9IE1TX0lOX0RBWSAqIDIwO1xuXG4gICAgaWYgKGV4cGlyZXNBZnRlciA+IG1heEFsbG93ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwaXJlcyBhZnRlciB0aW1lIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gMjAgZGF5cy5gKTtcbiAgICB9IGVsc2UgaWYgKGV4cGlyZXNBZnRlciA8IE1TX0lOX0hPVVIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwaXJlcyBhZnRlciB0aW1lIGNhbm5vdCBiZSBsZXNzIHRoYW4gMSBob3VyLmApO1xuICAgIH1cblxuICAgIHRoaXMuX2V4cGlyZXNBZnRlclRpbWUgPSBleHBpcmVzQWZ0ZXI7XG4gIH1cblxuICAvLyBNQVJLOiBEb3dubG9hZFxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHRoYXQgcmV0dXJucyB0aGUgY2FjaGVkIGRvd25sb2FkIFVSTCBwYWlyIGZvciB0aGUgU3RvcmFnZUZpbGUsIGFuZCBlbWl0cyBudWxsIG9uY2UgaXQgZXhwaXJlcy5cbiAgICpcbiAgICogQHBhcmFtIHN0b3JhZ2VGaWxlSWRPcktleVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0Q2FjaGVkRG93bmxvYWRQYWlyRm9yU3RvcmFnZUZpbGUoc3RvcmFnZUZpbGVJZE9yS2V5OiBTdG9yYWdlRmlsZUlkIHwgU3RvcmFnZUZpbGVLZXkpOiBPYnNlcnZhYmxlPE1heWJlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+PiB7XG4gICAgY29uc3Qgc3RvcmFnZUZpbGVJZCA9IGZpcmVzdG9yZU1vZGVsSWQoc3RvcmFnZUZpbGVJZE9yS2V5KTtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlRmlsZURvd25sb2FkU3RvcmFnZS5nZXREb3dubG9hZFVybFBhaXIoc3RvcmFnZUZpbGVJZCkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgocGFpcikgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0OiBPYnNlcnZhYmxlPE1heWJlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+PjtcblxuICAgICAgICBpZiAocGFpcikge1xuICAgICAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IHBhaXIuZXhwaXJlc0F0IC0gdGhpcy5fZXhwaXJlc0FmdGVyVGltZUJ1ZmZlcjtcblxuICAgICAgICAgIC8vIGV2ZXJ5IG1pbnV0ZSBlbWl0IHRoZSByZXN1bHQgYWdhaW5cbiAgICAgICAgICByZXN1bHQgPSBpbnRlcnZhbChNU19JTl9NSU5VVEUpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSB1bml4VGltZU51bWJlckZvck5vdygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzRXhwaXJlZCA9IG5vdyA+IGV4cGlyZXNBdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNFeHBpcmVkID8gbnVsbCA6IHBhaXI7IC8vIGVtaXQgbnVsbCBvbmNlIGV4cGlyZWRcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBmaWx0ZXIoKHgpID0+IHggPT0gbnVsbCksXG4gICAgICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgICAgIHN0YXJ0V2l0aChwYWlyKSxcbiAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gb2YobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZG93bmxvYWQgVVJMIGZvciB0aGUgU3RvcmFnZUZpbGUgdXNpbmcgdGhlIGRlZmF1bHQgcGFyYW1ldGVycy5cbiAgICpcbiAgICogVGhlc2UgVVJMcyBhcmUgY2FjaGVkIGxvY2FsbHkgdG8gcHJldmVudCBleHRyYS9yZWR1bmRhbnQgY2FsbHMgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHBhcmFtIHN0b3JhZ2VGaWxlSWRPcktleVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZG93bmxvYWRQYWlyRm9yU3RvcmFnZUZpbGUoc3RvcmFnZUZpbGVJZE9yS2V5OiBTdG9yYWdlRmlsZUlkIHwgU3RvcmFnZUZpbGVLZXkpOiBPYnNlcnZhYmxlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+IHtcbiAgICBjb25zdCBzdG9yYWdlRmlsZUlkID0gZmlyZXN0b3JlTW9kZWxJZChzdG9yYWdlRmlsZUlkT3JLZXkpO1xuICAgIGNvbnN0IG9iczogT2JzZXJ2YWJsZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPiA9IHRoaXMuZ2V0Q2FjaGVkRG93bmxvYWRQYWlyRm9yU3RvcmFnZUZpbGUoc3RvcmFnZUZpbGVJZCkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoY2FjaGVkUGFpcikgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0OiBPYnNlcnZhYmxlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+O1xuXG4gICAgICAgIGNvbnN0IGRvd25sb2FkQW5kQ2FjaGVSZXN1bHQgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gYWRkTWlsbGlzZWNvbmRzKG5ldyBEYXRlKCksIHRoaXMuX2V4cGlyZXNBZnRlclRpbWUpO1xuICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMuY3JlYXRlRG93bmxvYWRQYWlyRm9yU3RvcmFnZUZpbGUoc3RvcmFnZUZpbGVJZE9yS2V5LCB7IGV4cGlyZXNBdCB9KSkucGlwZShcbiAgICAgICAgICAgIHRhcCgoZG93bmxvYWRVcmxQYWlyKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGFkZCB0byB0aGUgY2FjaGVcbiAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlRmlsZURvd25sb2FkU3RvcmFnZS5hZGREb3dubG9hZFVybChkb3dubG9hZFVybFBhaXIpLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGNhY2hlZFBhaXIpIHtcbiAgICAgICAgICByZXN1bHQgPSBvZihjYWNoZWRQYWlyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSBkb3dubG9hZEFuZENhY2hlUmVzdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSksXG4gICAgICBmaXJzdCgpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuXG4gICAgcmV0dXJuIG9icztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGRvd25sb2FkIFVSTCBmb3IgdGhlIFN0b3JhZ2VGaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gc3RvcmFnZUZpbGVJZE9yS2V5XG4gICAqIEBwYXJhbSBpbnB1dFBhcmFtc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgY3JlYXRlRG93bmxvYWRQYWlyRm9yU3RvcmFnZUZpbGUoc3RvcmFnZUZpbGVJZE9yS2V5OiBTdG9yYWdlRmlsZUlkIHwgU3RvcmFnZUZpbGVLZXksIGlucHV0UGFyYW1zPzogT21pdDxEb3dubG9hZFN0b3JhZ2VGaWxlUGFyYW1zLCAna2V5Jz4pOiBQcm9taXNlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+IHtcbiAgICBjb25zdCBzdG9yYWdlRmlsZUlkID0gZmlyZXN0b3JlTW9kZWxJZChzdG9yYWdlRmlsZUlkT3JLZXkpO1xuICAgIGNvbnN0IGV4cGlyZXNBdCA9IGlucHV0UGFyYW1zPy5leHBpcmVzQXQgPz8gYWRkTWlsbGlzZWNvbmRzKG5ldyBEYXRlKCksIHRoaXMuX2V4cGlyZXNBZnRlclRpbWUpO1xuXG4gICAgY29uc3QgcGFyYW1zOiBEb3dubG9hZFN0b3JhZ2VGaWxlUGFyYW1zID0ge1xuICAgICAgLi4uaW5wdXRQYXJhbXMsXG4gICAgICBrZXk6IGZpcmVzdG9yZU1vZGVsS2V5KHN0b3JhZ2VGaWxlSWRlbnRpdHksIHN0b3JhZ2VGaWxlSWQpXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VGaWxlRnVuY3Rpb25zLnN0b3JhZ2VGaWxlLnJlYWRTdG9yYWdlRmlsZS5kb3dubG9hZChwYXJhbXMpLnRoZW4oKHgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBzdG9yYWdlRmlsZUlkLFxuICAgICAgICBkb3dubG9hZFVybDogeC51cmwsXG4gICAgICAgIGV4cGlyZXNBdDogdW5peFRpbWVOdW1iZXJGcm9tRGF0ZShleHBpcmVzQXQpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Injectable, InjectionToken, inject } from '@angular/core';
|
|
2
|
+
import { map, mergeMap, catchError, of, switchMap, first } from 'rxjs';
|
|
3
|
+
import { firestoreModelId } from '@dereekb/firebase';
|
|
4
|
+
import { DbxFirebaseAuthService } from '../../../auth/service/firebase.auth.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Token that corresponds to a StorageAccessor<DbxFirebaseStorageFileDownloadUserCache> that is used by DbxModelViewTrackerStorage.
|
|
8
|
+
*/
|
|
9
|
+
export const DBX_FIREBASE_STORAGEFILE_DOWNLOAD_STORAGE_ACCESSOR_TOKEN = new InjectionToken('DbxFirebaseStorageFileDownloadStorageAccessor');
|
|
10
|
+
/**
|
|
11
|
+
* Used for managing DbxModelViewTrackerEvent storage.
|
|
12
|
+
*/
|
|
13
|
+
export class DbxFirebaseStorageFileDownloadStorage {
|
|
14
|
+
static DEFAULT_MAX_DOWNLOAD_URLS = 100;
|
|
15
|
+
authService = inject(DbxFirebaseAuthService);
|
|
16
|
+
storageAccessor = inject(DBX_FIREBASE_STORAGEFILE_DOWNLOAD_STORAGE_ACCESSOR_TOKEN);
|
|
17
|
+
addDownloadUrl({ id, downloadUrl, expiresAt }) {
|
|
18
|
+
return this.getCurrentUserDownloadCache().pipe(mergeMap((cache) => {
|
|
19
|
+
const { uid, pairs: currentPairs } = cache;
|
|
20
|
+
const storageKey = this.getStorageKeyForUid(uid);
|
|
21
|
+
const pairs = {
|
|
22
|
+
...currentPairs,
|
|
23
|
+
[id]: `${expiresAt}_${downloadUrl}`
|
|
24
|
+
};
|
|
25
|
+
return this.storageAccessor.set(storageKey, {
|
|
26
|
+
uid,
|
|
27
|
+
pairs
|
|
28
|
+
});
|
|
29
|
+
}), first());
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Returns the cached download URL pair for the given key.
|
|
33
|
+
*
|
|
34
|
+
* The pair may be expired.
|
|
35
|
+
*
|
|
36
|
+
* @param key
|
|
37
|
+
* @returns
|
|
38
|
+
*/
|
|
39
|
+
getDownloadUrlPair(input) {
|
|
40
|
+
const id = firestoreModelId(input);
|
|
41
|
+
return this.authService.uid$.pipe(switchMap((uid) => {
|
|
42
|
+
return this.getUserDownloadCache(uid).pipe(map((cache) => {
|
|
43
|
+
const pair = cache?.pairs[id];
|
|
44
|
+
let result;
|
|
45
|
+
if (pair) {
|
|
46
|
+
const [expiresAt, downloadUrl] = pair.split('_', 2);
|
|
47
|
+
result = {
|
|
48
|
+
id,
|
|
49
|
+
downloadUrl,
|
|
50
|
+
expiresAt: Number(expiresAt)
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}));
|
|
55
|
+
}), first());
|
|
56
|
+
}
|
|
57
|
+
getAllDownloadUrlPairsRecord(uid) {
|
|
58
|
+
return this.getUserDownloadCache(uid).pipe(map((x) => x.pairs));
|
|
59
|
+
}
|
|
60
|
+
getCurrentUserDownloadCache() {
|
|
61
|
+
return this.authService.uid$.pipe(switchMap((uid) => this.getUserDownloadCache(uid)));
|
|
62
|
+
}
|
|
63
|
+
getUserDownloadCache(uid) {
|
|
64
|
+
const storageKey = this.getStorageKeyForUid(uid);
|
|
65
|
+
return this._getUserDownloadCacheForStorageKey(storageKey, uid);
|
|
66
|
+
}
|
|
67
|
+
clearCurrentUserDownloadCache() {
|
|
68
|
+
return this.authService.uid$.pipe(switchMap((uid) => this.clearUserDownloadCache(uid)));
|
|
69
|
+
}
|
|
70
|
+
clearUserDownloadCache(uid) {
|
|
71
|
+
const storageKey = this.getStorageKeyForUid(uid);
|
|
72
|
+
return this.storageAccessor.remove(storageKey);
|
|
73
|
+
}
|
|
74
|
+
_getUserDownloadCacheForStorageKey(storageKey, uid) {
|
|
75
|
+
return this.storageAccessor.get(storageKey).pipe(catchError((e) => {
|
|
76
|
+
return of(undefined);
|
|
77
|
+
}), map((result) => result ?? { uid, pairs: {} }));
|
|
78
|
+
}
|
|
79
|
+
getStorageKeyForUid(uid) {
|
|
80
|
+
const storageKey = `sf_dl_cache_${uid}`;
|
|
81
|
+
return storageKey;
|
|
82
|
+
}
|
|
83
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadStorage, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
84
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadStorage });
|
|
85
|
+
}
|
|
86
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadStorage, decorators: [{
|
|
87
|
+
type: Injectable
|
|
88
|
+
}] });
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUuZG93bmxvYWQuc3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZpcmViYXNlL3NyYy9saWIvbW9kdWxlcy9zdG9yYWdlZmlsZS9zZXJ2aWNlL3N0b3JhZ2VmaWxlLmRvd25sb2FkLnN0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25GLE9BQU8sRUFBc0IsZ0JBQWdCLEVBQXNFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0ksT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7O0FBcUJyRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdEQUF3RCxHQUFHLElBQUksY0FBYyxDQUFDLCtDQUErQyxDQUFDLENBQUM7QUFFNUk7O0dBRUc7QUFFSCxNQUFNLE9BQU8scUNBQXFDO0lBQ2hELE1BQU0sQ0FBVSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7SUFFdkMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzdDLGVBQWUsR0FBRyxNQUFNLENBQTJELHdEQUF3RCxDQUFDLENBQUM7SUFFdEosY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQXlDO1FBQ2xGLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUMsSUFBSSxDQUM1QyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqQixNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsR0FBRyxL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QUMsQ0FBQyxJQUFJLENBQzlDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2YsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQzlDLENBQUM7SUFDSixDQUFDO0lBRUQsbUJBQW1CLENBQUMsR0FBdUI7UUFDekMsTUFBTSxVQUFVLEdBQUcsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUN4QyxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO3dHQWhHVSxxQ0FBcUM7NEdBQXJDLHFDQUFxQzs7NEZBQXJDLHFDQUFxQztrQkFEakQsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JhZ2VBY2Nlc3NvciB9IGZyb20gJ0BkZXJlZWtiL2RieC1jb3JlJztcbmltcG9ydCB7IG1hcCwgbWVyZ2VNYXAsIGNhdGNoRXJyb3IsIE9ic2VydmFibGUsIG9mLCBzd2l0Y2hNYXAsIGZpcnN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGaXJlYmFzZUF1dGhVc2VySWQsIGZpcmVzdG9yZU1vZGVsSWQsIEZpcmVzdG9yZU1vZGVsSWRJbnB1dCwgU3RvcmFnZUZpbGVJZCwgU3RvcmFnZUZpbGVTaWduZWREb3dubG9hZFVybCB9IGZyb20gJ0BkZXJlZWtiL2ZpcmViYXNlJztcbmltcG9ydCB7IERieEZpcmViYXNlQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hdXRoL3NlcnZpY2UvZmlyZWJhc2UuYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IFVuaXhUaW1lTnVtYmVyIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpciB7XG4gIHJlYWRvbmx5IGlkOiBTdG9yYWdlRmlsZUlkO1xuICByZWFkb25seSBkb3dubG9hZFVybDogU3RvcmFnZUZpbGVTaWduZWREb3dubG9hZFVybDtcbiAgLyoqXG4gICAqIEV4cGlyYXRpb24gaW4gc2Vjb25kcyBzaW5jZSBlcG9jaC5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGlyZXNBdDogVW5peFRpbWVOdW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXJTdHJpbmcgPSBgJHtVbml4VGltZU51bWJlcn1fJHtTdG9yYWdlRmlsZVNpZ25lZERvd25sb2FkVXJsfWA7XG5cbmV4cG9ydCB0eXBlIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXJzUmVjb3JkID0gUmVjb3JkPFN0b3JhZ2VGaWxlSWQsIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXJTdHJpbmc+O1xuXG5leHBvcnQgaW50ZXJmYWNlIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVzZXJDYWNoZSB7XG4gIHJlYWRvbmx5IHVpZDogRmlyZWJhc2VBdXRoVXNlcklkO1xuICByZWFkb25seSBwYWlyczogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpcnNSZWNvcmQ7XG59XG5cbi8qKlxuICogVG9rZW4gdGhhdCBjb3JyZXNwb25kcyB0byBhIFN0b3JhZ2VBY2Nlc3NvcjxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVc2VyQ2FjaGU+IHRoYXQgaXMgdXNlZCBieSBEYnhNb2RlbFZpZXdUcmFja2VyU3RvcmFnZS5cbiAqL1xuZXhwb3J0IGNvbnN0IERCWF9GSVJFQkFTRV9TVE9SQUdFRklMRV9ET1dOTE9BRF9TVE9SQUdFX0FDQ0VTU09SX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuKCdEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTdG9yYWdlQWNjZXNzb3InKTtcblxuLyoqXG4gKiBVc2VkIGZvciBtYW5hZ2luZyBEYnhNb2RlbFZpZXdUcmFja2VyRXZlbnQgc3RvcmFnZS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFN0b3JhZ2Uge1xuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NQVhfRE9XTkxPQURfVVJMUyA9IDEwMDtcblxuICByZWFkb25seSBhdXRoU2VydmljZSA9IGluamVjdChEYnhGaXJlYmFzZUF1dGhTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgc3RvcmFnZUFjY2Vzc29yID0gaW5qZWN0PFN0b3JhZ2VBY2Nlc3NvcjxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVc2VyQ2FjaGU+PihEQlhfRklSRUJBU0VfU1RPUkFHRUZJTEVfRE9XTkxPQURfU1RPUkFHRV9BQ0NFU1NPUl9UT0tFTik7XG5cbiAgYWRkRG93bmxvYWRVcmwoeyBpZCwgZG93bmxvYWRVcmwsIGV4cGlyZXNBdCB9OiBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFVzZXJEb3dubG9hZENhY2hlKCkucGlwZShcbiAgICAgIG1lcmdlTWFwKChjYWNoZSkgPT4ge1xuICAgICAgICBjb25zdCB7IHVpZCwgcGFpcnM6IGN1cnJlbnRQYWlycyB9ID0gY2FjaGU7XG5cbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleSA9IHRoaXMuZ2V0U3RvcmFnZUtleUZvclVpZCh1aWQpO1xuICAgICAgICBjb25zdCBwYWlyczogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpcnNSZWNvcmQgPSB7XG4gICAgICAgICAgLi4uY3VycmVudFBhaXJzLFxuICAgICAgICAgIFtpZF06IGAke2V4cGlyZXNBdH1fJHtkb3dubG9hZFVybH1gXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZUFjY2Vzc29yLnNldChzdG9yYWdlS2V5LCB7XG4gICAgICAgICAgdWlkLFxuICAgICAgICAgIHBhaXJzXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBmaXJzdCgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjYWNoZWQgZG93bmxvYWQgVVJMIHBhaXIgZm9yIHRoZSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIFRoZSBwYWlyIG1heSBiZSBleHBpcmVkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXREb3dubG9hZFVybFBhaXIoaW5wdXQ6IEZpcmVzdG9yZU1vZGVsSWRJbnB1dCk6IE9ic2VydmFibGU8RGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpciB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGlkID0gZmlyZXN0b3JlTW9kZWxJZChpbnB1dCk7XG4gICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UudWlkJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKCh1aWQpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VXNlckRvd25sb2FkQ2FjaGUodWlkKS5waXBlKFxuICAgICAgICAgIG1hcCgoY2FjaGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBjYWNoZT8ucGFpcnNbaWRdO1xuXG4gICAgICAgICAgICBsZXQgcmVzdWx0OiBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBpZiAocGFpcikge1xuICAgICAgICAgICAgICBjb25zdCBbZXhwaXJlc0F0LCBkb3dubG9hZFVybF0gPSBwYWlyLnNwbGl0KCdfJywgMik7XG5cbiAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIGRvd25sb2FkVXJsLFxuICAgICAgICAgICAgICAgIGV4cGlyZXNBdDogTnVtYmVyKGV4cGlyZXNBdClcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBmaXJzdCgpXG4gICAgKTtcbiAgfVxuXG4gIGdldEFsbERvd25sb2FkVXJsUGFpcnNSZWNvcmQodWlkOiBGaXJlYmFzZUF1dGhVc2VySWQpOiBPYnNlcnZhYmxlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXJzUmVjb3JkPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VXNlckRvd25sb2FkQ2FjaGUodWlkKS5waXBlKG1hcCgoeCkgPT4geC5wYWlycykpO1xuICB9XG5cbiAgZ2V0Q3VycmVudFVzZXJEb3dubG9hZENhY2hlKCk6IE9ic2VydmFibGU8RGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXNlckNhY2hlPiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UudWlkJC5waXBlKHN3aXRjaE1hcCgodWlkKSA9PiB0aGlzLmdldFVzZXJEb3dubG9hZENhY2hlKHVpZCkpKTtcbiAgfVxuXG4gIGdldFVzZXJEb3dubG9hZENhY2hlKHVpZDogRmlyZWJhc2VBdXRoVXNlcklkKTogT2JzZXJ2YWJsZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVc2VyQ2FjaGU+IHtcbiAgICBjb25zdCBzdG9yYWdlS2V5ID0gdGhpcy5nZXRTdG9yYWdlS2V5Rm9yVWlkKHVpZCk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFVzZXJEb3dubG9hZENhY2hlRm9yU3RvcmFnZUtleShzdG9yYWdlS2V5LCB1aWQpO1xuICB9XG5cbiAgY2xlYXJDdXJyZW50VXNlckRvd25sb2FkQ2FjaGUoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UudWlkJC5waXBlKHN3aXRjaE1hcCgodWlkKSA9PiB0aGlzLmNsZWFyVXNlckRvd25sb2FkQ2FjaGUodWlkKSkpO1xuICB9XG5cbiAgY2xlYXJVc2VyRG93bmxvYWRDYWNoZSh1aWQ6IEZpcmViYXNlQXV0aFVzZXJJZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSB0aGlzLmdldFN0b3JhZ2VLZXlGb3JVaWQodWlkKTtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlQWNjZXNzb3IucmVtb3ZlKHN0b3JhZ2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VXNlckRvd25sb2FkQ2FjaGVGb3JTdG9yYWdlS2V5KHN0b3JhZ2VLZXk6IHN0cmluZywgdWlkOiBGaXJlYmFzZUF1dGhVc2VySWQpOiBPYnNlcnZhYmxlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVzZXJDYWNoZT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VBY2Nlc3Nvci5nZXQoc3RvcmFnZUtleSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKGUpID0+IHtcbiAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgICB9KSxcbiAgICAgIG1hcCgocmVzdWx0KSA9PiByZXN1bHQgPz8geyB1aWQsIHBhaXJzOiB7fSB9KVxuICAgICk7XG4gIH1cblxuICBnZXRTdG9yYWdlS2V5Rm9yVWlkKHVpZDogRmlyZWJhc2VBdXRoVXNlcklkKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdG9yYWdlS2V5ID0gYHNmX2RsX2NhY2hlXyR7dWlkfWA7XG4gICAgcmV0dXJuIHN0b3JhZ2VLZXk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { makeEnvironmentProviders } from '@angular/core';
|
|
2
|
+
import { SimpleStorageAccessorFactory } from '@dereekb/dbx-core';
|
|
3
|
+
import { DBX_FIREBASE_STORAGEFILE_DOWNLOAD_STORAGE_ACCESSOR_TOKEN, DbxFirebaseStorageFileDownloadStorage } from './service/storagefile.download.storage.service';
|
|
4
|
+
import { DbxFirebaseStorageFileDownloadService } from './service/storagefile.download.service';
|
|
5
|
+
/**
|
|
6
|
+
* Factory function for creating a StorageAccessor for the model view tracker.
|
|
7
|
+
*/
|
|
8
|
+
export function defaultDbxFirebaseStorageFileDownloadStorageAccessorFactory(storageAccessorFactory) {
|
|
9
|
+
const accessor = storageAccessorFactory.createStorageAccessor({
|
|
10
|
+
prefix: 'sfds'
|
|
11
|
+
});
|
|
12
|
+
return accessor;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Creates EnvironmentProviders for providing DbxModelTrackerService, DbxModelObjectStateService and sets up the NgRx store for DbxModelTrackerEffects.
|
|
16
|
+
*
|
|
17
|
+
* @returns EnvironmentProviders
|
|
18
|
+
*/
|
|
19
|
+
export function provideDbxFirebaseStorageFileService() {
|
|
20
|
+
const providers = [
|
|
21
|
+
// Storage accessor
|
|
22
|
+
{
|
|
23
|
+
provide: DBX_FIREBASE_STORAGEFILE_DOWNLOAD_STORAGE_ACCESSOR_TOKEN,
|
|
24
|
+
useFactory: defaultDbxFirebaseStorageFileDownloadStorageAccessorFactory,
|
|
25
|
+
deps: [SimpleStorageAccessorFactory]
|
|
26
|
+
},
|
|
27
|
+
// Service
|
|
28
|
+
DbxFirebaseStorageFileDownloadStorage,
|
|
29
|
+
DbxFirebaseStorageFileDownloadService
|
|
30
|
+
];
|
|
31
|
+
return makeEnvironmentProviders(providers);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUucHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZpcmViYXNlL3NyYy9saWIvbW9kdWxlcy9zdG9yYWdlZmlsZS9zdG9yYWdlZmlsZS5wcm92aWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0Qyx3QkFBd0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUsNEJBQTRCLEVBQXdCLE1BQU0sbUJBQW1CLENBQUM7QUFDdkYsT0FBTyxFQUFFLHdEQUF3RCxFQUFFLHFDQUFxQyxFQUFnRCxNQUFNLGdEQUFnRCxDQUFDO0FBQy9NLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRS9GOztHQUVHO0FBQ0gsTUFBTSxVQUFVLDJEQUEyRCxDQUFDLHNCQUFvRDtJQUM5SCxNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBMEM7UUFDckcsTUFBTSxFQUFFLE1BQU07S0FDZixDQUFDLENBQUM7SUFFSCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQ0FBb0M7SUFDbEQsTUFBTSxTQUFTLEdBQXdDO1FBQ3JELG1CQUFtQjtRQUNuQjtZQUNFLE9BQU8sRUFBRSx3REFBd0Q7WUFDakUsVUFBVSxFQUFFLDJEQUEyRDtZQUN2RSxJQUFJLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztTQUNyQztRQUNELFVBQVU7UUFDVixxQ0FBcUM7UUFDckMscUNBQXFDO0tBQ3RDLENBQUM7SUFFRixPQUFPLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEVudmlyb25tZW50UHJvdmlkZXJzLCB0eXBlIFByb3ZpZGVyLCBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNpbXBsZVN0b3JhZ2VBY2Nlc3NvckZhY3RvcnksIHR5cGUgU3RvcmFnZUFjY2Vzc29yIH0gZnJvbSAnQGRlcmVla2IvZGJ4LWNvcmUnO1xuaW1wb3J0IHsgREJYX0ZJUkVCQVNFX1NUT1JBR0VGSUxFX0RPV05MT0FEX1NUT1JBR0VfQUNDRVNTT1JfVE9LRU4sIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFN0b3JhZ2UsIHR5cGUgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXNlckNhY2hlIH0gZnJvbSAnLi9zZXJ2aWNlL3N0b3JhZ2VmaWxlLmRvd25sb2FkLnN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlL3N0b3JhZ2VmaWxlLmRvd25sb2FkLnNlcnZpY2UnO1xuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgU3RvcmFnZUFjY2Vzc29yIGZvciB0aGUgbW9kZWwgdmlldyB0cmFja2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFN0b3JhZ2VBY2Nlc3NvckZhY3Rvcnkoc3RvcmFnZUFjY2Vzc29yRmFjdG9yeTogU2ltcGxlU3RvcmFnZUFjY2Vzc29yRmFjdG9yeSk6IFN0b3JhZ2VBY2Nlc3NvcjxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVc2VyQ2FjaGU+IHtcbiAgY29uc3QgYWNjZXNzb3IgPSBzdG9yYWdlQWNjZXNzb3JGYWN0b3J5LmNyZWF0ZVN0b3JhZ2VBY2Nlc3NvcjxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVc2VyQ2FjaGU+KHtcbiAgICBwcmVmaXg6ICdzZmRzJ1xuICB9KTtcblxuICByZXR1cm4gYWNjZXNzb3I7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBFbnZpcm9ubWVudFByb3ZpZGVycyBmb3IgcHJvdmlkaW5nIERieE1vZGVsVHJhY2tlclNlcnZpY2UsIERieE1vZGVsT2JqZWN0U3RhdGVTZXJ2aWNlIGFuZCBzZXRzIHVwIHRoZSBOZ1J4IHN0b3JlIGZvciBEYnhNb2RlbFRyYWNrZXJFZmZlY3RzLlxuICpcbiAqIEByZXR1cm5zIEVudmlyb25tZW50UHJvdmlkZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVNlcnZpY2UoKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICBjb25zdCBwcm92aWRlcnM6IChQcm92aWRlciB8IEVudmlyb25tZW50UHJvdmlkZXJzKVtdID0gW1xuICAgIC8vIFN0b3JhZ2UgYWNjZXNzb3JcbiAgICB7XG4gICAgICBwcm92aWRlOiBEQlhfRklSRUJBU0VfU1RPUkFHRUZJTEVfRE9XTkxPQURfU1RPUkFHRV9BQ0NFU1NPUl9UT0tFTixcbiAgICAgIHVzZUZhY3Rvcnk6IGRlZmF1bHREYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTdG9yYWdlQWNjZXNzb3JGYWN0b3J5LFxuICAgICAgZGVwczogW1NpbXBsZVN0b3JhZ2VBY2Nlc3NvckZhY3RvcnldXG4gICAgfSxcbiAgICAvLyBTZXJ2aWNlXG4gICAgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU3RvcmFnZSxcbiAgICBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTZXJ2aWNlXG4gIF07XG5cbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhwcm92aWRlcnMpO1xufVxuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Injectable, inject } from '@angular/core';
|
|
2
|
-
import { AbstractDbxFirebaseDocumentStore, firebaseDocumentStoreCreateFunction, firebaseDocumentStoreCrudFunction, firebaseDocumentStoreDeleteFunction, firebaseDocumentStoreUpdateFunction } from '../../../model/modules/store';
|
|
2
|
+
import { AbstractDbxFirebaseDocumentStore, firebaseDocumentStoreCreateFunction, firebaseDocumentStoreCrudFunction, firebaseDocumentStoreDeleteFunction, firebaseDocumentStoreReadFunction, firebaseDocumentStoreUpdateFunction } from '../../../model/modules/store';
|
|
3
3
|
import { StorageFileFirestoreCollections, StorageFileFunctions } from '@dereekb/firebase';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export class StorageFileDocumentStore extends AbstractDbxFirebaseDocumentStore {
|
|
@@ -13,10 +13,11 @@ export class StorageFileDocumentStore extends AbstractDbxFirebaseDocumentStore {
|
|
|
13
13
|
updateStorageFile = firebaseDocumentStoreUpdateFunction(this, this.storageFileFunctions.storageFile.updateStorageFile.update);
|
|
14
14
|
processStorageFile = firebaseDocumentStoreUpdateFunction(this, this.storageFileFunctions.storageFile.updateStorageFile.process);
|
|
15
15
|
deleteStorageFile = firebaseDocumentStoreDeleteFunction(this, this.storageFileFunctions.storageFile.deleteStorageFile.delete);
|
|
16
|
+
downloadStorageFile = firebaseDocumentStoreReadFunction(this, this.storageFileFunctions.storageFile.readStorageFile.download);
|
|
16
17
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StorageFileDocumentStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
17
18
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StorageFileDocumentStore });
|
|
18
19
|
}
|
|
19
20
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StorageFileDocumentStore, decorators: [{
|
|
20
21
|
type: Injectable
|
|
21
22
|
}], ctorParameters: () => [] });
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUuZG9jdW1lbnQuc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL3N0b3JlL3N0b3JhZ2VmaWxlLmRvY3VtZW50LnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxtQ0FBbUMsRUFBRSxpQ0FBaUMsRUFBRSxtQ0FBbUMsRUFBRSxpQ0FBaUMsRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JRLE9BQU8sRUFBb0MsK0JBQStCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFHNUgsTUFBTSxPQUFPLHdCQUF5QixTQUFRLGdDQUFrRTtJQUNyRyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUU3RDtRQUNFLEtBQUssQ0FBQyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRVEsMkJBQTJCLEdBQUcsbUNBQW1DLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEksK0JBQStCLEdBQUcsbUNBQW1DLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEosbUNBQW1DLEdBQUcsaUNBQWlDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUUvSSxpQkFBaUIsR0FBRyxtQ0FBbUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5SCxrQkFBa0IsR0FBRyxtQ0FBbUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUVoSSxpQkFBaUIsR0FBRyxtQ0FBbUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5SCxtQkFBbUIsR0FBRyxpQ0FBaUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7d0dBaEI1SCx3QkFBd0I7NEdBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3REYnhGaXJlYmFzZURvY3VtZW50U3RvcmUsIGZpcmViYXNlRG9jdW1lbnRTdG9yZUNyZWF0ZUZ1bmN0aW9uLCBmaXJlYmFzZURvY3VtZW50U3RvcmVDcnVkRnVuY3Rpb24sIGZpcmViYXNlRG9jdW1lbnRTdG9yZURlbGV0ZUZ1bmN0aW9uLCBmaXJlYmFzZURvY3VtZW50U3RvcmVSZWFkRnVuY3Rpb24sIGZpcmViYXNlRG9jdW1lbnRTdG9yZVVwZGF0ZUZ1bmN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvbW9kdWxlcy9zdG9yZSc7XG5pbXBvcnQgeyBTdG9yYWdlRmlsZSwgU3RvcmFnZUZpbGVEb2N1bWVudCwgU3RvcmFnZUZpbGVGaXJlc3RvcmVDb2xsZWN0aW9ucywgU3RvcmFnZUZpbGVGdW5jdGlvbnMgfSBmcm9tICdAZGVyZWVrYi9maXJlYmFzZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTdG9yYWdlRmlsZURvY3VtZW50U3RvcmUgZXh0ZW5kcyBBYnN0cmFjdERieEZpcmViYXNlRG9jdW1lbnRTdG9yZTxTdG9yYWdlRmlsZSwgU3RvcmFnZUZpbGVEb2N1bWVudD4ge1xuICByZWFkb25seSBzdG9yYWdlRmlsZUZ1bmN0aW9ucyA9IGluamVjdChTdG9yYWdlRmlsZUZ1bmN0aW9ucyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoeyBmaXJlc3RvcmVDb2xsZWN0aW9uOiBpbmplY3QoU3RvcmFnZUZpbGVGaXJlc3RvcmVDb2xsZWN0aW9ucykuc3RvcmFnZUZpbGVDb2xsZWN0aW9uIH0pO1xuICB9XG5cbiAgcmVhZG9ubHkgY3JlYXRlU3RvcmFnZUZpbGVGcm9tVXBsb2FkID0gZmlyZWJhc2VEb2N1bWVudFN0b3JlQ3JlYXRlRnVuY3Rpb24odGhpcywgdGhpcy5zdG9yYWdlRmlsZUZ1bmN0aW9ucy5zdG9yYWdlRmlsZS5jcmVhdGVTdG9yYWdlRmlsZS5jcmVhdGUpO1xuICByZWFkb25seSBpbml0aWFsaXplU3RvcmFnZUZpbGVGcm9tVXBsb2FkID0gZmlyZWJhc2VEb2N1bWVudFN0b3JlQ3JlYXRlRnVuY3Rpb24odGhpcywgdGhpcy5zdG9yYWdlRmlsZUZ1bmN0aW9ucy5zdG9yYWdlRmlsZS5jcmVhdGVTdG9yYWdlRmlsZS5mcm9tVXBsb2FkKTtcbiAgcmVhZG9ubHkgaW5pdGlhbGl6ZUFsbFN0b3JhZ2VGaWxlc0Zyb21VcGxvYWQgPSBmaXJlYmFzZURvY3VtZW50U3RvcmVDcnVkRnVuY3Rpb24odGhpcy5zdG9yYWdlRmlsZUZ1bmN0aW9ucy5zdG9yYWdlRmlsZS5jcmVhdGVTdG9yYWdlRmlsZS5hbGxGcm9tVXBsb2FkKTtcblxuICByZWFkb25seSB1cGRhdGVTdG9yYWdlRmlsZSA9IGZpcmViYXNlRG9jdW1lbnRTdG9yZVVwZGF0ZUZ1bmN0aW9uKHRoaXMsIHRoaXMuc3RvcmFnZUZpbGVGdW5jdGlvbnMuc3RvcmFnZUZpbGUudXBkYXRlU3RvcmFnZUZpbGUudXBkYXRlKTtcbiAgcmVhZG9ubHkgcHJvY2Vzc1N0b3JhZ2VGaWxlID0gZmlyZWJhc2VEb2N1bWVudFN0b3JlVXBkYXRlRnVuY3Rpb24odGhpcywgdGhpcy5zdG9yYWdlRmlsZUZ1bmN0aW9ucy5zdG9yYWdlRmlsZS51cGRhdGVTdG9yYWdlRmlsZS5wcm9jZXNzKTtcblxuICByZWFkb25seSBkZWxldGVTdG9yYWdlRmlsZSA9IGZpcmViYXNlRG9jdW1lbnRTdG9yZURlbGV0ZUZ1bmN0aW9uKHRoaXMsIHRoaXMuc3RvcmFnZUZpbGVGdW5jdGlvbnMuc3RvcmFnZUZpbGUuZGVsZXRlU3RvcmFnZUZpbGUuZGVsZXRlKTtcblxuICByZWFkb25seSBkb3dubG9hZFN0b3JhZ2VGaWxlID0gZmlyZWJhc2VEb2N1bWVudFN0b3JlUmVhZEZ1bmN0aW9uKHRoaXMsIHRoaXMuc3RvcmFnZUZpbGVGdW5jdGlvbnMuc3RvcmFnZUZpbGUucmVhZFN0b3JhZ2VGaWxlLmRvd25sb2FkKTtcbn1cbiJdfQ==
|