@mano8/astro-media-m8 0.1.0-alpha.1
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/LICENSE +201 -0
- package/README.md +203 -0
- package/dist/src/integration.d.ts +57 -0
- package/dist/src/integration.d.ts.map +1 -0
- package/dist/src/integration.js +87 -0
- package/dist/src/integration.js.map +1 -0
- package/dist/src/lib/csp.d.ts +27 -0
- package/dist/src/lib/csp.d.ts.map +1 -0
- package/dist/src/lib/csp.js +54 -0
- package/dist/src/lib/csp.js.map +1 -0
- package/dist/src/middleware.d.ts +4 -0
- package/dist/src/middleware.d.ts.map +1 -0
- package/dist/src/middleware.js +24 -0
- package/dist/src/middleware.js.map +1 -0
- package/dist/src/runtime/api/admin.d.ts +22 -0
- package/dist/src/runtime/api/admin.d.ts.map +1 -0
- package/dist/src/runtime/api/admin.js +115 -0
- package/dist/src/runtime/api/admin.js.map +1 -0
- package/dist/src/runtime/api/categories.d.ts +12 -0
- package/dist/src/runtime/api/categories.d.ts.map +1 -0
- package/dist/src/runtime/api/categories.js +56 -0
- package/dist/src/runtime/api/categories.js.map +1 -0
- package/dist/src/runtime/api/dashboard.d.ts +5 -0
- package/dist/src/runtime/api/dashboard.d.ts.map +1 -0
- package/dist/src/runtime/api/dashboard.js +22 -0
- package/dist/src/runtime/api/dashboard.js.map +1 -0
- package/dist/src/runtime/api/index.d.ts +72 -0
- package/dist/src/runtime/api/index.d.ts.map +1 -0
- package/dist/src/runtime/api/index.js +74 -0
- package/dist/src/runtime/api/index.js.map +1 -0
- package/dist/src/runtime/api/internal.server.d.ts +19 -0
- package/dist/src/runtime/api/internal.server.d.ts.map +1 -0
- package/dist/src/runtime/api/internal.server.js +64 -0
- package/dist/src/runtime/api/internal.server.js.map +1 -0
- package/dist/src/runtime/api/objects.d.ts +7 -0
- package/dist/src/runtime/api/objects.d.ts.map +1 -0
- package/dist/src/runtime/api/objects.js +71 -0
- package/dist/src/runtime/api/objects.js.map +1 -0
- package/dist/src/runtime/api/presets.d.ts +6 -0
- package/dist/src/runtime/api/presets.d.ts.map +1 -0
- package/dist/src/runtime/api/presets.js +31 -0
- package/dist/src/runtime/api/presets.js.map +1 -0
- package/dist/src/runtime/api/shares.d.ts +10 -0
- package/dist/src/runtime/api/shares.d.ts.map +1 -0
- package/dist/src/runtime/api/shares.js +38 -0
- package/dist/src/runtime/api/shares.js.map +1 -0
- package/dist/src/runtime/api/uploads.d.ts +5 -0
- package/dist/src/runtime/api/uploads.d.ts.map +1 -0
- package/dist/src/runtime/api/uploads.js +28 -0
- package/dist/src/runtime/api/uploads.js.map +1 -0
- package/dist/src/runtime/api/variants.d.ts +18 -0
- package/dist/src/runtime/api/variants.d.ts.map +1 -0
- package/dist/src/runtime/api/variants.js +61 -0
- package/dist/src/runtime/api/variants.js.map +1 -0
- package/dist/src/runtime/authAdapter.d.ts +48 -0
- package/dist/src/runtime/authAdapter.d.ts.map +1 -0
- package/dist/src/runtime/authAdapter.js +62 -0
- package/dist/src/runtime/authAdapter.js.map +1 -0
- package/dist/src/runtime/client.d.ts +24 -0
- package/dist/src/runtime/client.d.ts.map +1 -0
- package/dist/src/runtime/client.js +87 -0
- package/dist/src/runtime/client.js.map +1 -0
- package/dist/src/runtime/compatibility.d.ts +32 -0
- package/dist/src/runtime/compatibility.d.ts.map +1 -0
- package/dist/src/runtime/compatibility.js +101 -0
- package/dist/src/runtime/compatibility.js.map +1 -0
- package/dist/src/runtime/config.d.ts +27 -0
- package/dist/src/runtime/config.d.ts.map +1 -0
- package/dist/src/runtime/config.js +32 -0
- package/dist/src/runtime/config.js.map +1 -0
- package/dist/src/runtime/errors.d.ts +23 -0
- package/dist/src/runtime/errors.d.ts.map +1 -0
- package/dist/src/runtime/errors.js +50 -0
- package/dist/src/runtime/errors.js.map +1 -0
- package/dist/src/runtime/hooks/index.d.ts +8 -0
- package/dist/src/runtime/hooks/index.d.ts.map +1 -0
- package/dist/src/runtime/hooks/index.js +8 -0
- package/dist/src/runtime/hooks/index.js.map +1 -0
- package/dist/src/runtime/hooks/useDownloadUrl.d.ts +12 -0
- package/dist/src/runtime/hooks/useDownloadUrl.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useDownloadUrl.js +40 -0
- package/dist/src/runtime/hooks/useDownloadUrl.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaAdmin.d.ts +30 -0
- package/dist/src/runtime/hooks/useMediaAdmin.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaAdmin.js +145 -0
- package/dist/src/runtime/hooks/useMediaAdmin.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaObject.d.ts +17 -0
- package/dist/src/runtime/hooks/useMediaObject.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaObject.js +62 -0
- package/dist/src/runtime/hooks/useMediaObject.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaObjects.d.ts +12 -0
- package/dist/src/runtime/hooks/useMediaObjects.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaObjects.js +76 -0
- package/dist/src/runtime/hooks/useMediaObjects.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaPresets.d.ts +24 -0
- package/dist/src/runtime/hooks/useMediaPresets.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaPresets.js +55 -0
- package/dist/src/runtime/hooks/useMediaPresets.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaUpload.d.ts +11 -0
- package/dist/src/runtime/hooks/useMediaUpload.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaUpload.js +34 -0
- package/dist/src/runtime/hooks/useMediaUpload.js.map +1 -0
- package/dist/src/runtime/hooks/useMediaVariants.d.ts +18 -0
- package/dist/src/runtime/hooks/useMediaVariants.d.ts.map +1 -0
- package/dist/src/runtime/hooks/useMediaVariants.js +78 -0
- package/dist/src/runtime/hooks/useMediaVariants.js.map +1 -0
- package/dist/src/runtime/listParams.d.ts +27 -0
- package/dist/src/runtime/listParams.d.ts.map +1 -0
- package/dist/src/runtime/listParams.js +66 -0
- package/dist/src/runtime/listParams.js.map +1 -0
- package/dist/src/runtime/queryKeys.d.ts +18 -0
- package/dist/src/runtime/queryKeys.d.ts.map +1 -0
- package/dist/src/runtime/queryKeys.js +23 -0
- package/dist/src/runtime/queryKeys.js.map +1 -0
- package/dist/src/runtime/react/AdminMediaPanel.d.ts +2 -0
- package/dist/src/runtime/react/AdminMediaPanel.d.ts.map +1 -0
- package/dist/src/runtime/react/AdminMediaPanel.js +14 -0
- package/dist/src/runtime/react/AdminMediaPanel.js.map +1 -0
- package/dist/src/runtime/react/MediaLibrary.d.ts +6 -0
- package/dist/src/runtime/react/MediaLibrary.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaLibrary.js +138 -0
- package/dist/src/runtime/react/MediaLibrary.js.map +1 -0
- package/dist/src/runtime/react/MediaProvider.d.ts +18 -0
- package/dist/src/runtime/react/MediaProvider.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaProvider.js +79 -0
- package/dist/src/runtime/react/MediaProvider.js.map +1 -0
- package/dist/src/runtime/react/MediaQueryProvider.d.ts +8 -0
- package/dist/src/runtime/react/MediaQueryProvider.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaQueryProvider.js +11 -0
- package/dist/src/runtime/react/MediaQueryProvider.js.map +1 -0
- package/dist/src/runtime/react/MediaUploadDropzone.d.ts +8 -0
- package/dist/src/runtime/react/MediaUploadDropzone.d.ts.map +1 -0
- package/dist/src/runtime/react/MediaUploadDropzone.js +34 -0
- package/dist/src/runtime/react/MediaUploadDropzone.js.map +1 -0
- package/dist/src/runtime/react/ObjectDetail.d.ts +5 -0
- package/dist/src/runtime/react/ObjectDetail.d.ts.map +1 -0
- package/dist/src/runtime/react/ObjectDetail.js +34 -0
- package/dist/src/runtime/react/ObjectDetail.js.map +1 -0
- package/dist/src/runtime/react/PresetEditor.d.ts +3 -0
- package/dist/src/runtime/react/PresetEditor.d.ts.map +1 -0
- package/dist/src/runtime/react/PresetEditor.js +36 -0
- package/dist/src/runtime/react/PresetEditor.js.map +1 -0
- package/dist/src/runtime/react/RequireSuperuser.d.ts +7 -0
- package/dist/src/runtime/react/RequireSuperuser.d.ts.map +1 -0
- package/dist/src/runtime/react/RequireSuperuser.js +10 -0
- package/dist/src/runtime/react/RequireSuperuser.js.map +1 -0
- package/dist/src/runtime/react/VariantPicker.d.ts +5 -0
- package/dist/src/runtime/react/VariantPicker.d.ts.map +1 -0
- package/dist/src/runtime/react/VariantPicker.js +28 -0
- package/dist/src/runtime/react/VariantPicker.js.map +1 -0
- package/dist/src/runtime/react/default-ui/index.d.ts +25 -0
- package/dist/src/runtime/react/default-ui/index.d.ts.map +1 -0
- package/dist/src/runtime/react/default-ui/index.js +33 -0
- package/dist/src/runtime/react/default-ui/index.js.map +1 -0
- package/dist/src/runtime/react/index.d.ts +10 -0
- package/dist/src/runtime/react/index.d.ts.map +1 -0
- package/dist/src/runtime/react/index.js +10 -0
- package/dist/src/runtime/react/index.js.map +1 -0
- package/dist/src/runtime/routes.d.ts +19 -0
- package/dist/src/runtime/routes.d.ts.map +1 -0
- package/dist/src/runtime/routes.js +35 -0
- package/dist/src/runtime/routes.js.map +1 -0
- package/dist/src/runtime/schemas.d.ts +812 -0
- package/dist/src/runtime/schemas.d.ts.map +1 -0
- package/dist/src/runtime/schemas.js +427 -0
- package/dist/src/runtime/schemas.js.map +1 -0
- package/dist/src/runtime/upload/index.d.ts +2 -0
- package/dist/src/runtime/upload/index.d.ts.map +1 -0
- package/dist/src/runtime/upload/index.js +2 -0
- package/dist/src/runtime/upload/index.js.map +1 -0
- package/dist/src/runtime/upload/uploadController.d.ts +71 -0
- package/dist/src/runtime/upload/uploadController.d.ts.map +1 -0
- package/dist/src/runtime/upload/uploadController.js +217 -0
- package/dist/src/runtime/upload/uploadController.js.map +1 -0
- package/package.json +97 -0
- package/registry/r/admin-media-dashboard.json +23 -0
- package/registry/r/data-table.json +23 -0
- package/registry/r/media-dashboard-overview.json +26 -0
- package/registry/r/media-maintenance-panel.json +23 -0
- package/registry/r/media-storage-chart.json +21 -0
- package/registry/r/registry.json +37 -0
- package/registry.json +92 -0
- package/src/routes/admin/media.astro +12 -0
- package/src/routes/library.astro +12 -0
- package/src/routes/object/[id].astro +14 -0
- package/src/routes/presets.astro +12 -0
- package/src/routes/upload.astro +12 -0
- package/src/scaffold/styles/media.css +208 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ImagePresetCreate, type ImagePresetPublic, type ImagePresetUpdate } from "../schemas.js";
|
|
2
|
+
export declare function listPresets(): Promise<ImagePresetPublic[]>;
|
|
3
|
+
export declare function createPreset(body: ImagePresetCreate): Promise<ImagePresetPublic>;
|
|
4
|
+
export declare function updatePreset(presetId: string, body: ImagePresetUpdate): Promise<ImagePresetPublic>;
|
|
5
|
+
export declare function deletePreset(presetId: string): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../../src/runtime/api/presets.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB,wBAAgB,WAAW,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAE1D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAQhF;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAQ5B;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { request } from "../client.js";
|
|
2
|
+
import { ImagePresetListSchema, ImagePresetPublicSchema } from "../schemas.js";
|
|
3
|
+
export function listPresets() {
|
|
4
|
+
return request({ method: "GET", path: "/presets", schema: ImagePresetListSchema, auth: true });
|
|
5
|
+
}
|
|
6
|
+
export function createPreset(body) {
|
|
7
|
+
return request({
|
|
8
|
+
method: "POST",
|
|
9
|
+
path: "/presets",
|
|
10
|
+
body,
|
|
11
|
+
schema: ImagePresetPublicSchema,
|
|
12
|
+
auth: true
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export function updatePreset(presetId, body) {
|
|
16
|
+
return request({
|
|
17
|
+
method: "PATCH",
|
|
18
|
+
path: `/presets/${encodeURIComponent(presetId)}`,
|
|
19
|
+
body,
|
|
20
|
+
schema: ImagePresetPublicSchema,
|
|
21
|
+
auth: true
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export function deletePreset(presetId) {
|
|
25
|
+
return request({
|
|
26
|
+
method: "DELETE",
|
|
27
|
+
path: `/presets/${encodeURIComponent(presetId)}`,
|
|
28
|
+
auth: true
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../../src/runtime/api/presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EAIxB,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,qBAAqB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAuB;IAClD,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,UAAU;QAChB,IAAI;QACJ,MAAM,EAAE,uBAAuB;QAC/B,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,IAAuB;IAEvB,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,EAAE;QAChD,IAAI;QACJ,MAAM,EAAE,uBAAuB;QAC/B,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,EAAE;QAChD,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type DownloadUrlResponse, type ShareTokenCreate, type ShareTokenListResponse, type ShareTokenPublic } from "../schemas.js";
|
|
2
|
+
export declare function createShare(objectId: string, body?: ShareTokenCreate): Promise<ShareTokenPublic>;
|
|
3
|
+
export declare function listShares(objectId: string): Promise<ShareTokenListResponse>;
|
|
4
|
+
export declare function revokeShare(tokenId: string): Promise<void>;
|
|
5
|
+
/**
|
|
6
|
+
* Resolve a public share token to a presigned download URL. This route is
|
|
7
|
+
* public on the service, so no bearer token is attached.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveShare(token: string): Promise<DownloadUrlResponse>;
|
|
10
|
+
//# sourceMappingURL=shares.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shares.d.ts","sourceRoot":"","sources":["../../../../src/runtime/api/shares.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAEvB,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAQ3B;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAO5E;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAMxE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { request } from "../client.js";
|
|
2
|
+
import { DownloadUrlResponseSchema, ShareTokenListResponseSchema, ShareTokenPublicSchema } from "../schemas.js";
|
|
3
|
+
export function createShare(objectId, body = {}) {
|
|
4
|
+
return request({
|
|
5
|
+
method: "POST",
|
|
6
|
+
path: `/objects/${encodeURIComponent(objectId)}/shares`,
|
|
7
|
+
body,
|
|
8
|
+
schema: ShareTokenPublicSchema,
|
|
9
|
+
auth: true
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export function listShares(objectId) {
|
|
13
|
+
return request({
|
|
14
|
+
method: "GET",
|
|
15
|
+
path: `/objects/${encodeURIComponent(objectId)}/shares`,
|
|
16
|
+
schema: ShareTokenListResponseSchema,
|
|
17
|
+
auth: true
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function revokeShare(tokenId) {
|
|
21
|
+
return request({
|
|
22
|
+
method: "DELETE",
|
|
23
|
+
path: `/shares/${encodeURIComponent(tokenId)}`,
|
|
24
|
+
auth: true
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolve a public share token to a presigned download URL. This route is
|
|
29
|
+
* public on the service, so no bearer token is attached.
|
|
30
|
+
*/
|
|
31
|
+
export function resolveShare(token) {
|
|
32
|
+
return request({
|
|
33
|
+
method: "GET",
|
|
34
|
+
path: `/shares/${encodeURIComponent(token)}`,
|
|
35
|
+
schema: DownloadUrlResponseSchema
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=shares.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shares.js","sourceRoot":"","sources":["../../../../src/runtime/api/shares.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EAKvB,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,OAAyB,EAAE;IAE3B,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,SAAS;QACvD,IAAI;QACJ,MAAM,EAAE,sBAAsB;QAC9B,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,SAAS;QACvD,MAAM,EAAE,4BAA4B;QACpC,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,WAAW,kBAAkB,CAAC,OAAO,CAAC,EAAE;QAC9C,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,WAAW,kBAAkB,CAAC,KAAK,CAAC,EAAE;QAC5C,MAAM,EAAE,yBAAyB;KAClC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type UploadCompleteRequest, type UploadCompleteResponse, type UploadInitiateRequest, type UploadInitiateResponse } from "../schemas.js";
|
|
2
|
+
export declare function initiateUpload(body: UploadInitiateRequest): Promise<UploadInitiateResponse>;
|
|
3
|
+
export declare function completeUpload(sessionId: string, body?: UploadCompleteRequest): Promise<UploadCompleteResponse>;
|
|
4
|
+
export declare function abortUpload(sessionId: string): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=uploads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../../../src/runtime/api/uploads.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC5B,MAAM,eAAe,CAAC;AAEvB,wBAAgB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAQ3F;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAQjC;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { request } from "../client.js";
|
|
2
|
+
import { UploadCompleteResponseSchema, UploadInitiateResponseSchema } from "../schemas.js";
|
|
3
|
+
export function initiateUpload(body) {
|
|
4
|
+
return request({
|
|
5
|
+
method: "POST",
|
|
6
|
+
path: "/uploads/initiate",
|
|
7
|
+
body,
|
|
8
|
+
schema: UploadInitiateResponseSchema,
|
|
9
|
+
auth: true
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export function completeUpload(sessionId, body = {}) {
|
|
13
|
+
return request({
|
|
14
|
+
method: "POST",
|
|
15
|
+
path: `/uploads/${encodeURIComponent(sessionId)}/complete`,
|
|
16
|
+
body,
|
|
17
|
+
schema: UploadCompleteResponseSchema,
|
|
18
|
+
auth: true
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export function abortUpload(sessionId) {
|
|
22
|
+
return request({
|
|
23
|
+
method: "POST",
|
|
24
|
+
path: `/uploads/${encodeURIComponent(sessionId)}/abort`,
|
|
25
|
+
auth: true
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=uploads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../../../src/runtime/api/uploads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAK7B,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,cAAc,CAAC,IAA2B;IACxD,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,mBAAmB;QACzB,IAAI;QACJ,MAAM,EAAE,4BAA4B;QACpC,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,OAA8B,EAAE;IAEhC,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,YAAY,kBAAkB,CAAC,SAAS,CAAC,WAAW;QAC1D,IAAI;QACJ,MAAM,EAAE,4BAA4B;QACpC,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,YAAY,kBAAkB,CAAC,SAAS,CAAC,QAAQ;QACvD,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type VariantGenerateRequest, type VariantJobPublic, type VariantListResponse } from "../schemas.js";
|
|
2
|
+
export declare function generateVariants(objectId: string, body: VariantGenerateRequest): Promise<VariantJobPublic>;
|
|
3
|
+
export declare function listVariants(objectId: string): Promise<VariantListResponse>;
|
|
4
|
+
export declare function getVariantJob(objectId: string, jobId: string): Promise<VariantJobPublic>;
|
|
5
|
+
export declare function deleteVariant(objectId: string, variantId: string): Promise<void>;
|
|
6
|
+
export type WaitForVariantJobOptions = {
|
|
7
|
+
intervalMs?: number;
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
signal?: AbortSignal;
|
|
10
|
+
onUpdate?: (job: VariantJobPublic) => void;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Poll a variant job until it reaches a terminal state (`completed`/`failed`),
|
|
14
|
+
* the timeout elapses, or the supplied signal aborts. Intervals/timeout default
|
|
15
|
+
* to the runtime polling config.
|
|
16
|
+
*/
|
|
17
|
+
export declare function waitForVariantJob(objectId: string, jobId: string, options?: WaitForVariantJobOptions): Promise<VariantJobPublic>;
|
|
18
|
+
//# sourceMappingURL=variants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../../src/runtime/api/variants.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EAErB,KAAK,mBAAmB,EACzB,MAAM,eAAe,CAAC;AAEvB,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAS3B;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAO3E;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAOxF;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhF;AAID,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,gBAAgB,CAAC,CAgB3B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { request } from "../client.js";
|
|
2
|
+
import { getMediaConfig } from "../config.js";
|
|
3
|
+
import { VariantJobPublicSchema, VariantListResponseSchema } from "../schemas.js";
|
|
4
|
+
export function generateVariants(objectId, body) {
|
|
5
|
+
return request({
|
|
6
|
+
method: "POST",
|
|
7
|
+
// Action sub-resource: the literal ":generate" suffix is part of the route.
|
|
8
|
+
path: `/objects/${encodeURIComponent(objectId)}/variants:generate`,
|
|
9
|
+
body,
|
|
10
|
+
schema: VariantJobPublicSchema,
|
|
11
|
+
auth: true
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export function listVariants(objectId) {
|
|
15
|
+
return request({
|
|
16
|
+
method: "GET",
|
|
17
|
+
path: `/objects/${encodeURIComponent(objectId)}/variants`,
|
|
18
|
+
schema: VariantListResponseSchema,
|
|
19
|
+
auth: true
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function getVariantJob(objectId, jobId) {
|
|
23
|
+
return request({
|
|
24
|
+
method: "GET",
|
|
25
|
+
path: `/objects/${encodeURIComponent(objectId)}/variants/jobs/${encodeURIComponent(jobId)}`,
|
|
26
|
+
schema: VariantJobPublicSchema,
|
|
27
|
+
auth: true
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export function deleteVariant(objectId, variantId) {
|
|
31
|
+
return request({
|
|
32
|
+
method: "DELETE",
|
|
33
|
+
path: `/objects/${encodeURIComponent(objectId)}/variants/${encodeURIComponent(variantId)}`,
|
|
34
|
+
auth: true
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const TERMINAL_JOB_STATES = new Set(["completed", "failed"]);
|
|
38
|
+
/**
|
|
39
|
+
* Poll a variant job until it reaches a terminal state (`completed`/`failed`),
|
|
40
|
+
* the timeout elapses, or the supplied signal aborts. Intervals/timeout default
|
|
41
|
+
* to the runtime polling config.
|
|
42
|
+
*/
|
|
43
|
+
export async function waitForVariantJob(objectId, jobId, options = {}) {
|
|
44
|
+
const polling = getMediaConfig().polling;
|
|
45
|
+
const intervalMs = options.intervalMs ?? polling.variantJobMs;
|
|
46
|
+
const timeoutMs = options.timeoutMs ?? polling.timeoutMs;
|
|
47
|
+
const deadline = Date.now() + timeoutMs;
|
|
48
|
+
for (;;) {
|
|
49
|
+
if (options.signal?.aborted)
|
|
50
|
+
throw new Error("Variant job polling aborted");
|
|
51
|
+
const job = await getVariantJob(objectId, jobId);
|
|
52
|
+
options.onUpdate?.(job);
|
|
53
|
+
if (TERMINAL_JOB_STATES.has(job.status))
|
|
54
|
+
return job;
|
|
55
|
+
if (Date.now() + intervalMs >= deadline) {
|
|
56
|
+
throw new Error("Timed out waiting for variant job to finish");
|
|
57
|
+
}
|
|
58
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=variants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variants.js","sourceRoot":"","sources":["../../../../src/runtime/api/variants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EAK1B,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,IAA4B;IAE5B,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,MAAM;QACd,4EAA4E;QAC5E,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,oBAAoB;QAClE,IAAI;QACJ,MAAM,EAAE,sBAAsB;QAC9B,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,WAAW;QACzD,MAAM,EAAE,yBAAyB;QACjC,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,KAAa;IAC3D,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,kBAAkB,kBAAkB,CAAC,KAAK,CAAC,EAAE;QAC3F,MAAM,EAAE,sBAAsB;QAC9B,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,SAAiB;IAC/D,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,aAAa,kBAAkB,CAAC,SAAS,CAAC,EAAE;QAC1F,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,mBAAmB,GAAkC,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AAS5F;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,KAAa,EACb,UAAoC,EAAE;IAEtC,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC,OAAO,CAAC;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;IAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,SAAS,CAAC;QACR,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,GAAG,CAAC;QACpD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,IAAI,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Narrow runtime contract the media plugin consumes for authentication.
|
|
3
|
+
*
|
|
4
|
+
* The media plugin never owns token storage or refresh logic; it delegates to
|
|
5
|
+
* whatever the host stack provides. `@fa-m8/astro-auth-m8` is the official
|
|
6
|
+
* provider, but any object that satisfies this shape works.
|
|
7
|
+
*/
|
|
8
|
+
export type MediaAuthAdapter = {
|
|
9
|
+
getAccessToken(): string | null | Promise<string | null>;
|
|
10
|
+
refresh?(): Promise<string | null>;
|
|
11
|
+
getUser?(): unknown | Promise<unknown>;
|
|
12
|
+
requireUser?(): Promise<unknown>;
|
|
13
|
+
isSuperuser?(user?: unknown): boolean;
|
|
14
|
+
hasRole?(role: string, user?: unknown): boolean;
|
|
15
|
+
onUnauthenticated?(reason: unknown): void;
|
|
16
|
+
};
|
|
17
|
+
export type InMemoryAuthAdapter = MediaAuthAdapter & {
|
|
18
|
+
/** Set or clear the in-memory access token (never persisted). */
|
|
19
|
+
setAccessToken(token: string | null): void;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Best-effort superuser detection that does not depend on a specific user
|
|
23
|
+
* shape: honours an explicit `is_superuser` flag, the configured admin role,
|
|
24
|
+
* or a `roles` array containing it.
|
|
25
|
+
*/
|
|
26
|
+
export declare function defaultIsSuperuser(user: unknown, adminRole?: string): boolean;
|
|
27
|
+
/** A self-contained adapter that holds the token in memory only. */
|
|
28
|
+
export declare function createInMemoryAuthAdapter(initialToken?: string | null): InMemoryAuthAdapter;
|
|
29
|
+
export type FaAuthBindings = {
|
|
30
|
+
getToken: () => string | null;
|
|
31
|
+
refreshToken?: () => Promise<{
|
|
32
|
+
access_token?: string;
|
|
33
|
+
} | string | null | undefined>;
|
|
34
|
+
getUser?: () => unknown | Promise<unknown>;
|
|
35
|
+
isSuperuser?: (user?: unknown) => boolean;
|
|
36
|
+
hasRole?: (role: string, user?: unknown) => boolean;
|
|
37
|
+
onUnauthenticated?: (reason: unknown) => void;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Build the official adapter from `@fa-m8/astro-auth-m8` bindings. The bindings
|
|
41
|
+
* are injected by the consumer so the media plugin keeps the auth plugin as an
|
|
42
|
+
* optional peer and never statically imports it.
|
|
43
|
+
*/
|
|
44
|
+
export declare function createFaAuthAdapter(bindings: FaAuthBindings): MediaAuthAdapter;
|
|
45
|
+
export declare function setMediaAuthAdapter(next: MediaAuthAdapter): MediaAuthAdapter;
|
|
46
|
+
export declare function getMediaAuthAdapter(): MediaAuthAdapter;
|
|
47
|
+
export declare function resetMediaAuthAdapter(): void;
|
|
48
|
+
//# sourceMappingURL=authAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authAdapter.d.ts","sourceRoot":"","sources":["../../../src/runtime/authAdapter.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,IAAI,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzD,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,WAAW,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACtC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAChD,iBAAiB,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG;IACnD,iEAAiE;IACjE,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CAC5C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,SAA6B,GAAG,OAAO,CAQjG;AAED,oEAAoE;AACpE,wBAAgB,yBAAyB,CAAC,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,mBAAmB,CASjG;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACpF,OAAO,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IACpD,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,gBAAgB,CAc9E;AAID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAG5E;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { getMediaConfig } from "./config.js";
|
|
2
|
+
/**
|
|
3
|
+
* Best-effort superuser detection that does not depend on a specific user
|
|
4
|
+
* shape: honours an explicit `is_superuser` flag, the configured admin role,
|
|
5
|
+
* or a `roles` array containing it.
|
|
6
|
+
*/
|
|
7
|
+
export function defaultIsSuperuser(user, adminRole = getMediaConfig().adminRole) {
|
|
8
|
+
if (!user || typeof user !== "object")
|
|
9
|
+
return false;
|
|
10
|
+
const record = user;
|
|
11
|
+
if (record.is_superuser === true)
|
|
12
|
+
return true;
|
|
13
|
+
if (adminRole !== "is_superuser" && typeof record.role === "string" && record.role === adminRole) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
return Array.isArray(record.roles) && record.roles.includes(adminRole);
|
|
17
|
+
}
|
|
18
|
+
/** A self-contained adapter that holds the token in memory only. */
|
|
19
|
+
export function createInMemoryAuthAdapter(initialToken = null) {
|
|
20
|
+
let token = initialToken;
|
|
21
|
+
return {
|
|
22
|
+
getAccessToken: () => token,
|
|
23
|
+
setAccessToken: (next) => {
|
|
24
|
+
token = next;
|
|
25
|
+
},
|
|
26
|
+
isSuperuser: (user) => defaultIsSuperuser(user)
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build the official adapter from `@fa-m8/astro-auth-m8` bindings. The bindings
|
|
31
|
+
* are injected by the consumer so the media plugin keeps the auth plugin as an
|
|
32
|
+
* optional peer and never statically imports it.
|
|
33
|
+
*/
|
|
34
|
+
export function createFaAuthAdapter(bindings) {
|
|
35
|
+
return {
|
|
36
|
+
getAccessToken: () => bindings.getToken(),
|
|
37
|
+
refresh: async () => {
|
|
38
|
+
if (!bindings.refreshToken)
|
|
39
|
+
return null;
|
|
40
|
+
const result = await bindings.refreshToken();
|
|
41
|
+
if (!result)
|
|
42
|
+
return null;
|
|
43
|
+
return typeof result === "string" ? result : result.access_token ?? null;
|
|
44
|
+
},
|
|
45
|
+
getUser: bindings.getUser,
|
|
46
|
+
isSuperuser: (user) => (bindings.isSuperuser ? bindings.isSuperuser(user) : defaultIsSuperuser(user)),
|
|
47
|
+
hasRole: bindings.hasRole,
|
|
48
|
+
onUnauthenticated: bindings.onUnauthenticated
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
let adapter = createInMemoryAuthAdapter();
|
|
52
|
+
export function setMediaAuthAdapter(next) {
|
|
53
|
+
adapter = next;
|
|
54
|
+
return adapter;
|
|
55
|
+
}
|
|
56
|
+
export function getMediaAuthAdapter() {
|
|
57
|
+
return adapter;
|
|
58
|
+
}
|
|
59
|
+
export function resetMediaAuthAdapter() {
|
|
60
|
+
adapter = createInMemoryAuthAdapter();
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=authAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authAdapter.js","sourceRoot":"","sources":["../../../src/runtime/authAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAwB7C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa,EAAE,SAAS,GAAG,cAAc,EAAE,CAAC,SAAS;IACtF,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,MAAM,GAAG,IAA+B,CAAC;IAC/C,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,SAAS,KAAK,cAAc,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACzE,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,yBAAyB,CAAC,eAA8B,IAAI;IAC1E,IAAI,KAAK,GAAG,YAAY,CAAC;IACzB,OAAO;QACL,cAAc,EAAE,GAAG,EAAE,CAAC,KAAK;QAC3B,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;QACD,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC;KAChD,CAAC;AACJ,CAAC;AAWD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAwB;IAC1D,OAAO;QACL,cAAc,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACzC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,YAAY;gBAAE,OAAO,IAAI,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC7C,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACrG,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;KAC9C,CAAC;AACJ,CAAC;AAED,IAAI,OAAO,GAAqB,yBAAyB,EAAE,CAAC;AAE5D,MAAM,UAAU,mBAAmB,CAAC,IAAsB;IACxD,OAAO,GAAG,IAAI,CAAC;IACf,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,GAAG,yBAAyB,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export * from "./api/index.js";
|
|
3
|
+
export type MediaRequestBase = "v1" | "legacy" | "absolute";
|
|
4
|
+
export type MediaRequestOptions<T> = {
|
|
5
|
+
method: "GET" | "POST" | "PATCH" | "PUT" | "DELETE";
|
|
6
|
+
base?: MediaRequestBase;
|
|
7
|
+
path: string;
|
|
8
|
+
query?: Record<string, string | number | boolean | null | undefined>;
|
|
9
|
+
body?: unknown;
|
|
10
|
+
headers?: Record<string, string>;
|
|
11
|
+
schema?: z.ZodType<T>;
|
|
12
|
+
auth?: boolean;
|
|
13
|
+
admin?: boolean;
|
|
14
|
+
skipRefresh?: boolean;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a request path against the configured bases. Most media routes live
|
|
18
|
+
* under `apiBase + v1Base`; dashboard/category live under `apiBase + legacyBase`.
|
|
19
|
+
* `absolute` is escaped for already-fully-qualified URLs. The protocol is pinned
|
|
20
|
+
* to http(s) so a crafted `path` can never smuggle in `javascript:`/`data:`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function mediaUrl(base: MediaRequestBase, path: string): string;
|
|
23
|
+
export declare function request<T>(options: MediaRequestOptions<T>): Promise<T>;
|
|
24
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/runtime/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,cAAc,gBAAgB,CAAC;AAE/B,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE5D,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACpD,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAYrE;AAED,wBAAsB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAmE5E"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { getMediaConfig } from "./config.js";
|
|
2
|
+
import { getMediaAuthAdapter } from "./authAdapter.js";
|
|
3
|
+
import { ApiError, ForbiddenError, messageFromDetail, normalizeFastApiError, UnauthenticatedError } from "./errors.js";
|
|
4
|
+
export * from "./api/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* Resolve a request path against the configured bases. Most media routes live
|
|
7
|
+
* under `apiBase + v1Base`; dashboard/category live under `apiBase + legacyBase`.
|
|
8
|
+
* `absolute` is escaped for already-fully-qualified URLs. The protocol is pinned
|
|
9
|
+
* to http(s) so a crafted `path` can never smuggle in `javascript:`/`data:`.
|
|
10
|
+
*/
|
|
11
|
+
export function mediaUrl(base, path) {
|
|
12
|
+
const config = getMediaConfig();
|
|
13
|
+
const origin = typeof window === "undefined" ? "http://localhost" : window.location.origin;
|
|
14
|
+
const full = base === "absolute"
|
|
15
|
+
? path
|
|
16
|
+
: `${config.apiBase}${base === "legacy" ? config.legacyBase : config.v1Base}${path}`;
|
|
17
|
+
const url = new URL(full, origin);
|
|
18
|
+
if (!["http:", "https:"].includes(url.protocol)) {
|
|
19
|
+
throw new Error("Unsupported media API protocol");
|
|
20
|
+
}
|
|
21
|
+
return url.toString();
|
|
22
|
+
}
|
|
23
|
+
export async function request(options) {
|
|
24
|
+
const config = getMediaConfig();
|
|
25
|
+
const adapter = getMediaAuthAdapter();
|
|
26
|
+
// Guard admin calls before they hit the network when the user is known, so a
|
|
27
|
+
// non-superuser never even emits the request.
|
|
28
|
+
if (options.admin && adapter.getUser && adapter.isSuperuser) {
|
|
29
|
+
const user = await adapter.getUser();
|
|
30
|
+
if (user != null && !adapter.isSuperuser(user)) {
|
|
31
|
+
throw new ForbiddenError();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const url = new URL(mediaUrl(options.base ?? "v1", options.path));
|
|
35
|
+
for (const [key, value] of Object.entries(options.query ?? {})) {
|
|
36
|
+
if (value != null)
|
|
37
|
+
url.searchParams.set(key, String(value));
|
|
38
|
+
}
|
|
39
|
+
const headers = new Headers({
|
|
40
|
+
[config.csrfHeader]: "XMLHttpRequest",
|
|
41
|
+
...options.headers
|
|
42
|
+
});
|
|
43
|
+
if (options.auth) {
|
|
44
|
+
const token = await adapter.getAccessToken();
|
|
45
|
+
if (token)
|
|
46
|
+
headers.set("Authorization", `Bearer ${token}`);
|
|
47
|
+
}
|
|
48
|
+
let body;
|
|
49
|
+
if (options.body !== undefined) {
|
|
50
|
+
headers.set("Content-Type", "application/json");
|
|
51
|
+
body = JSON.stringify(options.body);
|
|
52
|
+
}
|
|
53
|
+
const execute = () => fetch(url.toString(), { method: options.method, headers, body, credentials: "include" });
|
|
54
|
+
let response = await execute();
|
|
55
|
+
if (response.status === 401 && !options.skipRefresh) {
|
|
56
|
+
const refreshed = adapter.refresh ? await adapter.refresh() : null;
|
|
57
|
+
if (refreshed) {
|
|
58
|
+
headers.set("Authorization", `Bearer ${refreshed}`);
|
|
59
|
+
response = await execute();
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
adapter.onUnauthenticated?.("refresh-failed");
|
|
63
|
+
throw new UnauthenticatedError("Session expired. Please sign in again.");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
if (response.status === 401) {
|
|
68
|
+
adapter.onUnauthenticated?.("unauthenticated");
|
|
69
|
+
throw new UnauthenticatedError();
|
|
70
|
+
}
|
|
71
|
+
let detail;
|
|
72
|
+
try {
|
|
73
|
+
detail = normalizeFastApiError(await response.clone().json());
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
detail = await response.text();
|
|
77
|
+
}
|
|
78
|
+
if (response.status === 403 && options.admin) {
|
|
79
|
+
throw new ForbiddenError(messageFromDetail(detail));
|
|
80
|
+
}
|
|
81
|
+
throw new ApiError(response.status, detail);
|
|
82
|
+
}
|
|
83
|
+
if (response.status === 204 || !options.schema)
|
|
84
|
+
return undefined;
|
|
85
|
+
return options.schema.parse(await response.json());
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/runtime/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const MEDIA_SERVICE_M8_CONTRACT_ID = "media-service-m8";
|
|
2
|
+
export declare const MEDIA_SERVICE_M8_CONTRACT_VERSION = "0.0";
|
|
3
|
+
export declare const MEDIA_SERVICE_M8_CONTRACT: "media-service-m8@0.0";
|
|
4
|
+
export declare const MEDIA_SERVICE_M8_TESTED_SERVICE_VERSION = "0.0.10";
|
|
5
|
+
export declare const MEDIA_SERVICE_M8_MIN_SERVICE_VERSION = "0.0.10";
|
|
6
|
+
export declare const MEDIA_SERVICE_M8_MAX_SERVICE_VERSION_EXCLUSIVE = "0.1.0";
|
|
7
|
+
export declare const MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE = ">=0.0.10 <0.1.0";
|
|
8
|
+
export type MediaServiceM8CompatibilityStatus = "compatible" | "incompatible" | "unknown";
|
|
9
|
+
export type MediaServiceM8VersionMetadata = {
|
|
10
|
+
contract?: unknown;
|
|
11
|
+
contract_version?: unknown;
|
|
12
|
+
media_contract?: unknown;
|
|
13
|
+
media_contract_version?: unknown;
|
|
14
|
+
media_service_m8_contract?: unknown;
|
|
15
|
+
version?: unknown;
|
|
16
|
+
service_version?: unknown;
|
|
17
|
+
media_service_m8_version?: unknown;
|
|
18
|
+
service?: unknown;
|
|
19
|
+
api_version?: unknown;
|
|
20
|
+
};
|
|
21
|
+
export type MediaServiceM8Compatibility = {
|
|
22
|
+
status: MediaServiceM8CompatibilityStatus;
|
|
23
|
+
expectedContract: typeof MEDIA_SERVICE_M8_CONTRACT;
|
|
24
|
+
expectedServiceVersionRange: typeof MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE;
|
|
25
|
+
contractVersion?: string;
|
|
26
|
+
serviceVersion?: string;
|
|
27
|
+
reason?: string;
|
|
28
|
+
};
|
|
29
|
+
export declare function isMediaServiceM8ServiceVersionCompatible(version: string): boolean;
|
|
30
|
+
export declare function getMediaServiceM8Compatibility(metadata?: MediaServiceM8VersionMetadata): MediaServiceM8Compatibility;
|
|
31
|
+
export declare function assertMediaServiceM8Compatibility(metadata: MediaServiceM8VersionMetadata, requireKnown?: boolean): MediaServiceM8Compatibility;
|
|
32
|
+
//# sourceMappingURL=compatibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility.d.ts","sourceRoot":"","sources":["../../../src/runtime/compatibility.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,qBAAqB,CAAC;AAG/D,eAAO,MAAM,iCAAiC,QAAQ,CAAC;AACvD,eAAO,MAAM,yBAAyB,wBAAkF,CAAC;AAGzH,eAAO,MAAM,uCAAuC,WAAW,CAAC;AAChE,eAAO,MAAM,oCAAoC,WAAW,CAAC;AAC7D,eAAO,MAAM,8CAA8C,UAAU,CAAC;AACtE,eAAO,MAAM,sCAAsC,oBAAiG,CAAC;AAErJ,MAAM,MAAM,iCAAiC,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC;AAE1F,MAAM,MAAM,6BAA6B,GAAG;IAG1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAEnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE,iCAAiC,CAAC;IAC1C,gBAAgB,EAAE,OAAO,yBAAyB,CAAC;IACnD,2BAA2B,EAAE,OAAO,sCAAsC,CAAC;IAC3E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AA+BF,wBAAgB,wCAAwC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAIjF;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,GAAE,6BAAkC,GAC3C,2BAA2B,CAuD7B;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,6BAA6B,EACvC,YAAY,UAAO,GAClB,2BAA2B,CAM7B"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
export const MEDIA_SERVICE_M8_CONTRACT_ID = "media-service-m8";
|
|
2
|
+
// Pre-1.0 contract: tracks the service package major.minor (0.0.x), not an
|
|
3
|
+
// aspirational 1.0 — kept in lockstep with media-service-m8's CONTRACT_VERSION.
|
|
4
|
+
export const MEDIA_SERVICE_M8_CONTRACT_VERSION = "0.0";
|
|
5
|
+
export const MEDIA_SERVICE_M8_CONTRACT = `${MEDIA_SERVICE_M8_CONTRACT_ID}@${MEDIA_SERVICE_M8_CONTRACT_VERSION}`;
|
|
6
|
+
// 0.0.10 is the first media-service-m8 release supporting the media library's
|
|
7
|
+
// filename/category/status server-side sorting contract.
|
|
8
|
+
export const MEDIA_SERVICE_M8_TESTED_SERVICE_VERSION = "0.0.10";
|
|
9
|
+
export const MEDIA_SERVICE_M8_MIN_SERVICE_VERSION = "0.0.10";
|
|
10
|
+
export const MEDIA_SERVICE_M8_MAX_SERVICE_VERSION_EXCLUSIVE = "0.1.0";
|
|
11
|
+
export const MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE = `>=${MEDIA_SERVICE_M8_MIN_SERVICE_VERSION} <${MEDIA_SERVICE_M8_MAX_SERVICE_VERSION_EXCLUSIVE}`;
|
|
12
|
+
function stringValue(value) {
|
|
13
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
14
|
+
}
|
|
15
|
+
// Read ``contract.version`` from the GET /meta nested contract object.
|
|
16
|
+
function contractObjectVersion(value) {
|
|
17
|
+
if (typeof value === "object" && value !== null) {
|
|
18
|
+
return stringValue(value.version);
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
function parseSemver(version) {
|
|
23
|
+
const match = /^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/.exec(version);
|
|
24
|
+
if (!match)
|
|
25
|
+
return undefined;
|
|
26
|
+
return [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
27
|
+
}
|
|
28
|
+
function compareSemver(left, right) {
|
|
29
|
+
const parsedLeft = parseSemver(left);
|
|
30
|
+
const parsedRight = parseSemver(right);
|
|
31
|
+
if (!parsedLeft || !parsedRight)
|
|
32
|
+
return undefined;
|
|
33
|
+
for (let index = 0; index < parsedLeft.length; index += 1) {
|
|
34
|
+
if (parsedLeft[index] > parsedRight[index])
|
|
35
|
+
return 1;
|
|
36
|
+
if (parsedLeft[index] < parsedRight[index])
|
|
37
|
+
return -1;
|
|
38
|
+
}
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
export function isMediaServiceM8ServiceVersionCompatible(version) {
|
|
42
|
+
const aboveMin = compareSemver(version, MEDIA_SERVICE_M8_MIN_SERVICE_VERSION);
|
|
43
|
+
const belowMax = compareSemver(version, MEDIA_SERVICE_M8_MAX_SERVICE_VERSION_EXCLUSIVE);
|
|
44
|
+
return aboveMin !== undefined && belowMax !== undefined && aboveMin >= 0 && belowMax < 0;
|
|
45
|
+
}
|
|
46
|
+
export function getMediaServiceM8Compatibility(metadata = {}) {
|
|
47
|
+
const contractVersion = stringValue(metadata.media_contract_version) ??
|
|
48
|
+
stringValue(metadata.contract_version) ??
|
|
49
|
+
stringValue(metadata.media_service_m8_contract) ??
|
|
50
|
+
stringValue(metadata.media_contract) ??
|
|
51
|
+
contractObjectVersion(metadata.contract) ??
|
|
52
|
+
stringValue(metadata.contract);
|
|
53
|
+
const serviceVersion = stringValue(metadata.media_service_m8_version) ??
|
|
54
|
+
stringValue(metadata.service_version) ??
|
|
55
|
+
stringValue(metadata.version);
|
|
56
|
+
if (contractVersion &&
|
|
57
|
+
contractVersion !== MEDIA_SERVICE_M8_CONTRACT_VERSION &&
|
|
58
|
+
contractVersion !== MEDIA_SERVICE_M8_CONTRACT) {
|
|
59
|
+
return {
|
|
60
|
+
status: "incompatible",
|
|
61
|
+
expectedContract: MEDIA_SERVICE_M8_CONTRACT,
|
|
62
|
+
expectedServiceVersionRange: MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE,
|
|
63
|
+
contractVersion,
|
|
64
|
+
serviceVersion,
|
|
65
|
+
reason: `Expected ${MEDIA_SERVICE_M8_CONTRACT}, received ${contractVersion}`
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (serviceVersion && !isMediaServiceM8ServiceVersionCompatible(serviceVersion)) {
|
|
69
|
+
return {
|
|
70
|
+
status: "incompatible",
|
|
71
|
+
expectedContract: MEDIA_SERVICE_M8_CONTRACT,
|
|
72
|
+
expectedServiceVersionRange: MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE,
|
|
73
|
+
contractVersion,
|
|
74
|
+
serviceVersion,
|
|
75
|
+
reason: `Expected media-service-m8 service version ${MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE}, received ${serviceVersion}`
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
if (contractVersion || serviceVersion) {
|
|
79
|
+
return {
|
|
80
|
+
status: "compatible",
|
|
81
|
+
expectedContract: MEDIA_SERVICE_M8_CONTRACT,
|
|
82
|
+
expectedServiceVersionRange: MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE,
|
|
83
|
+
contractVersion,
|
|
84
|
+
serviceVersion
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
status: "unknown",
|
|
89
|
+
expectedContract: MEDIA_SERVICE_M8_CONTRACT,
|
|
90
|
+
expectedServiceVersionRange: MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE,
|
|
91
|
+
reason: "No media-service-m8 contract or service version metadata was provided"
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export function assertMediaServiceM8Compatibility(metadata, requireKnown = true) {
|
|
95
|
+
const compatibility = getMediaServiceM8Compatibility(metadata);
|
|
96
|
+
if (compatibility.status === "incompatible" || (requireKnown && compatibility.status === "unknown")) {
|
|
97
|
+
throw new Error(compatibility.reason);
|
|
98
|
+
}
|
|
99
|
+
return compatibility;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=compatibility.js.map
|