cod-dicomweb-server 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.
@@ -0,0 +1,130 @@
1
+ import { expose } from 'comlink';
2
+
3
+ const fileStreaming = {
4
+ maxFetchSize: 0,
5
+ fetchedSize: 0,
6
+
7
+ setMaxFetchSize(size: number): void {
8
+ if (size > 0) {
9
+ this.maxFetchSize = size;
10
+ }
11
+ },
12
+
13
+ decreaseFetchedSize(size: number): void {
14
+ if (size > 0 && size <= this.fetchedSize) {
15
+ this.fetchedSize -= size;
16
+ }
17
+ },
18
+
19
+ async stream(args: {
20
+ url: string;
21
+ headers?: Record<string, string>;
22
+ useSharedArrayBuffer?: boolean;
23
+ }): Promise<void> {
24
+ const { url, headers, useSharedArrayBuffer } = args;
25
+ const controller = new AbortController();
26
+ let sharedArraybuffer: SharedArrayBuffer | null = null;
27
+ let fileArraybuffer: Uint8Array | null = null;
28
+
29
+ try {
30
+ const response = await fetch(url, {
31
+ headers: { ...headers },
32
+ signal: controller.signal,
33
+ });
34
+
35
+ if (!response.ok) {
36
+ throw new Error(`HTTP error! status: ${response.status}`);
37
+ }
38
+
39
+ const reader = response.body?.getReader();
40
+ if (!reader) {
41
+ throw new Error('Failed to get reader from response body');
42
+ }
43
+
44
+ let result: ReadableStreamReadResult<Uint8Array>;
45
+ let completed = false;
46
+ const totalLength = parseInt(
47
+ response.headers.get('Content-Length') || '0',
48
+ 10,
49
+ );
50
+ const firstChunk = await reader.read();
51
+ completed = firstChunk.done;
52
+
53
+ if (!firstChunk.value) {
54
+ throw new Error('The fetched chunks does not have value');
55
+ }
56
+
57
+ if (!completed) {
58
+ let position = firstChunk.value.length;
59
+
60
+ if (
61
+ this.maxFetchSize &&
62
+ this.fetchedSize + position > this.maxFetchSize
63
+ ) {
64
+ controller.abort();
65
+ throw new Error(
66
+ `Maximum size(${this.maxFetchSize}) for fetching files reached`,
67
+ );
68
+ }
69
+
70
+ this.fetchedSize += position;
71
+
72
+ if (useSharedArrayBuffer) {
73
+ sharedArraybuffer = new SharedArrayBuffer(totalLength);
74
+ fileArraybuffer = new Uint8Array(sharedArraybuffer);
75
+ } else {
76
+ fileArraybuffer = new Uint8Array(totalLength);
77
+ }
78
+ fileArraybuffer.set(firstChunk.value);
79
+ postMessage({ url, position, fileArraybuffer });
80
+
81
+ while (!completed) {
82
+ result = await reader.read();
83
+
84
+ if (result.done) {
85
+ completed = true;
86
+ continue;
87
+ }
88
+
89
+ const chunk = result.value;
90
+
91
+ if (
92
+ this.maxFetchSize &&
93
+ this.fetchedSize + chunk.length > this.maxFetchSize
94
+ ) {
95
+ sharedArraybuffer = null;
96
+ fileArraybuffer = null;
97
+ controller.abort();
98
+ throw new Error(
99
+ `Maximum size(${this.maxFetchSize}) for fetching files reached`,
100
+ );
101
+ }
102
+
103
+ this.fetchedSize += chunk.length;
104
+ fileArraybuffer.set(chunk, position);
105
+ position += chunk.length;
106
+
107
+ postMessage({
108
+ isAppending: true,
109
+ url,
110
+ position: position,
111
+ chunk: !useSharedArrayBuffer ? chunk : null,
112
+ });
113
+ }
114
+ }
115
+ } catch (error) {
116
+ const streamingError = new Error(
117
+ 'fileStreaming.ts: ' + (error as Error).message ||
118
+ 'An error occured when streaming',
119
+ );
120
+ console.error(streamingError.message, error);
121
+ throw streamingError;
122
+ } finally {
123
+ sharedArraybuffer = null;
124
+ fileArraybuffer = null;
125
+ controller.abort();
126
+ }
127
+ },
128
+ };
129
+
130
+ expose(fileStreaming);
package/package.json ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "cod-dicomweb-server",
3
+ "title": "COD Dicomweb server",
4
+ "version": "1.0.0",
5
+ "private": false,
6
+ "description": "A wadors server proxy that get data from a COD format.",
7
+ "license": "MIT",
8
+ "author": "Adithyan DInesh",
9
+ "type": "module",
10
+ "main": "./dist/index.ts",
11
+ "keywords": [
12
+ "cod-dicomweb-server",
13
+ "server",
14
+ "cod",
15
+ "cloud-optimized-dicom",
16
+ "wadors-proxy",
17
+ "file-streaming",
18
+ "streaming"
19
+ ],
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "repository": "git+https://github.com/gradienthealth/cod-dicomweb-server.git",
24
+ "bugs": {
25
+ "url": "https://github.com/gradienthealth/cod-dicomweb-server/issues"
26
+ },
27
+ "homepage": "https://github.com/gradienthealth/cod-dicomweb-server#readme",
28
+ "scripts": {
29
+ "build": "webpack --progress --config webpack.config.babel.js",
30
+ "check-size": "webpack --config webpack.config.babel.js --profile --json > webpack-stats.json && webpack-bundle-analyzer webpack-stats.json",
31
+ "check-types": "tsc --project tsconfig.json --noEmit",
32
+ "dev": "yarn serve",
33
+ "lint": "yarn lint:all",
34
+ "lint:all": "yarn lint:scripts && yarn check-types",
35
+ "lint:all:fix": "yarn lint:scripts:fix && yarn lint:styles:fix",
36
+ "lint:fix": "yarn lint:all:fix",
37
+ "lint:scripts": "eslint --ignore-path .gitignore **/*.{js,jsx,cjs,json,ts,tsx}",
38
+ "lint:scripts:fix": "yarn lint:scripts --fix",
39
+ "prepare": "husky install",
40
+ "serve": "cross-env NODE_ENV=development webpack serve --config webpack.config.babel.js",
41
+ "test": "jest",
42
+ "test:watch": "yarn test --watch"
43
+ },
44
+ "browserslist": [
45
+ "defaults"
46
+ ],
47
+ "devDependencies": {
48
+ "@babel/core": "^7.23.9",
49
+ "@babel/preset-env": "^7.23.9",
50
+ "@babel/preset-typescript": "^7.23.3",
51
+ "@babel/register": "^7.23.7",
52
+ "@types/jest": "^29.5.12",
53
+ "@typescript-eslint/eslint-plugin": "^6.20.0",
54
+ "@typescript-eslint/parser": "^6.20.0",
55
+ "babel-jest": "^29.7.0",
56
+ "babel-loader": "^9.1.3",
57
+ "clean-webpack-plugin": "^4.0.0",
58
+ "copy-webpack-plugin": "^11.0.0",
59
+ "core-js": "^3.35.1",
60
+ "cross-env": "^7.0.3",
61
+ "dotenv": "^16.3.1",
62
+ "eslint": "^8.56.0",
63
+ "eslint-config-prettier": "^9.1.0",
64
+ "eslint-plugin-jest-formatting": "^3.1.0",
65
+ "eslint-webpack-plugin": "^4.0.1",
66
+ "html-webpack-plugin": "^5.6.0",
67
+ "husky": "^8.0.3",
68
+ "jest": "^29.7.0",
69
+ "lint-staged": "^15.2.1",
70
+ "prettier": "^3.1.0",
71
+ "style-loader": "^3.3.4",
72
+ "terser-webpack-plugin": "^5.3.10",
73
+ "ts-jest": "^29.1.2",
74
+ "ts-loader": "^9.5.1",
75
+ "typescript": "^5.3.3",
76
+ "webpack": "^5.89.0",
77
+ "webpack-bundle-analyzer": "^4.10.1",
78
+ "webpack-cli": "^5.1.4",
79
+ "webpack-dev-server": "^v4.15.1",
80
+ "webpack-merge": "^5.10.0"
81
+ },
82
+ "dependencies": {
83
+ "comlink": "^4.4.2",
84
+ "dicom-parser": "^1.8.21"
85
+ }
86
+ }