@rasterex/viewer 1.0.0

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.
Files changed (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +279 -0
  3. package/SECURITY.md +54 -0
  4. package/dist/RasterexViewer.d.ts +70 -0
  5. package/dist/RasterexViewer.d.ts.map +1 -0
  6. package/dist/RasterexViewer.js +410 -0
  7. package/dist/RasterexViewer.js.map +1 -0
  8. package/dist/compat/matrix.d.ts +9 -0
  9. package/dist/compat/matrix.d.ts.map +1 -0
  10. package/dist/compat/matrix.js +12 -0
  11. package/dist/compat/matrix.js.map +1 -0
  12. package/dist/constants.d.ts +8 -0
  13. package/dist/constants.d.ts.map +1 -0
  14. package/dist/constants.js +8 -0
  15. package/dist/constants.js.map +1 -0
  16. package/dist/createDocumentViewer.d.ts +8 -0
  17. package/dist/createDocumentViewer.d.ts.map +1 -0
  18. package/dist/createDocumentViewer.js +16 -0
  19. package/dist/createDocumentViewer.js.map +1 -0
  20. package/dist/createViewer.d.ts +4 -0
  21. package/dist/createViewer.d.ts.map +1 -0
  22. package/dist/createViewer.js +5 -0
  23. package/dist/createViewer.js.map +1 -0
  24. package/dist/demo-presets.d.ts +45 -0
  25. package/dist/demo-presets.d.ts.map +1 -0
  26. package/dist/demo-presets.js +22 -0
  27. package/dist/demo-presets.js.map +1 -0
  28. package/dist/demoPresets.d.ts +2 -0
  29. package/dist/demoPresets.d.ts.map +1 -0
  30. package/dist/demoPresets.js +2 -0
  31. package/dist/demoPresets.js.map +1 -0
  32. package/dist/diagnostics.d.ts +76 -0
  33. package/dist/diagnostics.d.ts.map +1 -0
  34. package/dist/diagnostics.js +38 -0
  35. package/dist/diagnostics.js.map +1 -0
  36. package/dist/domains/AnnotationsApi.d.ts +139 -0
  37. package/dist/domains/AnnotationsApi.d.ts.map +1 -0
  38. package/dist/domains/AnnotationsApi.js +256 -0
  39. package/dist/domains/AnnotationsApi.js.map +1 -0
  40. package/dist/domains/BlocksApi.d.ts +151 -0
  41. package/dist/domains/BlocksApi.d.ts.map +1 -0
  42. package/dist/domains/BlocksApi.js +191 -0
  43. package/dist/domains/BlocksApi.js.map +1 -0
  44. package/dist/domains/CanvasApi.d.ts +13 -0
  45. package/dist/domains/CanvasApi.d.ts.map +1 -0
  46. package/dist/domains/CanvasApi.js +22 -0
  47. package/dist/domains/CanvasApi.js.map +1 -0
  48. package/dist/domains/CollaborationApi.d.ts +65 -0
  49. package/dist/domains/CollaborationApi.d.ts.map +1 -0
  50. package/dist/domains/CollaborationApi.js +177 -0
  51. package/dist/domains/CollaborationApi.js.map +1 -0
  52. package/dist/domains/CompareApi.d.ts +73 -0
  53. package/dist/domains/CompareApi.d.ts.map +1 -0
  54. package/dist/domains/CompareApi.js +175 -0
  55. package/dist/domains/CompareApi.js.map +1 -0
  56. package/dist/domains/DocumentsApi.d.ts +175 -0
  57. package/dist/domains/DocumentsApi.d.ts.map +1 -0
  58. package/dist/domains/DocumentsApi.js +407 -0
  59. package/dist/domains/DocumentsApi.js.map +1 -0
  60. package/dist/domains/LayersApi.d.ts +76 -0
  61. package/dist/domains/LayersApi.d.ts.map +1 -0
  62. package/dist/domains/LayersApi.js +159 -0
  63. package/dist/domains/LayersApi.js.map +1 -0
  64. package/dist/domains/MeasurementsApi.d.ts +150 -0
  65. package/dist/domains/MeasurementsApi.d.ts.map +1 -0
  66. package/dist/domains/MeasurementsApi.js +388 -0
  67. package/dist/domains/MeasurementsApi.js.map +1 -0
  68. package/dist/domains/StylesApi.d.ts +50 -0
  69. package/dist/domains/StylesApi.d.ts.map +1 -0
  70. package/dist/domains/StylesApi.js +53 -0
  71. package/dist/domains/StylesApi.js.map +1 -0
  72. package/dist/domains/ToolsApi.d.ts +251 -0
  73. package/dist/domains/ToolsApi.d.ts.map +1 -0
  74. package/dist/domains/ToolsApi.js +275 -0
  75. package/dist/domains/ToolsApi.js.map +1 -0
  76. package/dist/domains/canvasBrokerCommands.d.ts +38 -0
  77. package/dist/domains/canvasBrokerCommands.d.ts.map +1 -0
  78. package/dist/domains/canvasBrokerCommands.js +79 -0
  79. package/dist/domains/canvasBrokerCommands.js.map +1 -0
  80. package/dist/errors.d.ts +28 -0
  81. package/dist/errors.d.ts.map +1 -0
  82. package/dist/errors.js +82 -0
  83. package/dist/errors.js.map +1 -0
  84. package/dist/index.d.ts +45 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +26 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/messaging/CanvasMessageBroker.d.ts +36 -0
  89. package/dist/messaging/CanvasMessageBroker.d.ts.map +1 -0
  90. package/dist/messaging/CanvasMessageBroker.js +95 -0
  91. package/dist/messaging/CanvasMessageBroker.js.map +1 -0
  92. package/dist/messaging/IframeTransport.d.ts +29 -0
  93. package/dist/messaging/IframeTransport.d.ts.map +1 -0
  94. package/dist/messaging/IframeTransport.js +74 -0
  95. package/dist/messaging/IframeTransport.js.map +1 -0
  96. package/dist/messaging/MessageClient.d.ts +32 -0
  97. package/dist/messaging/MessageClient.d.ts.map +1 -0
  98. package/dist/messaging/MessageClient.js +110 -0
  99. package/dist/messaging/MessageClient.js.map +1 -0
  100. package/dist/messaging/ViewerMessagingSession.d.ts +17 -0
  101. package/dist/messaging/ViewerMessagingSession.d.ts.map +1 -0
  102. package/dist/messaging/ViewerMessagingSession.js +17 -0
  103. package/dist/messaging/ViewerMessagingSession.js.map +1 -0
  104. package/dist/protocol/capabilities.d.ts +6 -0
  105. package/dist/protocol/capabilities.d.ts.map +1 -0
  106. package/dist/protocol/capabilities.js +5 -0
  107. package/dist/protocol/capabilities.js.map +1 -0
  108. package/dist/protocol/compatibility.d.ts +7 -0
  109. package/dist/protocol/compatibility.d.ts.map +1 -0
  110. package/dist/protocol/compatibility.js +2 -0
  111. package/dist/protocol/compatibility.js.map +1 -0
  112. package/dist/protocol/constants.d.ts +3 -0
  113. package/dist/protocol/constants.d.ts.map +1 -0
  114. package/dist/protocol/constants.js +3 -0
  115. package/dist/protocol/constants.js.map +1 -0
  116. package/dist/protocol/envelope.d.ts +27 -0
  117. package/dist/protocol/envelope.d.ts.map +1 -0
  118. package/dist/protocol/envelope.js +2 -0
  119. package/dist/protocol/envelope.js.map +1 -0
  120. package/dist/protocol/errors.d.ts +42 -0
  121. package/dist/protocol/errors.d.ts.map +1 -0
  122. package/dist/protocol/errors.js +35 -0
  123. package/dist/protocol/errors.js.map +1 -0
  124. package/dist/protocol/handshake.d.ts +13 -0
  125. package/dist/protocol/handshake.d.ts.map +1 -0
  126. package/dist/protocol/handshake.js +2 -0
  127. package/dist/protocol/handshake.js.map +1 -0
  128. package/dist/protocol/index.d.ts +10 -0
  129. package/dist/protocol/index.d.ts.map +1 -0
  130. package/dist/protocol/index.js +5 -0
  131. package/dist/protocol/index.js.map +1 -0
  132. package/dist/types.d.ts +29 -0
  133. package/dist/types.d.ts.map +1 -0
  134. package/dist/types.js +2 -0
  135. package/dist/types.js.map +1 -0
  136. package/dist/utils/DomainEventEmitter.d.ts +12 -0
  137. package/dist/utils/DomainEventEmitter.d.ts.map +1 -0
  138. package/dist/utils/DomainEventEmitter.js +34 -0
  139. package/dist/utils/DomainEventEmitter.js.map +1 -0
  140. package/dist/utils/compatibility.d.ts +15 -0
  141. package/dist/utils/compatibility.d.ts.map +1 -0
  142. package/dist/utils/compatibility.js +170 -0
  143. package/dist/utils/compatibility.js.map +1 -0
  144. package/dist/utils/createRequestId.d.ts +2 -0
  145. package/dist/utils/createRequestId.d.ts.map +1 -0
  146. package/dist/utils/createRequestId.js +6 -0
  147. package/dist/utils/createRequestId.js.map +1 -0
  148. package/dist/utils/createSdkInstanceId.d.ts +2 -0
  149. package/dist/utils/createSdkInstanceId.d.ts.map +1 -0
  150. package/dist/utils/createSdkInstanceId.js +6 -0
  151. package/dist/utils/createSdkInstanceId.js.map +1 -0
  152. package/dist/utils/deriveOrigin.d.ts +2 -0
  153. package/dist/utils/deriveOrigin.d.ts.map +1 -0
  154. package/dist/utils/deriveOrigin.js +4 -0
  155. package/dist/utils/deriveOrigin.js.map +1 -0
  156. package/package.json +46 -0
@@ -0,0 +1,151 @@
1
+ import type { CanvasMessageBroker } from "../messaging/CanvasMessageBroker.js";
2
+ import { type DomainEventHandler, type DomainEventUnsubscribe } from "../utils/DomainEventEmitter.js";
3
+ export interface BlockItem {
4
+ index?: number;
5
+ name?: string;
6
+ visible: boolean;
7
+ selected?: boolean;
8
+ hasAttribute?: boolean;
9
+ [key: string]: unknown;
10
+ }
11
+ export interface BlockAttribute {
12
+ name: string;
13
+ value: unknown;
14
+ blockref?: number;
15
+ [key: string]: unknown;
16
+ }
17
+ export interface BlockBounds {
18
+ minX?: number;
19
+ minY?: number;
20
+ maxX?: number;
21
+ maxY?: number;
22
+ width?: number;
23
+ height?: number;
24
+ area?: number;
25
+ [key: string]: unknown;
26
+ }
27
+ export interface BlockInsertDetails {
28
+ blockhandleLow?: number;
29
+ blockhandleHigh?: number;
30
+ insertX?: number;
31
+ insertY?: number;
32
+ insertZ?: number;
33
+ insertRot?: number;
34
+ insertscaleX?: number;
35
+ insertscaleY?: number;
36
+ insertscaleZ?: number;
37
+ blockref?: number;
38
+ MinX?: number;
39
+ MinY?: number;
40
+ MaxX?: number;
41
+ MaxY?: number;
42
+ type?: string;
43
+ [key: string]: unknown;
44
+ }
45
+ export interface BlockDetails {
46
+ index?: number;
47
+ name?: string;
48
+ state?: number;
49
+ defaultstate?: number;
50
+ defaultcolor?: string | null;
51
+ color?: string | null;
52
+ fillstyle?: string | null;
53
+ defaultfillstyle?: string | null;
54
+ overridecolor?: boolean;
55
+ overridefill?: boolean;
56
+ hatchstyle?: string | null;
57
+ selected?: boolean;
58
+ listed?: boolean;
59
+ insert?: BlockInsertDetails;
60
+ drawn?: boolean;
61
+ mouseon?: boolean;
62
+ hasAttribute?: boolean;
63
+ fold?: number;
64
+ bounds?: BlockBounds;
65
+ [key: string]: unknown;
66
+ }
67
+ export interface BlockDetailsItem {
68
+ index?: number;
69
+ name?: string;
70
+ visible?: boolean;
71
+ selected?: boolean;
72
+ hasAttribute?: boolean;
73
+ details?: BlockDetails;
74
+ attributes?: BlockAttribute[];
75
+ [key: string]: unknown;
76
+ }
77
+ export interface BlocksSnapshot {
78
+ requestId?: string;
79
+ fileId?: string;
80
+ fileIndex?: number;
81
+ fileName?: string;
82
+ blocks: BlockItem[];
83
+ [key: string]: unknown;
84
+ }
85
+ export interface BlockDetailsSnapshot {
86
+ requestId?: string;
87
+ fileId?: string;
88
+ fileIndex?: number;
89
+ fileName?: string;
90
+ blocks: BlockDetailsItem[];
91
+ [key: string]: unknown;
92
+ }
93
+ export type BlockAttributesSnapshot = BlockDetailsSnapshot;
94
+ export interface GetBlocksOptions {
95
+ requestId?: string;
96
+ timeoutMs?: number;
97
+ }
98
+ export interface GetBlockDetailsOptions {
99
+ requestId?: string;
100
+ index?: number;
101
+ indexes?: number[];
102
+ timeoutMs?: number;
103
+ }
104
+ export type GetBlockAttributesOptions = GetBlockDetailsOptions;
105
+ export interface SetBlockVisibilityOptions {
106
+ requestId?: string;
107
+ index?: number;
108
+ indexes?: number[];
109
+ name?: string;
110
+ names?: string[];
111
+ all?: boolean;
112
+ visible: boolean;
113
+ }
114
+ export interface BlocksEventMap {
115
+ snapshot: BlocksSnapshot;
116
+ detailsSnapshot: BlockDetailsSnapshot;
117
+ attributesSnapshot: BlockAttributesSnapshot;
118
+ }
119
+ export type BlocksEventName = keyof BlocksEventMap;
120
+ export type BlocksEventHandler<TEventName extends BlocksEventName> = DomainEventHandler<BlocksEventMap[TEventName]>;
121
+ export type BlocksEventUnsubscribe = DomainEventUnsubscribe;
122
+ export interface BlocksApiOptions {
123
+ getBroker: () => CanvasMessageBroker | null;
124
+ getIsReady: () => boolean;
125
+ commandTimeoutMs: number;
126
+ }
127
+ export declare class BlocksApi {
128
+ private readonly options;
129
+ private readonly events;
130
+ private broker;
131
+ private brokerCleanups;
132
+ constructor(options: BlocksApiOptions);
133
+ on<TEventName extends BlocksEventName>(eventName: TEventName, handler: BlocksEventHandler<TEventName>): BlocksEventUnsubscribe;
134
+ connect(): void;
135
+ disconnect(): void;
136
+ getBlocks(options?: GetBlocksOptions): Promise<BlocksSnapshot>;
137
+ getDetails(options: GetBlockDetailsOptions): Promise<BlockDetailsSnapshot>;
138
+ getBlockDetails(options: GetBlockDetailsOptions): Promise<BlockDetailsSnapshot>;
139
+ getAttributes(options: GetBlockAttributesOptions): Promise<BlockAttributesSnapshot>;
140
+ getBlockAttributes(options: GetBlockAttributesOptions): Promise<BlockAttributesSnapshot>;
141
+ setVisibility(options: SetBlockVisibilityOptions): void;
142
+ setBlockVisibility(options: SetBlockVisibilityOptions): void;
143
+ private sendAndWaitForSnapshot;
144
+ private validateIndexSelector;
145
+ private validateSetVisibilityOptions;
146
+ private validateNumber;
147
+ private validateNumberArray;
148
+ private validateText;
149
+ private validateTextArray;
150
+ }
151
+ //# sourceMappingURL=BlocksApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlocksApi.d.ts","sourceRoot":"","sources":["../../src/domains/BlocksApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,191 @@
1
+ import { createCommandTimeoutError } from "../errors.js";
2
+ import { createRequestId } from "../utils/createRequestId.js";
3
+ import { DomainEventEmitter } from "../utils/DomainEventEmitter.js";
4
+ import { createCanvasCommandError, requireReadyBroker, sendCanvasFireAndForget } from "./canvasBrokerCommands.js";
5
+ export class BlocksApi {
6
+ constructor(options) {
7
+ this.events = new DomainEventEmitter();
8
+ this.broker = null;
9
+ this.brokerCleanups = [];
10
+ this.options = options;
11
+ }
12
+ on(eventName, handler) {
13
+ this.connect();
14
+ return this.events.on(eventName, handler);
15
+ }
16
+ connect() {
17
+ const broker = this.options.getBroker();
18
+ if (!broker || broker === this.broker) {
19
+ return;
20
+ }
21
+ this.disconnect();
22
+ this.broker = broker;
23
+ this.brokerCleanups = [
24
+ broker.on("blocksSnapshot", (message) => {
25
+ if (isBlocksSnapshot(message.payload)) {
26
+ this.events.emit("snapshot", message.payload);
27
+ }
28
+ }),
29
+ broker.on("blockDetailsSnapshot", (message) => {
30
+ if (isBlockDetailsSnapshot(message.payload)) {
31
+ this.events.emit("detailsSnapshot", message.payload);
32
+ }
33
+ }),
34
+ broker.on("blockAttributesSnapshot", (message) => {
35
+ if (isBlockDetailsSnapshot(message.payload)) {
36
+ this.events.emit("attributesSnapshot", message.payload);
37
+ }
38
+ })
39
+ ];
40
+ }
41
+ disconnect() {
42
+ for (const cleanup of this.brokerCleanups) {
43
+ cleanup();
44
+ }
45
+ this.brokerCleanups = [];
46
+ this.broker = null;
47
+ }
48
+ getBlocks(options = {}) {
49
+ const requestId = options.requestId ?? createRequestId();
50
+ return this.sendAndWaitForSnapshot("getBlocks", "blocksSnapshot", { requestId }, requestId, isBlocksSnapshot, options.timeoutMs);
51
+ }
52
+ getDetails(options) {
53
+ this.validateIndexSelector("getBlockDetails", options);
54
+ const requestId = options.requestId ?? createRequestId();
55
+ const { timeoutMs, ...payloadOptions } = options;
56
+ return this.sendAndWaitForSnapshot("getBlockDetails", "blockDetailsSnapshot", {
57
+ ...payloadOptions,
58
+ requestId
59
+ }, requestId, isBlockDetailsSnapshot, timeoutMs);
60
+ }
61
+ getBlockDetails(options) {
62
+ return this.getDetails(options);
63
+ }
64
+ getAttributes(options) {
65
+ this.validateIndexSelector("getBlockAttributes", options);
66
+ const requestId = options.requestId ?? createRequestId();
67
+ const { timeoutMs, ...payloadOptions } = options;
68
+ return this.sendAndWaitForSnapshot("getBlockAttributes", "blockAttributesSnapshot", {
69
+ ...payloadOptions,
70
+ requestId
71
+ }, requestId, isBlockDetailsSnapshot, timeoutMs);
72
+ }
73
+ getBlockAttributes(options) {
74
+ return this.getAttributes(options);
75
+ }
76
+ setVisibility(options) {
77
+ this.validateSetVisibilityOptions(options);
78
+ sendCanvasFireAndForget({
79
+ ...this.options,
80
+ type: "setBlockVisibility",
81
+ payload: {
82
+ ...options,
83
+ requestId: options.requestId ?? createRequestId()
84
+ },
85
+ apiName: "viewer.blocks"
86
+ });
87
+ }
88
+ setBlockVisibility(options) {
89
+ this.setVisibility(options);
90
+ }
91
+ sendAndWaitForSnapshot(type, resultType, payload, requestId, isSnapshot, timeoutMs = this.options.commandTimeoutMs) {
92
+ const broker = requireReadyBroker({
93
+ ...this.options,
94
+ type,
95
+ apiName: "viewer.blocks"
96
+ });
97
+ return new Promise((resolve, reject) => {
98
+ const cleanup = broker.on(resultType, (message) => {
99
+ const snapshot = message.payload;
100
+ if (!isSnapshot(snapshot) || snapshot.requestId !== requestId) {
101
+ return;
102
+ }
103
+ globalThis.clearTimeout(timeoutId);
104
+ cleanup();
105
+ resolve(snapshot);
106
+ });
107
+ const timeoutId = globalThis.setTimeout(() => {
108
+ cleanup();
109
+ reject(createCommandTimeoutError(requestId, type, timeoutMs));
110
+ }, timeoutMs);
111
+ broker.send(type, payload);
112
+ });
113
+ }
114
+ validateIndexSelector(type, options) {
115
+ if (!options || typeof options !== "object") {
116
+ throw createCanvasCommandError(type, "Block request options must be an object.", {
117
+ options
118
+ });
119
+ }
120
+ const selectorCount = [
121
+ options.index !== undefined,
122
+ options.indexes !== undefined
123
+ ].filter(Boolean).length;
124
+ if (selectorCount !== 1) {
125
+ throw createCanvasCommandError(type, "Block details and attribute requests require exactly one selector: index or indexes.", { options });
126
+ }
127
+ this.validateNumber(type, "index", options.index, options);
128
+ this.validateNumberArray(type, "indexes", options.indexes, options);
129
+ }
130
+ validateSetVisibilityOptions(options) {
131
+ if (!options || typeof options !== "object") {
132
+ throw createCanvasCommandError("setBlockVisibility", "Block visibility options must be an object.", { options });
133
+ }
134
+ if (typeof options.visible !== "boolean") {
135
+ throw createCanvasCommandError("setBlockVisibility", "Block visibility requires a boolean visible value.", { options });
136
+ }
137
+ const selectorCount = [
138
+ options.index !== undefined,
139
+ options.indexes !== undefined,
140
+ options.name !== undefined,
141
+ options.names !== undefined,
142
+ options.all === true
143
+ ].filter(Boolean).length;
144
+ if (selectorCount !== 1) {
145
+ throw createCanvasCommandError("setBlockVisibility", "Block visibility requires exactly one selector: index, indexes, name, names, or all.", { options });
146
+ }
147
+ this.validateNumber("setBlockVisibility", "index", options.index, options);
148
+ this.validateNumberArray("setBlockVisibility", "indexes", options.indexes, options);
149
+ this.validateText("name", options.name, options);
150
+ this.validateTextArray("names", options.names, options);
151
+ }
152
+ validateNumber(type, fieldName, value, options) {
153
+ if (value === undefined)
154
+ return;
155
+ if (!Number.isInteger(value) || value < 0) {
156
+ throw createCanvasCommandError(type, `${fieldName} must be a non-negative integer.`, { options });
157
+ }
158
+ }
159
+ validateNumberArray(type, fieldName, value, options) {
160
+ if (value === undefined)
161
+ return;
162
+ if (!Array.isArray(value) ||
163
+ value.length === 0 ||
164
+ !value.every((item) => Number.isInteger(item) && item >= 0)) {
165
+ throw createCanvasCommandError(type, `${fieldName} must be a non-empty array of non-negative integers.`, { options });
166
+ }
167
+ }
168
+ validateText(fieldName, value, options) {
169
+ if (value === undefined)
170
+ return;
171
+ if (value.trim().length === 0) {
172
+ throw createCanvasCommandError("setBlockVisibility", `${fieldName} must not be empty.`, { options });
173
+ }
174
+ }
175
+ validateTextArray(fieldName, value, options) {
176
+ if (value === undefined)
177
+ return;
178
+ if (!Array.isArray(value) ||
179
+ value.length === 0 ||
180
+ !value.every((item) => item.trim().length > 0)) {
181
+ throw createCanvasCommandError("setBlockVisibility", `${fieldName} must be a non-empty array of non-empty strings.`, { options });
182
+ }
183
+ }
184
+ }
185
+ function isBlocksSnapshot(payload) {
186
+ return !!payload && typeof payload === "object" && Array.isArray(payload.blocks);
187
+ }
188
+ function isBlockDetailsSnapshot(payload) {
189
+ return !!payload && typeof payload === "object" && Array.isArray(payload.blocks);
190
+ }
191
+ //# sourceMappingURL=BlocksApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlocksApi.js","sourceRoot":"","sources":["../../src/domains/BlocksApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { CanvasMessage, CanvasMessageBroker, CanvasMessageHandler, CanvasMessageUnsubscribe } from "../messaging/CanvasMessageBroker.js";
2
+ export interface CanvasApiOptions {
3
+ getBroker: () => CanvasMessageBroker | null;
4
+ }
5
+ export declare class CanvasApi {
6
+ private readonly getBroker;
7
+ constructor(options: CanvasApiOptions);
8
+ send<TPayload = unknown>(type: string, payload?: TPayload): void;
9
+ on<TPayload = unknown>(type: string, handler: CanvasMessageHandler<TPayload>): CanvasMessageUnsubscribe;
10
+ private requireBroker;
11
+ }
12
+ export type { CanvasMessage, CanvasMessageHandler, CanvasMessageUnsubscribe };
13
+ //# sourceMappingURL=CanvasApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CanvasApi.d.ts","sourceRoot":"","sources":["../../src/domains/CanvasApi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,qCAAqC,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,mBAAmB,GAAG,IAAI,CAAC;CAC7C;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;gBAEjD,OAAO,EAAE,gBAAgB;IAIrC,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI;IAIhE,EAAE,CAAC,QAAQ,GAAG,OAAO,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACtC,wBAAwB;IAI3B,OAAO,CAAC,aAAa;CActB;AAED,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,wBAAwB,EACzB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { createViewerNotReadyError } from "../errors.js";
2
+ export class CanvasApi {
3
+ constructor(options) {
4
+ this.getBroker = options.getBroker;
5
+ }
6
+ send(type, payload) {
7
+ this.requireBroker("send").send(type, payload);
8
+ }
9
+ on(type, handler) {
10
+ return this.requireBroker("subscribe").on(type, handler);
11
+ }
12
+ requireBroker(action) {
13
+ const broker = this.getBroker();
14
+ if (!broker) {
15
+ throw createViewerNotReadyError("RasterexViewer must be mounted before using viewer.canvas.", {
16
+ action
17
+ });
18
+ }
19
+ return broker;
20
+ }
21
+ }
22
+ //# sourceMappingURL=CanvasApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CanvasApi.js","sourceRoot":"","sources":["../../src/domains/CanvasApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAYzD,MAAM,OAAO,SAAS;IAGpB,YAAY,OAAyB;QACnC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACrC,CAAC;IAED,IAAI,CAAqB,IAAY,EAAE,OAAkB;QACvD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,EAAE,CACA,IAAY,EACZ,OAAuC;QAEvC,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAEO,aAAa,CAAC,MAA4B;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEhC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,yBAAyB,CAC7B,4DAA4D,EAC5D;gBACE,MAAM;aACP,CACF,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,65 @@
1
+ import { type DomainEventHandler, type DomainEventUnsubscribe } from "../utils/DomainEventEmitter.js";
2
+ import type { CanvasMessageBroker } from "../messaging/CanvasMessageBroker.js";
3
+ export interface CollaborationUserPayload {
4
+ username: string;
5
+ displayName?: string;
6
+ email?: string;
7
+ }
8
+ export interface CollaborationTooltipConfig {
9
+ iconSrc?: string;
10
+ title?: string;
11
+ message?: string;
12
+ messageTemplate?: string;
13
+ duration?: number;
14
+ position?: [number | "center", number];
15
+ }
16
+ export interface CollaborationConfigPayload {
17
+ enabled?: boolean;
18
+ canCollaborate?: boolean;
19
+ roomId?: string;
20
+ collaborationRoomId?: string;
21
+ canFileOpen?: boolean;
22
+ localStoreAnnotation?: boolean;
23
+ dbBackendApiKey?: string;
24
+ collaborationTooltip?: CollaborationTooltipConfig;
25
+ [key: string]: unknown;
26
+ }
27
+ export type CollaborationEnableOptions = Omit<CollaborationConfigPayload, "enabled" | "canCollaborate">;
28
+ export interface SetUserOptions extends CollaborationUserPayload {
29
+ timeoutMs?: number;
30
+ }
31
+ export interface SetUserResultPayload {
32
+ success: boolean;
33
+ reason?: string;
34
+ }
35
+ export interface CollaborationEventMap {
36
+ setUserResult: SetUserResultPayload;
37
+ }
38
+ export type CollaborationEventName = keyof CollaborationEventMap;
39
+ export type CollaborationEventHandler<TEventName extends CollaborationEventName> = DomainEventHandler<CollaborationEventMap[TEventName]>;
40
+ export type CollaborationEventUnsubscribe = DomainEventUnsubscribe;
41
+ export interface CollaborationApiOptions {
42
+ getBroker: () => CanvasMessageBroker | null;
43
+ getIsReady: () => boolean;
44
+ commandTimeoutMs: number;
45
+ }
46
+ export declare class CollaborationApi {
47
+ private readonly options;
48
+ private readonly events;
49
+ private broker;
50
+ private brokerCleanups;
51
+ private setUserInProgress;
52
+ constructor(options: CollaborationApiOptions);
53
+ on<TEventName extends CollaborationEventName>(eventName: TEventName, handler: CollaborationEventHandler<TEventName>): CollaborationEventUnsubscribe;
54
+ connect(): void;
55
+ disconnect(): void;
56
+ setUser(options: SetUserOptions): Promise<SetUserResultPayload>;
57
+ configure(payload: CollaborationConfigPayload): void;
58
+ enable(options?: CollaborationEnableOptions): void;
59
+ disable(options?: CollaborationEnableOptions): void;
60
+ private sendCollaboration;
61
+ private validateUserPayload;
62
+ private validateConfigPayload;
63
+ private validateTooltip;
64
+ }
65
+ //# sourceMappingURL=CollaborationApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollaborationApi.d.ts","sourceRoot":"","sources":["../../src/domains/CollaborationApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import { DomainEventEmitter } from "../utils/DomainEventEmitter.js";
2
+ import { createCommandTimeoutError } from "../errors.js";
3
+ import { createCanvasCommandError, requireReadyBroker } from "./canvasBrokerCommands.js";
4
+ export class CollaborationApi {
5
+ constructor(options) {
6
+ this.events = new DomainEventEmitter();
7
+ this.broker = null;
8
+ this.brokerCleanups = [];
9
+ this.setUserInProgress = false;
10
+ this.options = options;
11
+ }
12
+ on(eventName, handler) {
13
+ this.connect();
14
+ return this.events.on(eventName, handler);
15
+ }
16
+ connect() {
17
+ const broker = this.options.getBroker();
18
+ if (!broker || broker === this.broker) {
19
+ return;
20
+ }
21
+ this.disconnect();
22
+ this.broker = broker;
23
+ this.brokerCleanups = [
24
+ broker.on("setUserResult", (message) => {
25
+ if (isSetUserResultPayload(message.payload)) {
26
+ this.events.emit("setUserResult", message.payload);
27
+ }
28
+ })
29
+ ];
30
+ }
31
+ disconnect() {
32
+ for (const cleanup of this.brokerCleanups) {
33
+ cleanup();
34
+ }
35
+ this.brokerCleanups = [];
36
+ this.broker = null;
37
+ this.setUserInProgress = false;
38
+ }
39
+ setUser(options) {
40
+ const { timeoutMs, ...payload } = options;
41
+ this.validateUserPayload(payload);
42
+ if (this.setUserInProgress) {
43
+ return Promise.reject(createCanvasCommandError("setUser", "Only one collaboration setUser request can be active for a viewer iframe."));
44
+ }
45
+ const broker = requireReadyBroker({
46
+ ...this.options,
47
+ type: "setUser",
48
+ apiName: "viewer.collaboration"
49
+ });
50
+ const resultTimeoutMs = timeoutMs ?? this.options.commandTimeoutMs;
51
+ this.setUserInProgress = true;
52
+ return new Promise((resolve, reject) => {
53
+ const cleanup = broker.on("setUserResult", (message) => {
54
+ if (!isSetUserResultPayload(message.payload)) {
55
+ return;
56
+ }
57
+ globalThis.clearTimeout(timeoutId);
58
+ cleanup();
59
+ this.setUserInProgress = false;
60
+ resolve(message.payload);
61
+ });
62
+ const timeoutId = globalThis.setTimeout(() => {
63
+ cleanup();
64
+ this.setUserInProgress = false;
65
+ reject(createCommandTimeoutError("setUserResult", "setUser", resultTimeoutMs));
66
+ }, resultTimeoutMs);
67
+ broker.send("setUser", payload);
68
+ });
69
+ }
70
+ configure(payload) {
71
+ this.validateConfigPayload(payload);
72
+ this.sendCollaboration(payload);
73
+ }
74
+ enable(options = {}) {
75
+ this.validateConfigPayload(options);
76
+ this.sendCollaboration({
77
+ ...options,
78
+ enabled: true
79
+ });
80
+ }
81
+ disable(options = {}) {
82
+ this.validateConfigPayload(options);
83
+ this.sendCollaboration({
84
+ ...options,
85
+ enabled: false
86
+ });
87
+ }
88
+ sendCollaboration(payload) {
89
+ requireReadyBroker({
90
+ ...this.options,
91
+ type: "collaboration",
92
+ apiName: "viewer.collaboration"
93
+ }).send("collaboration", payload);
94
+ }
95
+ validateUserPayload(payload) {
96
+ if (!hasText(payload.username)) {
97
+ throw createCanvasCommandError("setUser", "Collaboration user requires a non-empty username.", {
98
+ payload
99
+ });
100
+ }
101
+ if (payload.displayName !== undefined && typeof payload.displayName !== "string") {
102
+ throw createCanvasCommandError("setUser", "Collaboration user displayName must be a string when provided.", {
103
+ payload
104
+ });
105
+ }
106
+ if (payload.email !== undefined && typeof payload.email !== "string") {
107
+ throw createCanvasCommandError("setUser", "Collaboration user email must be a string when provided.", {
108
+ payload
109
+ });
110
+ }
111
+ }
112
+ validateConfigPayload(payload) {
113
+ if (!payload || typeof payload !== "object") {
114
+ throw createCanvasCommandError("collaboration", "Collaboration config requires a payload object.", {
115
+ payload
116
+ });
117
+ }
118
+ if (payload.enabled !== undefined && typeof payload.enabled !== "boolean") {
119
+ throw createCanvasCommandError("collaboration", "Collaboration enabled must be a boolean when provided.", {
120
+ payload
121
+ });
122
+ }
123
+ if (payload.canCollaborate !== undefined &&
124
+ typeof payload.canCollaborate !== "boolean") {
125
+ throw createCanvasCommandError("collaboration", "Collaboration canCollaborate must be a boolean when provided.", {
126
+ payload
127
+ });
128
+ }
129
+ if (payload.roomId !== undefined && !hasText(payload.roomId)) {
130
+ throw createCanvasCommandError("collaboration", "Collaboration roomId must be a non-empty string when provided.", {
131
+ payload
132
+ });
133
+ }
134
+ if (payload.collaborationRoomId !== undefined &&
135
+ !hasText(payload.collaborationRoomId)) {
136
+ throw createCanvasCommandError("collaboration", "Collaboration collaborationRoomId must be a non-empty string when provided.", {
137
+ payload
138
+ });
139
+ }
140
+ if (payload.collaborationTooltip !== undefined) {
141
+ this.validateTooltip(payload.collaborationTooltip, payload);
142
+ }
143
+ }
144
+ validateTooltip(tooltip, payload) {
145
+ if (!tooltip || typeof tooltip !== "object") {
146
+ throw createCanvasCommandError("collaboration", "Collaboration tooltip config must be an object when provided.", {
147
+ payload
148
+ });
149
+ }
150
+ if (tooltip.duration !== undefined &&
151
+ !Number.isFinite(tooltip.duration)) {
152
+ throw createCanvasCommandError("collaboration", "Collaboration tooltip duration must be a finite number when provided.", {
153
+ payload
154
+ });
155
+ }
156
+ if (tooltip.position === undefined) {
157
+ return;
158
+ }
159
+ const [x, y] = tooltip.position;
160
+ if (!Array.isArray(tooltip.position) ||
161
+ tooltip.position.length !== 2 ||
162
+ !((typeof x === "number" && Number.isFinite(x)) || x === "center") ||
163
+ typeof y !== "number" ||
164
+ !Number.isFinite(y)) {
165
+ throw createCanvasCommandError("collaboration", "Collaboration tooltip position must be [number | \"center\", number] when provided.", {
166
+ payload
167
+ });
168
+ }
169
+ }
170
+ }
171
+ function hasText(value) {
172
+ return typeof value === "string" && value.trim().length > 0;
173
+ }
174
+ function isSetUserResultPayload(payload) {
175
+ return !!payload && typeof payload === "object" && typeof payload.success === "boolean";
176
+ }
177
+ //# sourceMappingURL=CollaborationApi.js.map