@fmsim/fmsim 2.0.0-beta.87 → 2.0.0-beta.88

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.
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
+ require("./routes");
4
5
  tslib_1.__exportStar(require("./service"), exports);
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;AAAA,oDAAyB","sourcesContent":["export * from './service'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;AAAA,oBAAiB;AAEjB,oDAAyB","sourcesContent":["import './routes'\n\nexport * from './service'\n"]}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * fmsim 테스트 환경 mock 서버 REST 라우트.
5
+ *
6
+ * 프로덕션(fmsim-restful)은 MCS LV RESTful 서비스가 GET /machineUnits/{type} 를 응답한다.
7
+ * fmsim 은 테스트 환경이므로, 클라이언트(@fmsim/api 의 fetchMachineUnits)가 lv_server_ip_port
8
+ * 미설정 상태에서 same-origin 으로 호출하는 동일 경로를 이 라우트가 mock 으로 응답한다.
9
+ *
10
+ * GET /machineUnits?type={type}[&machine={parentMachine}]
11
+ * - type : 컴포넌트 타입 (query 파라미터)
12
+ * - machine: unit 타입일 때만 — 부모 머신 id (조회 범위 한정)
13
+ * - keyword 는 받지 않는다 (클라이언트가 후보 목록을 받아 로컬 필터)
14
+ *
15
+ * @things-factory 모듈 라우트 등록 규약: shell 이 부팅 시 emit 하는
16
+ * 'bootstrap-module-global-public-route' 이벤트로 globalPublicRouter(koa-router) 를 받아
17
+ * 라우트를 추가한다. (server/index.ts 가 이 모듈을 import 하여 리스너를 등록한다.)
18
+ */
19
+ const machine_units_mock_1 = require("./service/machine-units/machine-units-mock");
20
+ /** 테스트용 의도적 지연 (0.1 ~ 1.0초) — 클라이언트 비동기 처리 검증용. */
21
+ function mockLatency() {
22
+ const ms = 100 + Math.floor(Math.random() * 900);
23
+ return new Promise(resolve => setTimeout(resolve, ms));
24
+ }
25
+ process.on('bootstrap-module-global-public-route', (_app, globalPublicRouter) => {
26
+ globalPublicRouter.get('/machineUnits', async (ctx) => {
27
+ const type = typeof ctx.query.type === 'string' ? ctx.query.type : '';
28
+ const machine = typeof ctx.query.machine === 'string' ? ctx.query.machine : undefined;
29
+ // 테스트 환경 mock — 실제 서버 지연을 모사해 클라이언트 비동기 흐름(로딩 표시 등) 확인.
30
+ await mockLatency();
31
+ ctx.type = 'application/json';
32
+ ctx.body = (0, machine_units_mock_1.searchMockMachineUnits)(type, machine ? { machine } : {});
33
+ });
34
+ });
35
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../server/routes.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;;GAeG;AACH,mFAAmF;AAEnF,mDAAmD;AACnD,SAAS,WAAW;IAClB,MAAM,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;IAChD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AACxD,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,sCAA6C,EAAE,CAAC,IAAS,EAAE,kBAAuB,EAAE,EAAE;IAC/F,kBAAkB,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,GAAQ,EAAE,EAAE;QACzD,MAAM,IAAI,GAAW,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QAC7E,MAAM,OAAO,GAAuB,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;QAEzG,wDAAwD;QACxD,MAAM,WAAW,EAAE,CAAA;QAEnB,GAAG,CAAC,IAAI,GAAG,kBAAkB,CAAA;QAC7B,GAAG,CAAC,IAAI,GAAG,IAAA,2CAAsB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["/**\n * fmsim 테스트 환경 mock 서버 REST 라우트.\n *\n * 프로덕션(fmsim-restful)은 MCS LV RESTful 서비스가 GET /machineUnits/{type} 를 응답한다.\n * fmsim 은 테스트 환경이므로, 클라이언트(@fmsim/api 의 fetchMachineUnits)가 lv_server_ip_port\n * 미설정 상태에서 same-origin 으로 호출하는 동일 경로를 이 라우트가 mock 으로 응답한다.\n *\n * GET /machineUnits?type={type}[&machine={parentMachine}]\n * - type : 컴포넌트 타입 (query 파라미터)\n * - machine: unit 타입일 때만 — 부모 머신 id (조회 범위 한정)\n * - keyword 는 받지 않는다 (클라이언트가 후보 목록을 받아 로컬 필터)\n *\n * @things-factory 모듈 라우트 등록 규약: shell 이 부팅 시 emit 하는\n * 'bootstrap-module-global-public-route' 이벤트로 globalPublicRouter(koa-router) 를 받아\n * 라우트를 추가한다. (server/index.ts 가 이 모듈을 import 하여 리스너를 등록한다.)\n */\nimport { searchMockMachineUnits } from './service/machine-units/machine-units-mock'\n\n/** 테스트용 의도적 지연 (0.1 ~ 1.0초) — 클라이언트 비동기 처리 검증용. */\nfunction mockLatency(): Promise<void> {\n const ms = 100 + Math.floor(Math.random() * 900)\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nprocess.on('bootstrap-module-global-public-route' as any, (_app: any, globalPublicRouter: any) => {\n globalPublicRouter.get('/machineUnits', async (ctx: any) => {\n const type: string = typeof ctx.query.type === 'string' ? ctx.query.type : ''\n const machine: string | undefined = typeof ctx.query.machine === 'string' ? ctx.query.machine : undefined\n\n // 테스트 환경 mock — 실제 서버 지연을 모사해 클라이언트 비동기 흐름(로딩 표시 등) 확인.\n await mockLatency()\n\n ctx.type = 'application/json'\n ctx.body = searchMockMachineUnits(type, machine ? { machine } : {})\n })\n})\n"]}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ /*
3
+ * 머신/유닛 ID 검색 — 서버측 가상(mock) 데이터.
4
+ *
5
+ * 프로덕션(fmsim-restful)은 MCS LV RESTful 서비스가 /machineUnits/{type} 를 응답한다.
6
+ * fmsim 은 테스트 환경이므로 이 모듈이 같은 형태의 가상 응답을 만들어 mock 라우트가 응답한다.
7
+ *
8
+ * 엔티티는 machine 과 unit 으로 나뉜다 (키 = 실제 모델 타입):
9
+ * - machine: 독립 엔티티 (STOCKER, Conveyor, Equipment, Buffer, AGV, OHT, Shuttle, …)
10
+ * - unit: 어떤 machine 에 소속되는 엔티티 (Port, Shelf, Crane).
11
+ *
12
+ * 결과는 **1차원 id 리스트(string[])**:
13
+ * - machine 조회 → 머신 id 리스트.
14
+ * - unit 조회 → unit id 리스트 (머신별 그룹핑 없음). unit id 는 부모 머신을 접두로
15
+ * 포함한다(예: STK01-P03). opts.machine 지정 시 그 머신 소속으로 좁힌다.
16
+ *
17
+ * 외부 의존 없는 순수 함수.
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.MACHINE_UNIT_SEARCH_LIMIT = void 0;
21
+ exports.searchMockMachineUnits = searchMockMachineUnits;
22
+ function seq(prefix, count, pad = 2) {
23
+ return Array.from({ length: count }, (_, i) => `${prefix}${String(i + 1).padStart(pad, '0')}`);
24
+ }
25
+ /**
26
+ * machine 타입 → 머신 id 후보 selector.
27
+ * 키는 **실제 모델 타입(@sceneComponent 등록명)** — 'STOCKER'(대문자) 등 등록 그대로.
28
+ */
29
+ const MACHINE_TYPES = {
30
+ STOCKER: () => seq('STK', 10),
31
+ Equipment: () => seq('EQP', 20),
32
+ Buffer: () => seq('BUF', 10),
33
+ Conveyor: () => seq('CNV', 30),
34
+ ConveyorJoin: () => seq('CNVJ', 10),
35
+ CraneRail: () => seq('CRAIL', 6),
36
+ OHTLine: () => seq('OHTLINE', 3),
37
+ AGVLine: () => seq('AGVLINE', 6),
38
+ AGV: () => seq('AGV', 20),
39
+ OHT: () => seq('OHT', 10),
40
+ Shuttle: () => seq('SHTL', 8)
41
+ };
42
+ /**
43
+ * unit 타입 → 부모 machine 에 소속. 키는 실제 모델 타입. id = `{machine}-{prefix}{nn}`.
44
+ */
45
+ const UNIT_TYPES = {
46
+ Port: { prefix: 'P', count: 20 },
47
+ Shelf: { prefix: 'SH', count: 30 },
48
+ Crane: { prefix: 'CR', count: 2 }
49
+ };
50
+ /** machine 미지정 시 unit 을 펼칠 표본 부모 머신 (Stocker). */
51
+ const SAMPLE_UNIT_PARENTS = seq('STK', 10);
52
+ /** 응답 ID 총 개수 상한. */
53
+ exports.MACHINE_UNIT_SEARCH_LIMIT = 50;
54
+ /**
55
+ * 컴포넌트 타입으로 후보 id 리스트를 생성 (가상). **1차원 string[]** 반환.
56
+ *
57
+ * @param type 실제 모델 타입 (예: 'STOCKER', 'AGV', 'Port'). 정확 매칭.
58
+ * @param opts machine(부모 머신 id, unit 조회 시) / limit.
59
+ * @returns string[] (총 id 개수 limit 까지). 매핑 없는 타입은 빈 배열.
60
+ */
61
+ function searchMockMachineUnits(type, opts = {}) {
62
+ const t = String(type || '');
63
+ const { machine, limit = exports.MACHINE_UNIT_SEARCH_LIMIT } = opts;
64
+ const cap = Math.max(0, limit);
65
+ const unitSpec = UNIT_TYPES[t];
66
+ if (unitSpec) {
67
+ // unit 조회 — 부모 머신 접두를 포함한 unit id 평면 리스트
68
+ const parents = machine ? [machine] : SAMPLE_UNIT_PARENTS;
69
+ const out = [];
70
+ for (const parent of parents) {
71
+ if (out.length >= cap)
72
+ break;
73
+ out.push(...seq(`${parent}-${unitSpec.prefix}`, unitSpec.count).slice(0, cap - out.length));
74
+ }
75
+ return out;
76
+ }
77
+ // machine 조회 — 머신 id 평면 리스트
78
+ const selector = MACHINE_TYPES[t];
79
+ if (!selector)
80
+ return [];
81
+ return selector().slice(0, cap);
82
+ }
83
+ //# sourceMappingURL=machine-units-mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine-units-mock.js","sourceRoot":"","sources":["../../../server/service/machine-units/machine-units-mock.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;AAqDH,wDAqBC;AAjED,SAAS,GAAG,CAAC,MAAc,EAAE,KAAa,EAAE,MAAc,CAAC;IACzD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;AAChG,CAAC;AAED;;;GAGG;AACH,MAAM,aAAa,GAAmC;IACpD,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;IAC7B,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;IAC5B,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;IAC9B,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;IACnC,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAChC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IAChC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IAChC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;IACzB,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;IACzB,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9B,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,GAAsD;IACpE,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;IAChC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;IAClC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;CAClC,CAAA;AAED,kDAAkD;AAClD,MAAM,mBAAmB,GAAG,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AAE1C,qBAAqB;AACR,QAAA,yBAAyB,GAAG,EAAE,CAAA;AAE3C;;;;;;GAMG;AACH,SAAgB,sBAAsB,CAAC,IAAY,EAAE,OAAiC,EAAE;IACtF,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IAC5B,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,iCAAyB,EAAE,GAAG,IAAI,CAAA;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IAE9B,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;IAC9B,IAAI,QAAQ,EAAE,CAAC;QACb,yCAAyC;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAA;QACzD,MAAM,GAAG,GAAa,EAAE,CAAA;QACxB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;gBAAE,MAAK;YAC5B,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7F,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;IACjC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAA;IACxB,OAAO,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AACjC,CAAC","sourcesContent":["/*\n * 머신/유닛 ID 검색 — 서버측 가상(mock) 데이터.\n *\n * 프로덕션(fmsim-restful)은 MCS LV RESTful 서비스가 /machineUnits/{type} 를 응답한다.\n * fmsim 은 테스트 환경이므로 이 모듈이 같은 형태의 가상 응답을 만들어 mock 라우트가 응답한다.\n *\n * 엔티티는 machine 과 unit 으로 나뉜다 (키 = 실제 모델 타입):\n * - machine: 독립 엔티티 (STOCKER, Conveyor, Equipment, Buffer, AGV, OHT, Shuttle, …)\n * - unit: 어떤 machine 에 소속되는 엔티티 (Port, Shelf, Crane).\n *\n * 결과는 **1차원 id 리스트(string[])**:\n * - machine 조회 → 머신 id 리스트.\n * - unit 조회 → unit id 리스트 (머신별 그룹핑 없음). unit id 는 부모 머신을 접두로\n * 포함한다(예: STK01-P03). opts.machine 지정 시 그 머신 소속으로 좁힌다.\n *\n * 외부 의존 없는 순수 함수.\n */\n\nexport interface MachineUnitSearchOptions {\n /** 부모 machine id — unit 조회를 그 machine 소속으로 좁힌다 (선택). */\n machine?: string\n /** 결과 id 총 개수 상한 (기본 MACHINE_UNIT_SEARCH_LIMIT). */\n limit?: number\n}\n\nfunction seq(prefix: string, count: number, pad: number = 2): string[] {\n return Array.from({ length: count }, (_, i) => `${prefix}${String(i + 1).padStart(pad, '0')}`)\n}\n\n/**\n * machine 타입 → 머신 id 후보 selector.\n * 키는 **실제 모델 타입(@sceneComponent 등록명)** — 'STOCKER'(대문자) 등 등록 그대로.\n */\nconst MACHINE_TYPES: Record<string, () => string[]> = {\n STOCKER: () => seq('STK', 10),\n Equipment: () => seq('EQP', 20),\n Buffer: () => seq('BUF', 10),\n Conveyor: () => seq('CNV', 30),\n ConveyorJoin: () => seq('CNVJ', 10),\n CraneRail: () => seq('CRAIL', 6),\n OHTLine: () => seq('OHTLINE', 3),\n AGVLine: () => seq('AGVLINE', 6),\n AGV: () => seq('AGV', 20),\n OHT: () => seq('OHT', 10),\n Shuttle: () => seq('SHTL', 8)\n}\n\n/**\n * unit 타입 → 부모 machine 에 소속. 키는 실제 모델 타입. id = `{machine}-{prefix}{nn}`.\n */\nconst UNIT_TYPES: Record<string, { prefix: string; count: number }> = {\n Port: { prefix: 'P', count: 20 },\n Shelf: { prefix: 'SH', count: 30 },\n Crane: { prefix: 'CR', count: 2 }\n}\n\n/** machine 미지정 시 unit 을 펼칠 표본 부모 머신 (Stocker). */\nconst SAMPLE_UNIT_PARENTS = seq('STK', 10)\n\n/** 응답 ID 총 개수 상한. */\nexport const MACHINE_UNIT_SEARCH_LIMIT = 50\n\n/**\n * 컴포넌트 타입으로 후보 id 리스트를 생성 (가상). **1차원 string[]** 반환.\n *\n * @param type 실제 모델 타입 (예: 'STOCKER', 'AGV', 'Port'). 정확 매칭.\n * @param opts machine(부모 머신 id, unit 조회 시) / limit.\n * @returns string[] (총 id 개수 limit 까지). 매핑 없는 타입은 빈 배열.\n */\nexport function searchMockMachineUnits(type: string, opts: MachineUnitSearchOptions = {}): string[] {\n const t = String(type || '')\n const { machine, limit = MACHINE_UNIT_SEARCH_LIMIT } = opts\n const cap = Math.max(0, limit)\n\n const unitSpec = UNIT_TYPES[t]\n if (unitSpec) {\n // unit 조회 — 부모 머신 접두를 포함한 unit id 평면 리스트\n const parents = machine ? [machine] : SAMPLE_UNIT_PARENTS\n const out: string[] = []\n for (const parent of parents) {\n if (out.length >= cap) break\n out.push(...seq(`${parent}-${unitSpec.prefix}`, unitSpec.count).slice(0, cap - out.length))\n }\n return out\n }\n\n // machine 조회 — 머신 id 평면 리스트\n const selector = MACHINE_TYPES[t]\n if (!selector) return []\n return selector().slice(0, cap)\n}\n"]}