Skip to content

Commit

Permalink
default exports
Browse files Browse the repository at this point in the history
  • Loading branch information
lmdulz committed Mar 6, 2024
1 parent 6981311 commit 60aee44
Show file tree
Hide file tree
Showing 12 changed files with 99 additions and 55 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,4 @@ src/loader.ts

# Build stuff
dist
demo/dist
14 changes: 9 additions & 5 deletions src/addressanonymizer.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { data } from "dcmjs";
import type { dataSet } from "dcmjs";
import { data, dataSet } from "dcmjs";
import { lists } from "./lists";
import { Randomizer } from "./randomizer";
import Randomizer from "./randomizer";

export class AddressAnonymizer {
class AddressAnonymizer {
private randomizer: Randomizer;
private lists: lists;

Expand Down Expand Up @@ -40,10 +39,13 @@ export class AddressAnonymizer {
}

return true;
} else {
} else if (dataset[dataTag].Value.length == 1) {
const originalValue: string = dataset[dataTag].Value[0];
dataset[dataTag].Value[0] = await valueFactory(originalValue);
return true;
} else {
dataset[dataTag].Value[0] = await valueFactory("");
return true;
}
};

Expand Down Expand Up @@ -92,3 +94,5 @@ export class AddressAnonymizer {
return `${this.lists.countries[countryIndex]}`;
};
}

export default AddressAnonymizer;
49 changes: 30 additions & 19 deletions src/anonymizer.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
import { data, dataSet } from "dcmjs";
import { AddressAnonymizer } from "./addressanonymizer";
import { DateTimeAnonymizer } from "./datetimeanonymizer";
import { FixedValueAnonymizer } from "./fixedvalueanonymizer";
import { IDAnonymizer } from "./idanonymizer";
import { InstitutionAnonymizer } from "./institutionanonymizer";
import { PNAnonymizer } from "./pnanonymizer";
import { PrivatTagAnonymizer } from "./privatetaganonymizer";
import { Randomizer } from "./randomizer";
import { UIAnonymizer } from "./uianonymizer";
import { UnwantedElementStripper } from "./unwantedelements";
import { ValueKeeper } from "./valuekeeper";

type ElementHandler = (dataset: dataSet, tag: string) => boolean | Promise<boolean>;

export class Anonymizer {
import AddressAnonymizer from "./addressanonymizer";
import DateTimeAnonymizer from "./datetimeanonymizer";
import FixedValueAnonymizer from "./fixedvalueanonymizer";
import IDAnonymizer from "./idanonymizer";
import InstitutionAnonymizer from "./institutionanonymizer";
import PNAnonymizer from "./pnanonymizer";
import PrivatTagAnonymizer from "./privatetaganonymizer";
import Randomizer from "./randomizer";
import UIAnonymizer from "./uianonymizer";
import UnwantedElementStripper from "./unwantedelements";
import ValueKeeper from "./valuekeeper";

type ElementHandler = (
dataset: dataSet,
tag: string
) => boolean | Promise<boolean>;

export default class Anonymizer {
/**
The main class responsible for anonymizing dcmjs datasets.
New instances will anonymize instances differently, so when
Expand Down Expand Up @@ -93,7 +96,9 @@ export class Anonymizer {
this.elementHandlers.unshift(new ValueKeeper(protectedTags).keep);
}
if (this.patientID) {
this.elementHandlers.unshift(new FixedValueAnonymizer("00100020", this.patientID).anonymize);
this.elementHandlers.unshift(
new FixedValueAnonymizer("00100020", this.patientID).anonymize
);
}
if (this.anonymizePrivateTags) {
this.elementHandlers.push(new PrivatTagAnonymizer().anonymize);
Expand All @@ -103,15 +108,17 @@ export class Anonymizer {
const res = await this.randomizer.toInt("dateOffset");
const minimumOffsetHours: number = 62 * 24;
const maximumOffsetHours: number = 730 * 24;

this.dateOffsetHours = Number(
-(
(res % (BigInt(maximumOffsetHours) - BigInt(minimumOffsetHours))) +
BigInt(minimumOffsetHours)
)
);

this.elementHandlers.push(new DateTimeAnonymizer(this.dateOffsetHours).anonymize);
this.elementHandlers.push(
new DateTimeAnonymizer(this.dateOffsetHours).anonymize
);
}

async anonymize(dcmDict: data.DicomDict) {
Expand Down Expand Up @@ -139,7 +146,11 @@ export class Anonymizer {
}
}

async anonymizeElement(dataset: dataSet, tag: string, handler: ElementHandler[]) {
async anonymizeElement(
dataset: dataSet,
tag: string,
handler: ElementHandler[]
) {
// Perform operations on the element

for (const callback of handler) {
Expand Down
15 changes: 11 additions & 4 deletions src/datetimeanonymizer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ type returnarg = {
tag: string;
};

export class DateTimeAnonymizer {
class DateTimeAnonymizer {
private offset: number;

constructor(dateOffsetHours: number) {
Expand Down Expand Up @@ -92,7 +92,8 @@ export class DateTimeAnonymizer {
};

formatDate = (date: Date, format: string): string => {
const padZero = (value: number, length: number) => String(value).padStart(length, "0");
const padZero = (value: number, length: number) =>
String(value).padStart(length, "0");

const year = padZero(date.getFullYear(), 4);
const month = padZero(date.getMonth() + 1, 2); // Months are zero-indexed, so add 1
Expand All @@ -116,13 +117,17 @@ export class DateTimeAnonymizer {
const maxLength = Math.max(...arr.map((arr: string) => arr.length));

return Array.from({ length: maxLength }, (_, index) => {
return arr.map((arr: string[number]) => (arr[index] !== undefined ? arr[index] : fillValue));
return arr.map((arr: string[number]) =>
arr[index] !== undefined ? arr[index] : fillValue
);
});
};

checkTag = (dataset: dataSet, dataTag: string): returnarg => {
const tagName =
data.DicomMetaDictionary.dictionary[data.DicomMetaDictionary.punctuateTag(dataTag)].name;
data.DicomMetaDictionary.dictionary[
data.DicomMetaDictionary.punctuateTag(dataTag)
].name;
const timeName = tagName.replace("Date", "Time");

if (typeof data.DicomMetaDictionary.nameMap[timeName] !== "undefined") {
Expand Down Expand Up @@ -153,3 +158,5 @@ export class DateTimeAnonymizer {
}
};
}

export default DateTimeAnonymizer;
4 changes: 3 additions & 1 deletion src/fixedvalueanonymizer.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { dataSet } from "dcmjs";

export class FixedValueAnonymizer {
class FixedValueAnonymizer {
private tag: string;
private value: string;

Expand All @@ -19,3 +19,5 @@ export class FixedValueAnonymizer {
}
};
}

export default FixedValueAnonymizer;
10 changes: 7 additions & 3 deletions src/idanonymizer.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { data, dataSet } from "dcmjs";
import { Randomizer } from "./randomizer";
import Randomizer from "./randomizer";

export class IDAnonymizer {
class IDAnonymizer {
private keywords: string[];
private randomizer: Randomizer;
private idSuffix: string;
Expand Down Expand Up @@ -43,9 +43,11 @@ export class IDAnonymizer {
for (let i = 0; i < dataset[dataTag].Value.length; i++) {
dataset[dataTag].Value[i] = await this.newID(dataset[dataTag].Value[i]);
}
} else {
} else if (dataset[dataTag].Value.length == 1) {
const originalValue = dataset[dataTag].Value[0];
dataset[dataTag].Value[0] = await this.newID(originalValue);
} else {
dataset[dataTag].Value[0] = await this.newID("");
}
};

Expand All @@ -59,3 +61,5 @@ export class IDAnonymizer {
return this.idPrefix + idRoot + this.idSuffix;
};
}

export default IDAnonymizer;
16 changes: 8 additions & 8 deletions src/institutionanonymizer.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { data, dataSet } from "dcmjs";
import { AddressAnonymizer } from "./addressanonymizer";
import AddressAnonymizer from "./addressanonymizer";

export class InstitutionAnonymizer {
class InstitutionAnonymizer {
private addressAnonymizer: AddressAnonymizer;

institutionName: string = data.DicomMetaDictionary.nameMap["InstitutionName"].tag; //0008,0080
Expand Down Expand Up @@ -38,15 +38,13 @@ export class InstitutionAnonymizer {
for (let i = 0; i < dataset[dataTag].Value.length; i++) {
dataset[dataTag].Value[i] = await valueFactory(dataset[dataTag].Value[i]);
}
// dataset[dataTag].Value = await dataset[dataTag].Value.map((originalValue: string) => {
// return valueFactory(originalValue);
// });

return true;
} else {
} else if (dataset[dataTag].Value.length == 1) {
const originalValue: string = dataset[dataTag].Value[0];
dataset[dataTag].Value[0] = await valueFactory(originalValue);

return true;
} else {
dataset[dataTag].Value[0] = await valueFactory("");
return true;
}
};
Expand All @@ -72,3 +70,5 @@ export class InstitutionAnonymizer {
return Promise.resolve("RADIOLOGY");
};
}

export default InstitutionAnonymizer;
10 changes: 7 additions & 3 deletions src/pnanonymizer.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { dataSet } from "dcmjs";
import { lists } from "./lists";
import { Randomizer } from "./randomizer";
import Randomizer from "./randomizer";

export class PNAnonymizer {
class PNAnonymizer {
private randomizer: Randomizer;
lists: lists;

Expand All @@ -28,10 +28,12 @@ export class PNAnonymizer {
patientSex
);
}
} else {
} else if (dataset[dataTag].Value.length == 1) {
const originalName = dataset[dataTag].Value[0].Alphabetic;

dataset[dataTag].Value[0].Alphabetic = await this.newPN(originalName, patientSex);
} else {
dataset[dataTag].Value[0].Alphabetic = await this.newPN("", patientSex);
}

return true;
Expand Down Expand Up @@ -63,3 +65,5 @@ export class PNAnonymizer {
}`;
}
}

export default PNAnonymizer;
4 changes: 3 additions & 1 deletion src/privatetaganonymizer.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { data, dataSet } from "dcmjs";

export class PrivatTagAnonymizer {
class PrivatTagAnonymizer {
anonymize = (dataset: dataSet, dataTag: string): boolean => {
const currTag = data.Tag.fromString(dataTag);
if (currTag.group() % 2 === 1) {
Expand All @@ -11,3 +11,5 @@ export class PrivatTagAnonymizer {
}
};
}

export default PrivatTagAnonymizer;
17 changes: 10 additions & 7 deletions src/randomizer.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@


// use only in node env

export class Randomizer {
class Randomizer {
private seed: string;

constructor(seed = "") {
Expand Down Expand Up @@ -55,7 +51,9 @@ export class Randomizer {
// getRandomValues(randomValues);
// }

const seed = Array.from(randomValues, (byte) => byte.toString(16).padStart(2, "0")).join("");
const seed = Array.from(randomValues, (byte) =>
byte.toString(16).padStart(2, "0")
).join("");

return seed;
}
Expand Down Expand Up @@ -86,7 +84,10 @@ export class Randomizer {

return result;
}
public async getIntsFromRanges(originalValue: string, ...suprema: number[]): Promise<number[]> {
public async getIntsFromRanges(
originalValue: string,
...suprema: number[]
): Promise<number[]> {
let result: bigint | number[] = [];
let bigNumber = await this.toInt(originalValue);
const arr: number[] = [];
Expand All @@ -101,3 +102,5 @@ export class Randomizer {
return result;
}
}

export default Randomizer;
10 changes: 7 additions & 3 deletions src/uianonymizer.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { data, dataSet } from "dcmjs";
import { Randomizer } from "./randomizer";
import Randomizer from "./randomizer";

export class UIAnonymizer {
class UIAnonymizer {
private randomizer: Randomizer;

constructor(Randomizer: Randomizer) {
Expand All @@ -23,9 +23,11 @@ export class UIAnonymizer {
for (let i = 0; i < dataset[dataTag].Value.length; i++) {
dataset[dataTag].Value[i] = await this.newUI(dataset[dataTag].Value[i]);
}
} else {
} else if (dataset[dataTag].Value.length == 1) {
const originalUI = dataset[dataTag].Value[0];
dataset[dataTag].Value[0] = await this.newUI(originalUI);
} else {
dataset[dataTag].Value[0] = await this.newUI("");
}

return true;
Expand All @@ -38,3 +40,5 @@ export class UIAnonymizer {
return `2.${BigInt(10 ** 39) + number4String}`;
}
}

export default UIAnonymizer;
4 changes: 3 additions & 1 deletion src/valuekeeper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class TagError extends Error {
}
}

export class ValueKeeper {
class ValueKeeper {
private protectedTags: string[] = [];

constructor(keywords: string[] = []) {
Expand Down Expand Up @@ -50,3 +50,5 @@ export class ValueKeeper {
}
};
}

export default ValueKeeper;

0 comments on commit 60aee44

Please sign in to comment.