61609de97e
* feat(preview-generator): add new preview generator webapp * wip(preview-service): reworking the preview service backend * feat(previews): logging * feat(preview-service): streamline payloads * fix(preview-service): do not log the full payload * feat(preview-service): build new preview service * feat(preview-service): add separate response queue * feat(previews): integrate preview queues with the server * feat(previews): use module alias * chore(previews): remove old preview service code * feat(previews): log stuff on job statuses * fix(previews): add missing deps and scripts * fix(previews): package deps fix * fix(server): moar typing fixes * Metrics related to jobs: total count, request failures, response errors & durations * duration should include unit. - histogram metric should be summary - error responses include duration in seconds - attempt to remove metric before adding it (prevent errors with duplicate metrics) * fix(server, frontend): some ts fixes * fixes * fix(frontend): remove unneeded ts-expect-error * chore(preview-service): eslint * TS fix * feat(previews): more smoal fixes * fix(preview-service): alias loading * feat(helm): updates for new preview service queue setup * feat(preview-service): launch new browser for each job * feat(preview-service): add timeout, fix liveliness * fix(helm): add access to new secret in service accounts * tidy metrics into a separate file * Remove broken preview service acceptance test * fix broken import * Add metrics to test * feat(preview-service): handle preview service shutdown properly * fix(previews): merge bork --------- Co-authored-by: Iain Sproat <68657+iainsproat@users.noreply.github.com> Co-authored-by: Kristaps Fabians Geikins <fabis94@live.com>
52 lines
1.8 KiB
TypeScript
52 lines
1.8 KiB
TypeScript
import { DefaultAppIds } from '@/modules/auth/defaultApps'
|
|
import { GetStreamCollaborators } from '@/modules/core/domain/streams/operations'
|
|
import { CreateAndStoreAppToken } from '@/modules/core/domain/tokens/operations'
|
|
import {
|
|
CreateObjectPreview,
|
|
RequestObjectPreview,
|
|
StoreObjectPreview
|
|
} from '@/modules/previews/domain/operations'
|
|
import { Roles, Scopes } from '@speckle/shared'
|
|
import { TokenResourceIdentifierType } from '@/modules/core/domain/tokens/types'
|
|
|
|
export const createObjectPreviewFactory =
|
|
({
|
|
getStreamCollaborators,
|
|
createAppToken,
|
|
requestObjectPreview,
|
|
storeObjectPreview,
|
|
serverOrigin
|
|
}: {
|
|
getStreamCollaborators: GetStreamCollaborators
|
|
serverOrigin: string
|
|
createAppToken: CreateAndStoreAppToken
|
|
requestObjectPreview: RequestObjectPreview
|
|
storeObjectPreview: StoreObjectPreview
|
|
}): CreateObjectPreview =>
|
|
async ({ streamId, objectId, priority }) => {
|
|
const owners = await getStreamCollaborators(streamId, Roles.Stream.Owner)
|
|
// there is always an owner, this is safe
|
|
const userId = owners[0].id
|
|
|
|
// we're running the preview generation in the name of a project owner
|
|
const token = await createAppToken({
|
|
appId: DefaultAppIds.Web,
|
|
name: `preview-${streamId}@${objectId}`,
|
|
userId,
|
|
scopes: [Scopes.Streams.Read],
|
|
lifespan: 120 * 60 * 1000, // for now, lets make this valid for 2 hours
|
|
limitResources: [
|
|
{
|
|
id: streamId,
|
|
type: TokenResourceIdentifierType.Project
|
|
}
|
|
]
|
|
})
|
|
const url = new URL(
|
|
`/projects/${streamId}/models/${objectId}`,
|
|
serverOrigin
|
|
).toString()
|
|
await requestObjectPreview({ jobId: `${streamId}.${objectId}`, token, url })
|
|
await storeObjectPreview({ streamId, objectId, priority })
|
|
}
|