jobs.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /**
  2. * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { UUID } from '../../../mol-util';
  7. import { getQueryByName, QueryDefinition, QueryName, QueryParams, Encoding } from './api';
  8. import { LinkedList } from '../../../mol-data/generic';
  9. import { ResultWriter } from '../utils/writer';
  10. import { Mat4 } from '../../../mol-math/linear-algebra';
  11. export interface ResponseFormat {
  12. tarball: boolean,
  13. encoding: Encoding
  14. }
  15. export interface Job {
  16. id: UUID,
  17. datetime_utc: string,
  18. entries: JobEntry[],
  19. responseFormat: ResponseFormat,
  20. outputFilename?: string,
  21. writer: ResultWriter
  22. }
  23. export interface JobDefinition {
  24. entries: JobEntry[],
  25. writer: ResultWriter,
  26. options?: { outputFilename?: string, binary?: boolean, tarball?: boolean, encoding?: Encoding, download?: boolean }
  27. }
  28. export interface JobEntry {
  29. job: Job,
  30. sourceId: '_local_' | string,
  31. entryId: string,
  32. key: string,
  33. queryDefinition: QueryDefinition,
  34. normalizedParams: any,
  35. modelNums?: number[],
  36. copyAllCategories: boolean,
  37. transform?: Mat4
  38. }
  39. interface JobEntryDefinition<Name extends QueryName> {
  40. sourceId?: string, // = '_local_',
  41. entryId: string,
  42. queryName: Name,
  43. queryParams: QueryParams<Name>,
  44. modelNums?: number[],
  45. copyAllCategories: boolean,
  46. transform?: Mat4
  47. }
  48. export function JobEntry<Name extends QueryName>(definition: JobEntryDefinition<Name>): JobEntry {
  49. const queryDefinition = getQueryByName(definition.queryName);
  50. if (!queryDefinition) throw new Error(`Query '${definition.queryName}' is not supported.`);
  51. const normalizedParams = definition.queryParams;
  52. const sourceId = definition.sourceId || '_local_';
  53. return {
  54. job: void 0 as any,
  55. key: `${sourceId}/${definition.entryId}`,
  56. sourceId,
  57. entryId: definition.entryId,
  58. queryDefinition,
  59. normalizedParams,
  60. modelNums: definition.modelNums,
  61. copyAllCategories: !!definition.copyAllCategories,
  62. transform: definition.transform
  63. };
  64. }
  65. export function createJob(definition: JobDefinition): Job {
  66. const job: Job = {
  67. id: UUID.create22(),
  68. datetime_utc: `${new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')}`,
  69. entries: definition.entries,
  70. writer: definition.writer,
  71. responseFormat: {
  72. tarball: !!definition?.options?.tarball,
  73. encoding: definition?.options?.encoding ? definition.options.encoding : !!(definition.options && definition.options.binary) ? 'bcif' : 'cif'
  74. },
  75. outputFilename: definition.options && definition.options.outputFilename
  76. };
  77. definition.entries.forEach(e => e.job = job);
  78. return job;
  79. }
  80. class _JobQueue {
  81. private list: LinkedList<Job> = LinkedList();
  82. get size() {
  83. return this.list.count;
  84. }
  85. add(definition: JobDefinition) {
  86. const job = createJob(definition);
  87. this.list.addLast(job);
  88. return job.id;
  89. }
  90. hasNext(): boolean {
  91. return this.list.count > 0;
  92. }
  93. getNext(): Job {
  94. return this.list.removeFirst()!;
  95. }
  96. /** Sort the job list by key = sourceId/entryId */
  97. sort() {
  98. if (this.list.count === 0) return;
  99. const jobs: Job[] = [];
  100. for (let j = this.list.first; !!j; j = j.next) {
  101. jobs[jobs.length] = j.value;
  102. }
  103. jobs.sort((a, b) => a.entries[0]?.key < b.entries[0]?.key ? -1 : 1);
  104. this.list = LinkedList();
  105. for (const j of jobs) {
  106. this.list.addLast(j);
  107. }
  108. }
  109. }
  110. export const JobManager = new _JobQueue();