Merge pull request #1143 from dfpc-coe/publish-to-tak

Publish to TAK
This commit is contained in:
Nick
2025-12-16 16:45:42 -07:00
committed by GitHub
18 changed files with 3943 additions and 982 deletions

View File

@@ -443,6 +443,7 @@ export default class VideoServiceControl {
recording: boolean;
publish: boolean;
secure: boolean;
share: boolean;
channel?: string | null;
proxy?: string | null;
}): Promise<Static<typeof VideoLeaseResponse>> {
@@ -453,6 +454,10 @@ export default class VideoServiceControl {
if (opts.username && opts.connection) {
throw new Err(400, null, 'Either username or connection must be set but not both');
} else if (opts.share && !opts.channel) {
throw new Err(400, null, 'Channel must be set when share is true');
} else if (opts.publish && !opts.channel) {
throw new Err(400, null, 'Channel must be set when publish is true');
}
const lease = await this.config.models.VideoLease.generate({
@@ -468,6 +473,7 @@ export default class VideoServiceControl {
username: opts.username,
connection: opts.connection,
layer: opts.layer,
share: opts.share,
channel: opts.channel,
proxy: opts.proxy
});
@@ -479,6 +485,37 @@ export default class VideoServiceControl {
headers.append('Content-Type', 'application/json');
if (lease.publish) {
const auth = this.config.serverCert();
const api = await TAKAPI.init(
new URL(String(this.config.server.api)),
new APIAuthCertificate(auth.cert, auth.key)
);
try {
const protocols = await this.protocols(lease, ProtocolPopulation.READ)
if (protocols.hls) {
await api.Video.create({
uuid: lease.path,
active: true,
alias: lease.name,
groups: [ lease.channel! ],
feeds: [{
uuid: lease.path,
active: true,
alias: lease.name,
url: protocols.hls.url,
}]
})
} else {
throw new Err(400, null, 'Only HLS shared video streams are supported at this time');
}
} catch (err) {
console.error(err);
}
}
if (lease.proxy) {
try {
const proxy = new URL(lease.proxy);
@@ -574,7 +611,7 @@ export default class VideoServiceControl {
const groups = (await api.Group.list({ useCache: true }))
.data.map((group) => group.name);
if (lease.username !== opts.username && (!lease.channel || !groups.includes(lease.channel))) {
if (lease.username !== opts.username && (!lease.share || !lease.channel || !groups.includes(lease.channel))) {
throw new Err(400, null, 'You can only access a lease you created or that is assigned to a channel you are in');
}
@@ -590,6 +627,7 @@ export default class VideoServiceControl {
body: {
name?: string,
channel?: string | null,
share?: boolean,
secure?: boolean,
secure_rotate?: boolean
expiration?: string | null,
@@ -615,6 +653,18 @@ export default class VideoServiceControl {
throw new Err(400, null, 'Lease must be edited in the context of a Connection');
} else if (lease.username && !opts.username) {
throw new Err(400, null, 'Lease must be edited in the context of the CloudTAK Map');
} else if (
(body.share && body.channel === undefined && !lease.channel)
|| (body.share && body.channel === null)
|| (lease.share && body.channel === null)
) {
throw new Err(400, null, 'Channel must be set when share is true');
} else if (
(body.publish && body.channel === undefined && !lease.channel)
|| (body.publish && body.channel === null)
|| (lease.publish && body.channel === null)
) {
throw new Err(400, null, 'Channel must be set when publish is true');
}
if (body.secure !== undefined) {
@@ -624,6 +674,46 @@ export default class VideoServiceControl {
lease = await this.config.models.VideoLease.commit(leaseid, body);
try {
const auth = this.config.serverCert();
const api = await TAKAPI.init(
new URL(String(this.config.server.api)),
new APIAuthCertificate(auth.cert, auth.key)
);
try {
await api.Video.delete(lease.path);
} catch (err) {
console.error(err);
}
// We can't change channels so just delete and recreate
try {
const protocols = await this.protocols(lease, ProtocolPopulation.READ)
if (protocols.hls) {
await api.Video.create({
uuid: lease.path,
active: true,
alias: lease.name,
groups: [ lease.channel! ],
feeds: [{
uuid: lease.path,
active: true,
alias: lease.name,
url: protocols.hls.url,
}]
})
} else {
throw new Err(400, null, 'Only HLS shared video streams are supported at this time');
}
} catch (err) {
console.error(err);
}
} catch (err) {
console.error(err);
}
try {
await this.path(lease.path);
@@ -754,6 +844,18 @@ export default class VideoServiceControl {
headers,
})
try {
const auth = this.config.serverCert();
const api = await TAKAPI.init(
new URL(String(this.config.server.api)),
new APIAuthCertificate(auth.cert, auth.key)
);
await api.Video.delete(lease.path);
} catch (err) {
console.error(err);
}
return;
}
}

View File

@@ -128,6 +128,7 @@ export const VideoLease = pgTable('video_lease', {
// Publish to the TAK Server Video Config API
publish: boolean().notNull().default(false),
recording: boolean().notNull().default(false),
share: boolean().notNull().default(false),
ephemeral: boolean().notNull().default(false),
channel: text().default(sql`null`),

View File

@@ -0,0 +1,3 @@
ALTER TABLE "video_lease" ADD COLUMN "share" boolean DEFAULT false NOT NULL;
UPDATE "video_lease" SET "share" = true WHERE "channel" IS NOT NULL;

View File

File diff suppressed because it is too large Load Diff

View File

@@ -974,6 +974,13 @@
"when": 1765830173974,
"tag": "0138_pink_lockjaw",
"breakpoints": true
},
{
"idx": 139,
"version": "7",
"when": 1765841295112,
"tag": "0139_square_lionheart",
"breakpoints": true
}
]
}

1330
api/package-lock.json generated
View File

File diff suppressed because it is too large Load Diff

View File

@@ -103,7 +103,7 @@
"@types/memjs": "^1.3.0",
"@types/minimist": "^1.2.2",
"@types/morgan": "^1.9.9",
"@types/node": "^24.0.0",
"@types/node": "^25.0.0",
"@types/pem": "^1.9.6",
"@types/pg": "^8.6.6",
"@types/qr-image": "^3.2.9",
@@ -125,4 +125,4 @@
"typescript": "^5.0.0",
"typescript-eslint": "^8.0.0"
}
}
}

View File

@@ -174,6 +174,10 @@ export default async function router(schema: Schema, config: Config) {
default: false,
description: 'Publish stream URL to TAK Server Video Manager'
}),
share: Type.Boolean({
default: false,
description: 'Allow other users to manage lease if they are also members of the channel'
}),
secure: Type.Boolean({
default: false,
description: 'Increase stream security by enforcing a seperate read and write username/password'
@@ -216,6 +220,7 @@ export default async function router(schema: Schema, config: Config) {
source_type: req.body.source_type,
source_model: req.body.source_model,
recording: req.body.recording,
share: req.body.share,
publish: req.body.publish,
path: randomUUID(),
secure: req.body.secure,
@@ -252,6 +257,9 @@ export default async function router(schema: Schema, config: Config) {
source_model: Type.Optional(Type.String()),
channel: Type.Optional(Type.Union([Type.String(), Type.Null()])),
secure: Type.Optional(Type.Boolean()),
share: Type.Optional(Type.Boolean({
description: 'Allow other users to manage lease if they are also members of the channel'
})),
secure_rotate: Type.Boolean({
default: false,
description: 'Rotate Read-User Credentials if using seperate read/write user - infers secure: true'
@@ -312,6 +320,7 @@ export default async function router(schema: Schema, config: Config) {
secure_rotate: req.body.secure_rotate,
expiration,
recording: req.body.recording,
share: req.body.share,
publish: req.body.publish,
source_id: req.body.source_id,
source_type: req.body.source_type,

View File

@@ -398,6 +398,10 @@ export default async function router(schema: Schema, config: Config) {
default: false,
description: 'Publish stream URL to TAK Server Video Manager'
}),
share: Type.Boolean({
default: false,
description: 'Allow other users to manage lease if they are also members of the channel'
}),
secure: Type.Boolean({
default: false,
description: 'Increase stream security by enforcing a seperate read and write username/password'
@@ -423,6 +427,7 @@ export default async function router(schema: Schema, config: Config) {
name: req.body.name,
ephemeral: req.body.ephemeral,
channel: req.body.channel,
share: req.body.share,
expiration: req.body.permanent ? null : moment().add(req.body.duration, 'seconds').toISOString(),
source_id: req.body.source_id,
source_type: req.body.source_type,
@@ -460,16 +465,18 @@ export default async function router(schema: Schema, config: Config) {
source_model: Type.Optional(Type.String()),
channel: Type.Optional(Type.Union([Type.String(), Type.Null()])),
secure: Type.Optional(Type.Boolean()),
recording: Type.Boolean({
recording: Type.Optional(Type.Boolean({
description: 'Record streams to disk'
}),
publish: Type.Boolean({
})),
publish: Type.Optional(Type.Boolean({
description: 'Publish stream URL to TAK Server Video Manager'
}),
permanent: Type.Boolean({
default: false,
})),
share: Type.Optional(Type.Boolean({
description: 'Allow other users to manage lease if they are also members of the channel'
})),
permanent: Type.Optional(Type.Boolean({
description: 'System Admins can create non-expiring leases'
}),
})),
proxy: Type.Optional(Type.String())
}),
res: VideoLeaseResponse
@@ -486,6 +493,7 @@ export default async function router(schema: Schema, config: Config) {
const lease = await videoControl.commit(req.params.lease, {
name: req.body.name,
channel: req.body.channel ? req.body.channel : null,
share: req.body.share,
secure: req.body.secure,
recording: req.body.recording,
publish: req.body.publish,

View File

@@ -1,12 +1,12 @@
{
"name": "@tak-ps/CloudTAK.web",
"version": "12.27.2",
"version": "12.29.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@tak-ps/CloudTAK.web",
"version": "12.27.2",
"version": "12.29.0",
"dependencies": {
"@react-hookz/deep-equal": "^3.0.3",
"@tabler/core": "^1.4.0",
@@ -78,7 +78,7 @@
"vue-tsc": "^3.0.0-alpha.10"
},
"engines": {
"node": ">= 22"
"node": ">= 24"
}
},
"node_modules/@acemir/cssom": {
@@ -89,9 +89,9 @@
"license": "MIT"
},
"node_modules/@asamuzakjp/css-color": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.0.tgz",
"integrity": "sha512-9xiBAtLn4aNsa4mDnpovJvBn72tNEIACyvlqaNJ+ADemR+yeMJWnBudOi2qGDviJa7SwcDOU/TRh5dnET7qk0w==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.1.tgz",
"integrity": "sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -99,7 +99,7 @@
"@csstools/css-color-parser": "^3.1.0",
"@csstools/css-parser-algorithms": "^3.0.5",
"@csstools/css-tokenizer": "^3.0.4",
"lru-cache": "^11.2.2"
"lru-cache": "^11.2.4"
}
},
"node_modules/@asamuzakjp/dom-selector": {
@@ -1669,9 +1669,9 @@
"license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.4.tgz",
"integrity": "sha512-PWU3Y92H4DD0bOqorEPp1Y0tbzwAurFmIYpjcObv5axGVOtcTlB0b2UKMd2echo08MgN7jO8WQZSSysvfisFSQ==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.5.tgz",
"integrity": "sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==",
"cpu": [
"arm"
],
@@ -1683,9 +1683,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.4.tgz",
"integrity": "sha512-Gw0/DuVm3rGsqhMGYkSOXXIx20cC3kTlivZeuaGt4gEgILivykNyBWxeUV5Cf2tDA2nPLah26vq3emlRrWVbng==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.5.tgz",
"integrity": "sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==",
"cpu": [
"arm64"
],
@@ -1697,9 +1697,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.4.tgz",
"integrity": "sha512-+w06QvXsgzKwdVg5qRLZpTHh1bigHZIqoIUPtiqh05ZiJVUQ6ymOxaPkXTvRPRLH88575ZCRSRM3PwIoNma01Q==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.5.tgz",
"integrity": "sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==",
"cpu": [
"arm64"
],
@@ -1711,9 +1711,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.4.tgz",
"integrity": "sha512-EB4Na9G2GsrRNRNFPuxfwvDRDUwQEzJPpiK1vo2zMVhEeufZ1k7J1bKnT0JYDfnPC7RNZ2H5YNQhW6/p2QKATw==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.5.tgz",
"integrity": "sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==",
"cpu": [
"x64"
],
@@ -1725,9 +1725,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.4.tgz",
"integrity": "sha512-bldA8XEqPcs6OYdknoTMaGhjytnwQ0NClSPpWpmufOuGPN5dDmvIa32FygC2gneKK4A1oSx86V1l55hyUWUYFQ==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.5.tgz",
"integrity": "sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==",
"cpu": [
"arm64"
],
@@ -1739,9 +1739,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.4.tgz",
"integrity": "sha512-3T8GPjH6mixCd0YPn0bXtcuSXi1Lj+15Ujw2CEb7dd24j9thcKscCf88IV7n76WaAdorOzAgSSbuVRg4C8V8Qw==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.5.tgz",
"integrity": "sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==",
"cpu": [
"x64"
],
@@ -1753,9 +1753,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.4.tgz",
"integrity": "sha512-UPMMNeC4LXW7ZSHxeP3Edv09aLsFUMaD1TSVW6n1CWMECnUIJMFFB7+XC2lZTdPtvB36tYC0cJWc86mzSsaviw==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.5.tgz",
"integrity": "sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==",
"cpu": [
"arm"
],
@@ -1767,9 +1767,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.4.tgz",
"integrity": "sha512-H8uwlV0otHs5Q7WAMSoyvjV9DJPiy5nJ/xnHolY0QptLPjaSsuX7tw+SPIfiYH6cnVx3fe4EWFafo6gH6ekZKA==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.5.tgz",
"integrity": "sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==",
"cpu": [
"arm"
],
@@ -1781,9 +1781,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.4.tgz",
"integrity": "sha512-BLRwSRwICXz0TXkbIbqJ1ibK+/dSBpTJqDClF61GWIrxTXZWQE78ROeIhgl5MjVs4B4gSLPCFeD4xML9vbzvCQ==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.5.tgz",
"integrity": "sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==",
"cpu": [
"arm64"
],
@@ -1795,9 +1795,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.4.tgz",
"integrity": "sha512-6bySEjOTbmVcPJAywjpGLckK793A0TJWSbIa0sVwtVGfe/Nz6gOWHOwkshUIAp9j7wg2WKcA4Snu7Y1nUZyQew==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.5.tgz",
"integrity": "sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==",
"cpu": [
"arm64"
],
@@ -1809,9 +1809,9 @@
]
},
"node_modules/@rollup/rollup-linux-loong64-gnu": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.4.tgz",
"integrity": "sha512-U0ow3bXYJZ5MIbchVusxEycBw7bO6C2u5UvD31i5IMTrnt2p4Fh4ZbHSdc/31TScIJQYHwxbj05BpevB3201ug==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.5.tgz",
"integrity": "sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==",
"cpu": [
"loong64"
],
@@ -1823,9 +1823,9 @@
]
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.4.tgz",
"integrity": "sha512-iujDk07ZNwGLVn0YIWM80SFN039bHZHCdCCuX9nyx3Jsa2d9V/0Y32F+YadzwbvDxhSeVo9zefkoPnXEImnM5w==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.5.tgz",
"integrity": "sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==",
"cpu": [
"ppc64"
],
@@ -1837,9 +1837,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.4.tgz",
"integrity": "sha512-MUtAktiOUSu+AXBpx1fkuG/Bi5rhlorGs3lw5QeJ2X3ziEGAq7vFNdWVde6XGaVqi0LGSvugwjoxSNJfHFTC0g==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.5.tgz",
"integrity": "sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==",
"cpu": [
"riscv64"
],
@@ -1851,9 +1851,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.4.tgz",
"integrity": "sha512-btm35eAbDfPtcFEgaXCI5l3c2WXyzwiE8pArhd66SDtoLWmgK5/M7CUxmUglkwtniPzwvWioBKKl6IXLbPf2sQ==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.5.tgz",
"integrity": "sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==",
"cpu": [
"riscv64"
],
@@ -1865,9 +1865,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.4.tgz",
"integrity": "sha512-uJlhKE9ccUTCUlK+HUz/80cVtx2RayadC5ldDrrDUFaJK0SNb8/cCmC9RhBhIWuZ71Nqj4Uoa9+xljKWRogdhA==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.5.tgz",
"integrity": "sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==",
"cpu": [
"s390x"
],
@@ -1879,9 +1879,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.4.tgz",
"integrity": "sha512-jjEMkzvASQBbzzlzf4os7nzSBd/cvPrpqXCUOqoeCh1dQ4BP3RZCJk8XBeik4MUln3m+8LeTJcY54C/u8wb3DQ==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.5.tgz",
"integrity": "sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==",
"cpu": [
"x64"
],
@@ -1893,9 +1893,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.4.tgz",
"integrity": "sha512-lu90KG06NNH19shC5rBPkrh6mrTpq5kviFylPBXQVpdEu0yzb0mDgyxLr6XdcGdBIQTH/UAhDJnL+APZTBu1aQ==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.5.tgz",
"integrity": "sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==",
"cpu": [
"x64"
],
@@ -1907,9 +1907,9 @@
]
},
"node_modules/@rollup/rollup-openharmony-arm64": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.4.tgz",
"integrity": "sha512-dFDcmLwsUzhAm/dn0+dMOQZoONVYBtgik0VuY/d5IJUUb787L3Ko/ibvTvddqhb3RaB7vFEozYevHN4ox22R/w==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.5.tgz",
"integrity": "sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==",
"cpu": [
"arm64"
],
@@ -1921,9 +1921,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.4.tgz",
"integrity": "sha512-WvUpUAWmUxZKtRnQWpRKnLW2DEO8HB/l8z6oFFMNuHndMzFTJEXzaYJ5ZAmzNw0L21QQJZsUQFt2oPf3ykAD/w==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.5.tgz",
"integrity": "sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==",
"cpu": [
"arm64"
],
@@ -1935,9 +1935,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.4.tgz",
"integrity": "sha512-JGbeF2/FDU0x2OLySw/jgvkwWUo05BSiJK0dtuI4LyuXbz3wKiC1xHhLB1Tqm5VU6ZZDmAorj45r/IgWNWku5g==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.5.tgz",
"integrity": "sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==",
"cpu": [
"ia32"
],
@@ -1949,9 +1949,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-gnu": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.4.tgz",
"integrity": "sha512-zuuC7AyxLWLubP+mlUwEyR8M1ixW1ERNPHJfXm8x7eQNP4Pzkd7hS3qBuKBR70VRiQ04Kw8FNfRMF5TNxuZq2g==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.5.tgz",
"integrity": "sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==",
"cpu": [
"x64"
],
@@ -1963,9 +1963,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.4.tgz",
"integrity": "sha512-Sbx45u/Lbb5RyptSbX7/3deP+/lzEmZ0BTSHxwxN/IMOZDZf8S0AGo0hJD5n/LQssxb5Z3B4og4P2X6Dd8acCA==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.5.tgz",
"integrity": "sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==",
"cpu": [
"x64"
],
@@ -3090,16 +3090,16 @@
}
},
"node_modules/@vitest/expect": {
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.15.tgz",
"integrity": "sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==",
"version": "4.0.16",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.16.tgz",
"integrity": "sha512-eshqULT2It7McaJkQGLkPjPjNph+uevROGuIMJdG3V+0BSR2w9u6J9Lwu+E8cK5TETlfou8GRijhafIMhXsimA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
"@types/chai": "^5.2.2",
"@vitest/spy": "4.0.15",
"@vitest/utils": "4.0.15",
"@vitest/spy": "4.0.16",
"@vitest/utils": "4.0.16",
"chai": "^6.2.1",
"tinyrainbow": "^3.0.3"
},
@@ -3108,13 +3108,13 @@
}
},
"node_modules/@vitest/mocker": {
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.15.tgz",
"integrity": "sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==",
"version": "4.0.16",
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.16.tgz",
"integrity": "sha512-yb6k4AZxJTB+q9ycAvsoxGn+j/po0UaPgajllBgt1PzoMAAmJGYFdDk0uCcRcxb3BrME34I6u8gHZTQlkqSZpg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/spy": "4.0.15",
"@vitest/spy": "4.0.16",
"estree-walker": "^3.0.3",
"magic-string": "^0.30.21"
},
@@ -3135,9 +3135,9 @@
}
},
"node_modules/@vitest/pretty-format": {
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.15.tgz",
"integrity": "sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==",
"version": "4.0.16",
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.16.tgz",
"integrity": "sha512-eNCYNsSty9xJKi/UdVD8Ou16alu7AYiS2fCPRs0b1OdhJiV89buAXQLpTbe+X8V9L6qrs9CqyvU7OaAopJYPsA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3148,13 +3148,13 @@
}
},
"node_modules/@vitest/runner": {
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.15.tgz",
"integrity": "sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==",
"version": "4.0.16",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.16.tgz",
"integrity": "sha512-VWEDm5Wv9xEo80ctjORcTQRJ539EGPB3Pb9ApvVRAY1U/WkHXmmYISqU5E79uCwcW7xYUV38gwZD+RV755fu3Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/utils": "4.0.15",
"@vitest/utils": "4.0.16",
"pathe": "^2.0.3"
},
"funding": {
@@ -3162,13 +3162,13 @@
}
},
"node_modules/@vitest/snapshot": {
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.15.tgz",
"integrity": "sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==",
"version": "4.0.16",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.16.tgz",
"integrity": "sha512-sf6NcrYhYBsSYefxnry+DR8n3UV4xWZwWxYbCJUt2YdvtqzSPR7VfGrY0zsv090DAbjFZsi7ZaMi1KnSRyK1XA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/pretty-format": "4.0.15",
"@vitest/pretty-format": "4.0.16",
"magic-string": "^0.30.21",
"pathe": "^2.0.3"
},
@@ -3177,9 +3177,9 @@
}
},
"node_modules/@vitest/spy": {
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.15.tgz",
"integrity": "sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==",
"version": "4.0.16",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.16.tgz",
"integrity": "sha512-4jIOWjKP0ZUaEmJm00E0cOBLU+5WE0BpeNr3XN6TEF05ltro6NJqHWxXD0kA8/Zc8Nh23AT8WQxwNG+WeROupw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -3187,13 +3187,13 @@
}
},
"node_modules/@vitest/ui": {
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.0.15.tgz",
"integrity": "sha512-sxSyJMaKp45zI0u+lHrPuZM1ZJQ8FaVD35k+UxVrha1yyvQ+TZuUYllUixwvQXlB7ixoDc7skf3lQPopZIvaQw==",
"version": "4.0.16",
"resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.0.16.tgz",
"integrity": "sha512-rkoPH+RqWopVxDnCBE/ysIdfQ2A7j1eDmW8tCxxrR9nnFBa9jKf86VgsSAzxBd1x+ny0GC4JgiD3SNfRHv3pOg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/utils": "4.0.15",
"@vitest/utils": "4.0.16",
"fflate": "^0.8.2",
"flatted": "^3.3.3",
"pathe": "^2.0.3",
@@ -3205,17 +3205,17 @@
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
"vitest": "4.0.15"
"vitest": "4.0.16"
}
},
"node_modules/@vitest/utils": {
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.15.tgz",
"integrity": "sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==",
"version": "4.0.16",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.16.tgz",
"integrity": "sha512-h8z9yYhV3e1LEfaQ3zdypIrnAg/9hguReGZoS7Gl0aBG5xgA410zBqECqmaF/+RkTggRsfnzc1XaAHA6bmUufA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/pretty-format": "4.0.15",
"@vitest/pretty-format": "4.0.16",
"tinyrainbow": "^3.0.3"
},
"funding": {
@@ -7153,9 +7153,9 @@
"license": "Unlicense"
},
"node_modules/rollup": {
"version": "4.53.4",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.4.tgz",
"integrity": "sha512-YpXaaArg0MvrnJpvduEDYIp7uGOqKXbH9NsHGQ6SxKCOsNAjZF018MmxefFUulVP2KLtiGw1UvZbr+/ekjvlDg==",
"version": "4.53.5",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.5.tgz",
"integrity": "sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7169,28 +7169,28 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.53.4",
"@rollup/rollup-android-arm64": "4.53.4",
"@rollup/rollup-darwin-arm64": "4.53.4",
"@rollup/rollup-darwin-x64": "4.53.4",
"@rollup/rollup-freebsd-arm64": "4.53.4",
"@rollup/rollup-freebsd-x64": "4.53.4",
"@rollup/rollup-linux-arm-gnueabihf": "4.53.4",
"@rollup/rollup-linux-arm-musleabihf": "4.53.4",
"@rollup/rollup-linux-arm64-gnu": "4.53.4",
"@rollup/rollup-linux-arm64-musl": "4.53.4",
"@rollup/rollup-linux-loong64-gnu": "4.53.4",
"@rollup/rollup-linux-ppc64-gnu": "4.53.4",
"@rollup/rollup-linux-riscv64-gnu": "4.53.4",
"@rollup/rollup-linux-riscv64-musl": "4.53.4",
"@rollup/rollup-linux-s390x-gnu": "4.53.4",
"@rollup/rollup-linux-x64-gnu": "4.53.4",
"@rollup/rollup-linux-x64-musl": "4.53.4",
"@rollup/rollup-openharmony-arm64": "4.53.4",
"@rollup/rollup-win32-arm64-msvc": "4.53.4",
"@rollup/rollup-win32-ia32-msvc": "4.53.4",
"@rollup/rollup-win32-x64-gnu": "4.53.4",
"@rollup/rollup-win32-x64-msvc": "4.53.4",
"@rollup/rollup-android-arm-eabi": "4.53.5",
"@rollup/rollup-android-arm64": "4.53.5",
"@rollup/rollup-darwin-arm64": "4.53.5",
"@rollup/rollup-darwin-x64": "4.53.5",
"@rollup/rollup-freebsd-arm64": "4.53.5",
"@rollup/rollup-freebsd-x64": "4.53.5",
"@rollup/rollup-linux-arm-gnueabihf": "4.53.5",
"@rollup/rollup-linux-arm-musleabihf": "4.53.5",
"@rollup/rollup-linux-arm64-gnu": "4.53.5",
"@rollup/rollup-linux-arm64-musl": "4.53.5",
"@rollup/rollup-linux-loong64-gnu": "4.53.5",
"@rollup/rollup-linux-ppc64-gnu": "4.53.5",
"@rollup/rollup-linux-riscv64-gnu": "4.53.5",
"@rollup/rollup-linux-riscv64-musl": "4.53.5",
"@rollup/rollup-linux-s390x-gnu": "4.53.5",
"@rollup/rollup-linux-x64-gnu": "4.53.5",
"@rollup/rollup-linux-x64-musl": "4.53.5",
"@rollup/rollup-openharmony-arm64": "4.53.5",
"@rollup/rollup-win32-arm64-msvc": "4.53.5",
"@rollup/rollup-win32-ia32-msvc": "4.53.5",
"@rollup/rollup-win32-x64-gnu": "4.53.5",
"@rollup/rollup-win32-x64-msvc": "4.53.5",
"fsevents": "~2.3.2"
}
},
@@ -7254,9 +7254,9 @@
"license": "MIT"
},
"node_modules/sass": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.96.0.tgz",
"integrity": "sha512-8u4xqqUeugGNCYwr9ARNtQKTOj4KmYiJAVKXf2CTIivTCR51j96htbMKWDru8H5SaQWpyVgTfOF8Ylyf5pun1Q==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.97.0.tgz",
"integrity": "sha512-KR0igP1z4avUJetEuIeOdDlwaUDvkH8wSx7FdSjyYBS3dpyX3TzHfAMO0G1Q4/3cdjcmi3r7idh+KCmKqS+KeQ==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -7276,9 +7276,9 @@
}
},
"node_modules/sass-embedded": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.96.0.tgz",
"integrity": "sha512-z9PQ7owvdhn7UuZGrpPccdkcH9xJd9iCv+UQhcPqppBslYEp0R9LRQVyyPTZg7jfA77bGxz/I8V48LXJR5LjXQ==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.97.0.tgz",
"integrity": "sha512-Unwu0MtlAt9hQGHutB2NJhwhPcxiJX99AI7PSz7W4lkikQg9S/HYFtgxtIjpTB4DW7sOYX2xnxvtU/nep9HXTA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7298,30 +7298,30 @@
"node": ">=16.0.0"
},
"optionalDependencies": {
"sass-embedded-all-unknown": "1.96.0",
"sass-embedded-android-arm": "1.96.0",
"sass-embedded-android-arm64": "1.96.0",
"sass-embedded-android-riscv64": "1.96.0",
"sass-embedded-android-x64": "1.96.0",
"sass-embedded-darwin-arm64": "1.96.0",
"sass-embedded-darwin-x64": "1.96.0",
"sass-embedded-linux-arm": "1.96.0",
"sass-embedded-linux-arm64": "1.96.0",
"sass-embedded-linux-musl-arm": "1.96.0",
"sass-embedded-linux-musl-arm64": "1.96.0",
"sass-embedded-linux-musl-riscv64": "1.96.0",
"sass-embedded-linux-musl-x64": "1.96.0",
"sass-embedded-linux-riscv64": "1.96.0",
"sass-embedded-linux-x64": "1.96.0",
"sass-embedded-unknown-all": "1.96.0",
"sass-embedded-win32-arm64": "1.96.0",
"sass-embedded-win32-x64": "1.96.0"
"sass-embedded-all-unknown": "1.97.0",
"sass-embedded-android-arm": "1.97.0",
"sass-embedded-android-arm64": "1.97.0",
"sass-embedded-android-riscv64": "1.97.0",
"sass-embedded-android-x64": "1.97.0",
"sass-embedded-darwin-arm64": "1.97.0",
"sass-embedded-darwin-x64": "1.97.0",
"sass-embedded-linux-arm": "1.97.0",
"sass-embedded-linux-arm64": "1.97.0",
"sass-embedded-linux-musl-arm": "1.97.0",
"sass-embedded-linux-musl-arm64": "1.97.0",
"sass-embedded-linux-musl-riscv64": "1.97.0",
"sass-embedded-linux-musl-x64": "1.97.0",
"sass-embedded-linux-riscv64": "1.97.0",
"sass-embedded-linux-x64": "1.97.0",
"sass-embedded-unknown-all": "1.97.0",
"sass-embedded-win32-arm64": "1.97.0",
"sass-embedded-win32-x64": "1.97.0"
}
},
"node_modules/sass-embedded-all-unknown": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.96.0.tgz",
"integrity": "sha512-UfUHoWZtxmsDjDfK+fKCy0aJe6zThu7oaIQx0c/vnHgvprcddEPIay01qTXhiUa3cFcsMmvlBvPTVw0gjKVtVQ==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.97.0.tgz",
"integrity": "sha512-9F6MyQcwp3YiuGMk5bC7g9jL+D1KkW/ONQgrkoTQ7ALcmoPKmsauZg5WgRhLYW9UhpnGTgANrWrZdiREAR1YkA==",
"cpu": [
"!arm",
"!arm64",
@@ -7332,13 +7332,13 @@
"license": "MIT",
"optional": true,
"dependencies": {
"sass": "1.96.0"
"sass": "1.97.0"
}
},
"node_modules/sass-embedded-android-arm": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.96.0.tgz",
"integrity": "sha512-0mwVRBFig9hH8vFcRExBuBoR+CfUOcWdwarZwbxIFGI1IyH4BLBGiX85vVn6ssSCVNydpE6lFGm45CN8O0tQig==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.97.0.tgz",
"integrity": "sha512-VLxeVR5FMwSZoOliBY8Qy2trZCWYz3w4ILf0QZ68eep3mIQjtykY3BSKC2R/w9DkPQDNJXdgbgnxeOubC8k5xw==",
"cpu": [
"arm"
],
@@ -7353,9 +7353,9 @@
}
},
"node_modules/sass-embedded-android-arm64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.96.0.tgz",
"integrity": "sha512-TJiebTo4TBF5Wrn+lFkUfSN3wazvl8kkFm9a1nA9ZtRdaE0nsJLGnMM6KLQLP2Vl+IOf6ovetZseISkClRoGXw==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.97.0.tgz",
"integrity": "sha512-uDG/0DS6A+KRiOYUV1UNHBq67DHvO+/54Ja+dg8S5fl5uvPwZGHpJFheemA9R6vvddwyjGmzVacvCQxdmECcfQ==",
"cpu": [
"arm64"
],
@@ -7370,9 +7370,9 @@
}
},
"node_modules/sass-embedded-android-riscv64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.96.0.tgz",
"integrity": "sha512-7AVu/EeJqKN3BGNhm+tc1XzmoqbOtCwHG2VgN6j6Lyqh1JZlx0dglRtyQuKDZ7odTKiWmotEIuYZ6OxLmr2Ejg==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.97.0.tgz",
"integrity": "sha512-yrwsyPR08CXW5Ggr0kI1jTUcKkBOtjODbDj11nRrBwyrXRqhf1obqfchQxTW0HlYT8VZmZGfnHvPNNDwOSdfZg==",
"cpu": [
"riscv64"
],
@@ -7387,9 +7387,9 @@
}
},
"node_modules/sass-embedded-android-x64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.96.0.tgz",
"integrity": "sha512-ei/UsT0q8rF5JzWhn1A7B0M1y/IiWVY3l4zibQrXk5MGaOXHlCM6ffZD+2j7C613Jm9/KAQ7yX1NIIu72LPgDQ==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.97.0.tgz",
"integrity": "sha512-a1QW1pFykLCtV8J3AZ+wtrwOx0ORZsW4orF6fOrBYL2sLhlzhB3iK+QzWezFvH5+FMgLQBC4xgYYk4NV9WCO9g==",
"cpu": [
"x64"
],
@@ -7404,9 +7404,9 @@
}
},
"node_modules/sass-embedded-darwin-arm64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.96.0.tgz",
"integrity": "sha512-OMvN5NWcrrisC24ZR3GyaWJ1uFxw25qLnUkpEso9TSlaMWiomjU82/uQ/AkQvIMl+EMlJqeYLxZWvq/byLH5Xg==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.97.0.tgz",
"integrity": "sha512-5XV42FEqhQEGFQ/w8HUk///k0XMHLyBt1j2alxTr9ZI77HqiAIl6kVZp0kxJ++gt/y3E6hKoMLngHHC6zIBR5A==",
"cpu": [
"arm64"
],
@@ -7421,9 +7421,9 @@
}
},
"node_modules/sass-embedded-darwin-x64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.96.0.tgz",
"integrity": "sha512-J/R5sv0eW+/DU98rccHPO1f3lsTFjVTpdkU9d3P1yB7BFmQjw5PYde9BVRlXeOawPwfgT3p/hvY4RELScICdww==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.97.0.tgz",
"integrity": "sha512-Kc0aKFfKPd/kz8mSGtRKTEN7FKnqs30iZf6APb0ZHMuvMVfOfdD+fZ/85htT+j5k2F+UUSFBpbx04W0gZW020A==",
"cpu": [
"x64"
],
@@ -7438,9 +7438,9 @@
}
},
"node_modules/sass-embedded-linux-arm": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.96.0.tgz",
"integrity": "sha512-XuQvV6gNld5Bz3rX0SFLtKPGMu4UQdXNp//9A+bDmtVGZ6yu8REIqphQBxOMpgkAKsA4JZLKKk1N97woeVsIlA==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.97.0.tgz",
"integrity": "sha512-pwM5A1+w3l1T/FXwJNqZD0WukCENeRkgxPSpZmsO4/QNLdTpGCz16D5spYPQ7f7GZo9aNaHt1EaDLHCjlEA8LQ==",
"cpu": [
"arm"
],
@@ -7455,9 +7455,9 @@
}
},
"node_modules/sass-embedded-linux-arm64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.96.0.tgz",
"integrity": "sha512-VcbVjK0/O/mru0h0FC1WSUWIzMqRrzuJ8eZNMXTs4vApfkh28pxNaUodwU81f1L1nngJ3vpFDBniUKpW6NwJhw==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.97.0.tgz",
"integrity": "sha512-ofm9esPA9P0sB6wJPcDhQYjSDfa7RoVKD0IHvFPMrK9OLTKg8lw80/afH49a9URYeYiE4wFP76Fr9t+s7A6E1Q==",
"cpu": [
"arm64"
],
@@ -7472,9 +7472,9 @@
}
},
"node_modules/sass-embedded-linux-musl-arm": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.96.0.tgz",
"integrity": "sha512-qK7FrnczCVECZXtyYOoI3azFlMDZn70GI1yJPPuZLpWvwIPYoZOLv3u6JSec5o3wT6KeKyWG3ZpGIpigLUjPig==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.97.0.tgz",
"integrity": "sha512-+rsW0OreW4sPtdXDewDESxJLJdxW3B0EL7ICajkRFs3KbeNdgOVnP5DJQ39hquAoZH0AcEEGcd6236ZMMzEbwQ==",
"cpu": [
"arm"
],
@@ -7489,9 +7489,9 @@
}
},
"node_modules/sass-embedded-linux-musl-arm64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.96.0.tgz",
"integrity": "sha512-lVyLObEeu8Wgw8riC6dSMlkF7jVNAjdZ1jIBhvX1yDsrQwwaI60pM21YXmnZSFyCE6KVFkKAgwRQNO/IkoCwMA==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.97.0.tgz",
"integrity": "sha512-8VF4nc7oUklhUGGAY0T6Ktd9T9ZFwoOsWje7ocOV57tjbocFp/eeAPqX1v2BpiZtMVURyYwaZsRSAL79DT7oRw==",
"cpu": [
"arm64"
],
@@ -7506,9 +7506,9 @@
}
},
"node_modules/sass-embedded-linux-musl-riscv64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.96.0.tgz",
"integrity": "sha512-Y+DuGVRsM2zGl268QN5aF/Y6OFYTILb3f+6huEXKlGL6FK2MXadsmeoVbmKVrTamQHzyA2bWWMU1C0jhVFtlzg==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.97.0.tgz",
"integrity": "sha512-nlaeeZ5P7tde/c/aMiIl5UduQZPA9ftEyWJxdmWcs3pASFSykslVJR5D4L161EUHzB5z+MxSnbbzcrck0F1slA==",
"cpu": [
"riscv64"
],
@@ -7523,9 +7523,9 @@
}
},
"node_modules/sass-embedded-linux-musl-x64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.96.0.tgz",
"integrity": "sha512-sAQtUQ8fFNxnxSf3fncOh892Hfxa4PW4e5qrnSE0Y1IGV/wsTzk7m5Z6IeT7sa3BsvXh5TFN6+JGbUoOJ5RigA==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.97.0.tgz",
"integrity": "sha512-QB6JLr2p1UuEXhiTXEYNypf+w2x/SCMY17vcnXKM47CeaJ88v2C9fJ9oVne6eZntlCylSow/vZCov0JMhklknA==",
"cpu": [
"x64"
],
@@ -7540,9 +7540,9 @@
}
},
"node_modules/sass-embedded-linux-riscv64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.96.0.tgz",
"integrity": "sha512-Bf6bAjuUm6sfGHo0XoZEstjVkEWwmmtOSomGoPuAwXFS9GQnFcqDz9EXKNkZEOsQi2D+aDeDxs8HcU9/OLMT9g==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.97.0.tgz",
"integrity": "sha512-m7QaK4M+YhQ6FZWMI9O8g4tqmM4JrvzJl/YC/eEJXpfgwxMeXsDsPVQWFiBdWOuxqMSH8WhFksw/Bg0J+kK6VQ==",
"cpu": [
"riscv64"
],
@@ -7557,9 +7557,9 @@
}
},
"node_modules/sass-embedded-linux-x64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.96.0.tgz",
"integrity": "sha512-U4GROkS0XM6ekqs/ubroWwFAGY9N35wqrt5q6Y+MJCpTK5bHPHlgFo7J75ZUSaEObL+UrDqvMDQkCdYEFiiQbg==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.97.0.tgz",
"integrity": "sha512-yc7yLWJrAtTBCjEAoNxvE040EGYdsgmaWMSyI9LSIOFlSwrOc4x+W/8IMhLWCygTAgorNPuNlRfPDgkQm1sJmw==",
"cpu": [
"x64"
],
@@ -7574,9 +7574,9 @@
}
},
"node_modules/sass-embedded-unknown-all": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.96.0.tgz",
"integrity": "sha512-OHzGEr2VElK2SaQdkkTX0O0KwTbiv1N/EhnHgzXYaZWOTvv0gxEfR7q7x/oScCBIZc2x8dSfvThfBnohIClo/w==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.97.0.tgz",
"integrity": "sha512-dDky3ETKeOo543myScL4sp3pj2cANLNKea5aR6v8ZCpDSCDTRxqv4Sj/goTmkVqnp/HOVF88qB3GHtQ8rFtULQ==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -7587,13 +7587,13 @@
"!win32"
],
"dependencies": {
"sass": "1.96.0"
"sass": "1.97.0"
}
},
"node_modules/sass-embedded-win32-arm64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.96.0.tgz",
"integrity": "sha512-KKz1h5pr45fwrKcxrxHsujo3f/HgVkX64YNJ9PRPuOuX7lU8g18IEgDxoTGQ64PPBQ5RXOt6jxpT+x2OLPVnCw==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.97.0.tgz",
"integrity": "sha512-JMU2SKIgUJDw4oaKBcVbuobWRU6f2XmFuYqJdkxJhlITAGimwjZ860gttlzjNtZcVI4+p4ovT14HwpsEcIzfnw==",
"cpu": [
"arm64"
],
@@ -7608,9 +7608,9 @@
}
},
"node_modules/sass-embedded-win32-x64": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.96.0.tgz",
"integrity": "sha512-MDreKaWcgiyKD5YPShaRvUBoe5dC2y8IPJK49G7iQjoMfw9INDCBkDdLcz00Mn0eJq4nJJp5UEE98M6ljIrBRg==",
"version": "1.97.0",
"resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.97.0.tgz",
"integrity": "sha512-mKIJGXxEl6OoWEoT4ee5OsBOfExla2ilY5J8tupVwSCxf/i3aOJNLm7ZzRWG9er2K3bC8aovgMisMIVGlBM5hw==",
"cpu": [
"x64"
],
@@ -8517,19 +8517,19 @@
}
},
"node_modules/vitest": {
"version": "4.0.15",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.15.tgz",
"integrity": "sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==",
"version": "4.0.16",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.16.tgz",
"integrity": "sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/expect": "4.0.15",
"@vitest/mocker": "4.0.15",
"@vitest/pretty-format": "4.0.15",
"@vitest/runner": "4.0.15",
"@vitest/snapshot": "4.0.15",
"@vitest/spy": "4.0.15",
"@vitest/utils": "4.0.15",
"@vitest/expect": "4.0.16",
"@vitest/mocker": "4.0.16",
"@vitest/pretty-format": "4.0.16",
"@vitest/runner": "4.0.16",
"@vitest/snapshot": "4.0.16",
"@vitest/spy": "4.0.16",
"@vitest/utils": "4.0.16",
"es-module-lexer": "^1.7.0",
"expect-type": "^1.2.2",
"magic-string": "^0.30.21",
@@ -8557,10 +8557,10 @@
"@edge-runtime/vm": "*",
"@opentelemetry/api": "^1.9.0",
"@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
"@vitest/browser-playwright": "4.0.15",
"@vitest/browser-preview": "4.0.15",
"@vitest/browser-webdriverio": "4.0.15",
"@vitest/ui": "4.0.15",
"@vitest/browser-playwright": "4.0.16",
"@vitest/browser-preview": "4.0.16",
"@vitest/browser-webdriverio": "4.0.16",
"@vitest/ui": "4.0.16",
"happy-dom": "*",
"jsdom": "*"
},

View File

@@ -320,6 +320,14 @@ watch(leasePaging.value, async () => {
await fetchLeases();
});
watch(mode, async () => {
if (mode.value === 'connections') {
await fetchConnections();
} else if (mode.value === 'lease') {
await fetchLeases();
}
});
onMounted(async () => {
if (await mapStore.worker.profile.isSystemAdmin()) {
isSystemAdmin.value = true;

View File

@@ -24,6 +24,20 @@
/>
</TablerInput>
</div>
<div
v-if='route.params.connectionid === "new"'
class='col-12'
>
<label class='px-2 w-100'>Channels</label>
<div style='max-height: 20vh; min-height: 200px; overflow-y: auto;'>
<GroupSelect
v-model='groups'
:active='true'
direction='IN'
/>
</div>
</div>
<div class='col-12 d-flex'>
<label>Feeds</label>
@@ -80,6 +94,7 @@ import type { VideoConnection, VideoConnectionFeed } from '../../../types.ts';
import VideosRemoteFeed from './Videos/VideosRemoteFeed.vue';
import { std } from '../../../std.ts';
import { useRoute, useRouter } from 'vue-router';
import GroupSelect from '../../util/GroupSelect.vue';
import {
TablerInput,
TablerDelete,
@@ -98,6 +113,9 @@ const route = useRoute();
const router = useRouter();
const loading = ref(String(route.params.connectionid) !== "new");
const err = ref<Error | undefined>(undefined);
const groups = ref<string[]>([]);
const connection = ref<VideoConnection>({
uuid: randomUUID(),
active: true,
@@ -151,7 +169,10 @@ async function saveConnection() {
} else {
await std('/api/marti/video', {
method: 'POST',
body: connection.value
body: {
groups: groups.value,
...connection.value
}
});
}

View File

@@ -67,8 +67,7 @@
<div class='d-flex align-items-center w-100 justify-content-center'>
<div class='py-2'>
<img
height='600px'
width='600px'
style='max-width: 100%; height: auto; max-height: 600px;'
alt='UAS Tool Wizard Image'
:src='`/wizard/Step${wizard}.png`'
class='rounded'
@@ -142,7 +141,7 @@
class='d-flex align-items-center user-select-none'
>
<IconServer
:size='32'
:size='24'
stroke='1'
/>
<span class='ms-2'>External Stream URL</span>
@@ -153,14 +152,14 @@
>
<IconArrowsLeftRight
v-tooltip='"Read/Write User"'
:size='32'
:size='24'
stroke='1'
/>
<span class='ms-2'>Read-Write User</span>
</div>
<div
v-else
class='px-2 py-2 round btn-group w-100'
class='p-1 round btn-group w-100'
role='group'
>
<input
@@ -178,7 +177,7 @@
>
<IconBook2
v-tooltip='"Read User"'
:size='32'
:size='24'
stroke='1'
/>
<span class='mx-2'>Read User</span>
@@ -199,7 +198,7 @@
>
<IconPencil
v-tooltip='"Write User"'
:size='32'
:size='24'
stroke='1'
/>
<span class='mx-2'>Write User</span>
@@ -283,6 +282,33 @@
</template>
</div>
</template>
<div
v-if='disabled'
class='col-12 pt-2'
>
<div class='col-12 d-flex align-items-center mb-1'>
<label>Expiration</label>
<div class='ms-auto'>
<span
v-if='expired(editLease.expiration)'
class='badge bg-red text-white mt-2'
>Expired</span>
<span
v-else-if='editLease.expiration === null'
class='badge bg-blue text-white mt-2'
>Permanent</span>
</div>
</div>
<div class='col-12'>
<CopyField
v-if='editLease.expiration'
:model-value='editLease.expiration'
/>
</div>
</div>
</template>
<div
@@ -320,7 +346,7 @@
>
<div class='col-12'>
<div
class='px-2 py-2 round btn-group w-100'
class='p-1 round btn-group w-100'
role='group'
>
<input
@@ -337,7 +363,7 @@
class='btn btn-sm'
><IconDrone
v-tooltip='"Provide a stream URL to push data to"'
:size='32'
:size='24'
stroke='1'
/><span class='ms-2'>Hosted Stream URL</span></label>
@@ -355,7 +381,7 @@
class='btn btn-sm'
><IconServer
v-tooltip='"Pull from existing external Stream URL"'
:size='32'
:size='24'
stroke='1'
/><span class='ms-2'>External Stream URL</span></label>
</div>
@@ -378,7 +404,7 @@
description='Leases remain active on the server for the duration specified. Once the lease expires the lease can be renewed without the Lease URL changing'
/>
</div>
<div class='col-12 col-md-8'>
<div class='col-12 col-md-6'>
<TablerEnum
v-model='editLease.source_type'
default='unknown'
@@ -398,7 +424,7 @@
description='The type of sensor that is broadcasting'
/>
</div>
<div class='col-12 col-md-4'>
<div class='col-12 col-md-6'>
<TablerInput
v-model='editLease.source_model'
:disabled='disabled'
@@ -419,7 +445,7 @@
description='Pull media into the Video Manager from an existing URL.'
/>
</div>
<div class='col-12'>
<div class='col-12 col-md-6'>
<TablerToggle
v-model='editLease.publish'
label='Publish to TAK Server'
@@ -427,7 +453,7 @@
description='Publish the non-geolocated Video Stream to the Video Manager'
/>
</div>
<div class='col-12'>
<div class='col-12 col-md-6'>
<TablerToggle
v-model='editLease.recording'
label='Record Stream'
@@ -437,7 +463,7 @@
</div>
<div
v-if='typeof editLease.proxy !== "string"'
class='col-12'
class='col-12 col-md-6'
>
<TablerToggle
v-model='secure'
@@ -446,60 +472,37 @@
description='Create a seperate Read/Write user to ensure unauthorized users cannot publish to a stream'
/>
</div>
<div class='col-12'>
<div class='col-12 col-md-6'>
<TablerToggle
v-model='shared'
v-model='editLease.share'
description='By default only the user that created a Lease can manage it. If you are operating as part of an agency, turn on Lease Sharing to allow all users in your Channel to manage the lease'
:disabled='disabled'
label='Shared Lease'
/>
</div>
<div
v-if='shared'
v-if='editLease.share || editLease.publish'
class='col-12'
>
<GroupSelect
<div
v-if='!disabled'
v-model='channels'
:limit='1'
/>
style='height: 20vh; min-height: 200px; overflow-y: auto;'
>
<GroupSelect
v-model='channels'
:limit='1'
/>
</div>
<div
v-else
class='border border-white rounded px-2 py-2'
>
<IconAffiliate
:size='24'
:size='32'
stroke='1'
/> <span v-text='editLease.channel' />
</div>
</div>
<div
v-if='editLease.expiration !== undefined'
class='col-12'
>
<div class='col-12 d-flex align-items-center mb-1'>
<label>Expiration</label>
<div class='ms-auto'>
<span
v-if='expired(editLease.expiration)'
class='badge bg-red text-white mt-2'
>Expired</span>
<span
v-else-if='editLease.expiration === null'
class='badge bg-blue text-white mt-2'
>Permanent</span>
</div>
</div>
<div class='col-12'>
<CopyField
v-if='editLease.expiration'
:model-value='editLease.expiration'
/>
</div>
</div>
</div>
<div class='modal-footer d-flex'>
<button
@@ -546,7 +549,7 @@
import { std } from '../../../../std.ts';
import { validateURL } from '../../../../base/validators.ts';
import CopyField from '../../util/CopyField.vue';
import { ref, watch, onMounted } from 'vue';
import { ref, onMounted } from 'vue';
import type { VideoLease, VideoLeaseResponse, VideoLeaseProtocols, VideoLeaseMetadata } from '../../../../types.ts';
import VideoLeaseSourceType from '../../util/VideoLeaseSourceType.vue'
import GroupSelect from '../../../util/GroupSelect.vue';
@@ -593,18 +596,17 @@ const channels = ref<string[]>([]);
const durations = ref<Array<string>>(["16 Hours", "12 Hours", "6 Hours", "1 Hour"]);
const shared = ref(false);
const editLease = ref<{
id?: number
name: string
duration: string
recording: boolean
publish: boolean
share: boolean
channel: string | null
source_type: string
source_model: string
proxy?: string | null
proxy?: string | null
expiration?: string | null
stream_user: string | null
stream_pass: string | null
@@ -616,6 +618,7 @@ const editLease = ref<{
channel: null,
recording: false,
publish: false,
share: true,
source_type: 'unknown',
source_model: '',
stream_user: '',
@@ -643,12 +646,6 @@ onMounted(async () => {
loading.value = false
});
watch(shared, () => {
if (!shared.value) {
channels.value = [];
}
});
function expired(expiration?: string | null) {
if (!expiration) return false;
return +new Date(expiration) < +new Date();
@@ -680,12 +677,6 @@ async function fetchLease() {
channels.value = [];
}
if (res.channel) {
shared.value = true;
} else {
shared.value = false;
}
const resMetadata = await std(`/api/video/lease/${editLease.value.id}/metadata`, {
method: 'GET',
}) as VideoLeaseMetadata;
@@ -729,6 +720,7 @@ async function saveLease() {
permanent: editLease.value.duration === 'Permanent' ? true : false,
recording: editLease.value.recording,
publish: editLease.value.publish,
share: editLease.value.share,
source_type: editLease.value.source_type,
source_model: editLease.value.source_model,
}
@@ -745,6 +737,7 @@ async function saveLease() {
permanent: editLease.value.duration === 'Permanent' ? true : false,
recording: editLease.value.recording,
publish: editLease.value.publish,
share: editLease.value.share,
source_type: editLease.value.source_type,
source_model: editLease.value.source_model,
}

View File

@@ -2,10 +2,10 @@
<div
class='rounded mx-2 my-2'
style='
border-style: solid;
border-color: #3E5E84;
border-width: 1px;
'
border-style: solid;
border-color: #3E5E84;
border-width: 1px;
'
>
<div class='d-flex mt-2 mx-2'>
<div>

View File

@@ -1,7 +1,7 @@
<template>
<svg
ref='icons'
id='icons'
ref='icons'
class='d-none'
>
<symbol

View File

@@ -49,7 +49,10 @@
/>
</div>
<div class='flex-grow-1 d-flex flex-column gap-1 py-2' style='min-width: 0;'>
<div
class='flex-grow-1 d-flex flex-column gap-1 py-2'
style='min-width: 0;'
>
<div class='d-flex align-items-center gap-2'>
<span
class='fw-semibold text-truncate'

View File

@@ -1,6 +1,9 @@
<template>
<div>
<div class='sticky-top py-2 border-bottom'>
<div
class='sticky-top py-2 border-bottom'
style='background-color: var(--tblr-bg-surface, #fff)'
>
<TablerInput
v-model='filter'
icon='search'

View File

@@ -10468,7 +10468,7 @@ export interface paths {
/** @description Order in which results are returned based on the "sort" query param */
order: "asc" | "desc";
/** @description No Description */
sort: "id" | "name" | "created" | "updated" | "username" | "connection" | "layer" | "source_id" | "source_type" | "source_model" | "publish" | "recording" | "ephemeral" | "channel" | "expiration" | "path" | "stream_user" | "stream_pass" | "read_user" | "read_pass" | "proxy" | "enableRLS";
sort: "id" | "name" | "created" | "updated" | "username" | "connection" | "layer" | "source_id" | "source_type" | "source_model" | "publish" | "recording" | "share" | "ephemeral" | "channel" | "expiration" | "path" | "stream_user" | "stream_pass" | "read_user" | "read_pass" | "proxy" | "enableRLS";
/** @description Filter results by a human readable name field */
filter: string;
};
@@ -10502,6 +10502,7 @@ export interface paths {
source_model: string;
publish: boolean;
recording: boolean;
share: boolean;
ephemeral: boolean;
channel: null | string;
expiration: null | string;
@@ -10614,6 +10615,11 @@ export interface paths {
* @default false
*/
publish: boolean;
/**
* @description Allow other users to manage lease if they are also members of the channel
* @default false
*/
share: boolean;
/**
* @description Increase stream security by enforcing a seperate read and write username/password
* @default false
@@ -10648,6 +10654,7 @@ export interface paths {
source_model: string;
publish: boolean;
recording: boolean;
share: boolean;
ephemeral: boolean;
channel: null | string;
expiration: null | string;
@@ -10879,6 +10886,7 @@ export interface paths {
source_model: string;
publish: boolean;
recording: boolean;
share: boolean;
ephemeral: boolean;
channel: null | string;
expiration: null | string;
@@ -11093,6 +11101,8 @@ export interface paths {
source_model?: string;
channel?: string | null;
secure?: boolean;
/** @description Allow other users to manage lease if they are also members of the channel */
share?: boolean;
/**
* @description Rotate Read-User Credentials if using seperate read/write user - infers secure: true
* @default false
@@ -11129,6 +11139,7 @@ export interface paths {
source_model: string;
publish: boolean;
recording: boolean;
share: boolean;
ephemeral: boolean;
channel: null | string;
expiration: null | string;
@@ -32705,7 +32716,7 @@ export interface paths {
/** @description Order in which results are returned based on the "sort" query param */
order: "asc" | "desc";
/** @description No Description */
sort: "id" | "name" | "created" | "updated" | "username" | "connection" | "layer" | "source_id" | "source_type" | "source_model" | "publish" | "recording" | "ephemeral" | "channel" | "expiration" | "path" | "stream_user" | "stream_pass" | "read_user" | "read_pass" | "proxy" | "enableRLS";
sort: "id" | "name" | "created" | "updated" | "username" | "connection" | "layer" | "source_id" | "source_type" | "source_model" | "publish" | "recording" | "share" | "ephemeral" | "channel" | "expiration" | "path" | "stream_user" | "stream_pass" | "read_user" | "read_pass" | "proxy" | "enableRLS";
/** @description No Description */
expired: "true" | "false" | "all";
/** @description No Description */
@@ -32740,6 +32751,7 @@ export interface paths {
source_model: string;
publish: boolean;
recording: boolean;
share: boolean;
ephemeral: boolean;
channel: null | string;
expiration: null | string;
@@ -32854,6 +32866,11 @@ export interface paths {
* @default false
*/
publish: boolean;
/**
* @description Allow other users to manage lease if they are also members of the channel
* @default false
*/
share: boolean;
/**
* @description Increase stream security by enforcing a seperate read and write username/password
* @default false
@@ -32887,6 +32904,7 @@ export interface paths {
source_model: string;
publish: boolean;
recording: boolean;
share: boolean;
ephemeral: boolean;
channel: null | string;
expiration: null | string;
@@ -33006,6 +33024,7 @@ export interface paths {
source_model: string;
publish: boolean;
recording: boolean;
share: boolean;
ephemeral: boolean;
channel: null | string;
expiration: null | string;
@@ -33197,14 +33216,13 @@ export interface paths {
channel?: string | null;
secure?: boolean;
/** @description Record streams to disk */
recording: boolean;
recording?: boolean;
/** @description Publish stream URL to TAK Server Video Manager */
publish: boolean;
/**
* @description System Admins can create non-expiring leases
* @default false
*/
permanent: boolean;
publish?: boolean;
/** @description Allow other users to manage lease if they are also members of the channel */
share?: boolean;
/** @description System Admins can create non-expiring leases */
permanent?: boolean;
proxy?: string;
};
};
@@ -33229,6 +33247,7 @@ export interface paths {
source_model: string;
publish: boolean;
recording: boolean;
share: boolean;
ephemeral: boolean;
channel: null | string;
expiration: null | string;