@intlayer/api 5.1.6 → 5.1.8

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.
@@ -45,24 +45,26 @@ class IntlayerEventListener {
45
45
  * (or the default config if none was provided).
46
46
  */
47
47
  async initialize() {
48
- try {
49
- const config = this.intlayerConfig ?? (0, import_client.getConfiguration)();
50
- const { backendURL } = config.editor;
51
- const oAuth2TokenResult = await import_getIntlayerAPI.intlayerAPI.auth.getOAuth2AccessToken();
52
- const accessToken = oAuth2TokenResult.data?.accessToken;
53
- if (!accessToken) {
54
- throw new Error("Failed to retrieve access token");
55
- }
56
- if (oAuth2TokenResult.data?.organization.plan?.type !== "ENTERPRISE")
57
- return;
58
- const API_ROUTE = `${backendURL}/api/event-listener`;
59
- const url = `${API_ROUTE}/${accessToken}`;
60
- this.eventSource = new EventSource(url);
61
- this.eventSource.onmessage = (event) => this.handleMessage(event);
62
- this.eventSource.onerror = (event) => this.handleError(event);
63
- } catch (error) {
64
- console.error("Error initializing IntlayerEventListener:", error);
48
+ const config = this.intlayerConfig ?? (0, import_client.getConfiguration)();
49
+ const { backendURL } = config.editor;
50
+ const oAuth2TokenResult = await (0, import_getIntlayerAPI.getIntlayerAPI)(
51
+ {},
52
+ config
53
+ ).auth.getOAuth2AccessToken();
54
+ const accessToken = oAuth2TokenResult.data?.accessToken;
55
+ if (!accessToken) {
56
+ throw new Error("Failed to retrieve access token");
57
+ }
58
+ if (oAuth2TokenResult.data?.organization.plan?.type !== "ENTERPRISE") {
59
+ throw new Error(
60
+ "Hot reload is enabled, but is only available for enterprise plans"
61
+ );
65
62
  }
63
+ const API_ROUTE = `${backendURL}/api/event-listener`;
64
+ const url = `${API_ROUTE}/${accessToken}`;
65
+ this.eventSource = new EventSource(url);
66
+ this.eventSource.onmessage = (event) => this.handleMessage(event);
67
+ this.eventSource.onerror = (event) => this.handleError(event);
66
68
  }
67
69
  /**
68
70
  * Cleans up (closes) the EventSource connection.
@@ -80,18 +82,19 @@ class IntlayerEventListener {
80
82
  async handleMessage(event) {
81
83
  try {
82
84
  const { data } = event;
83
- for (const dataEl of data) {
85
+ const dataJSON = JSON.parse(data);
86
+ for (const dataEl of dataJSON) {
84
87
  switch (dataEl.object) {
85
88
  case "DICTIONARY":
86
89
  switch (dataEl.status) {
87
90
  case "ADDED":
88
- await this.onDictionaryAdded?.(dataEl.dictionary);
91
+ await this.onDictionaryAdded?.(dataEl.data);
89
92
  break;
90
93
  case "UPDATED":
91
- await this.onDictionaryChange?.(dataEl.dictionary);
94
+ await this.onDictionaryChange?.(dataEl.data);
92
95
  break;
93
96
  case "DELETED":
94
- await this.onDictionaryDeleted?.(dataEl.dictionary);
97
+ await this.onDictionaryDeleted?.(dataEl.data);
95
98
  break;
96
99
  default:
97
100
  console.error("Unhandled dictionary status:", dataEl.status);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/IntlayerEventListener.ts"],"sourcesContent":["// @ts-ignore: @intlayer/backend is not built yet\nimport type { DictionaryAPI } from '@intlayer/backend';\nimport { type IntlayerConfig, getConfiguration } from '@intlayer/config/client';\nimport { intlayerAPI } from './getIntlayerAPI';\n\nexport type DictionaryMessageEvent = {\n object: 'DICTIONARY';\n dictionary: DictionaryAPI;\n status: 'ADDED' | 'UPDATED' | 'DELETED' | 'CREATED';\n};\n\nexport type IntlayerMessageEvent = MessageEvent<DictionaryMessageEvent[]>;\n\n/**\n * IntlayerEventListener class to listen for dictionary changes via SSE (Server-Sent Events).\n *\n * Usage example:\n *\n * import { buildIntlayerDictionary } from './transpiler/declaration_file_to_dictionary/intlayer_dictionary';\n * import { IntlayerEventListener } from '@intlayer/api';\n *\n * export const checkDictionaryChanges = async () => {\n * // Instantiate the listener\n * const eventListener = new IntlayerEventListener();\n *\n * // Set up your callbacks\n * eventListener.onDictionaryChange = async (dictionary) => {\n * await buildIntlayerDictionary(dictionary);\n * };\n *\n * // Initialize the listener\n * await eventListener.initialize();\n *\n * // Optionally, clean up later when you’re done\n * // eventListener.cleanup();\n * };\n */\nexport class IntlayerEventListener {\n private eventSource: EventSource | null = null;\n\n /**\n * Callback triggered when a Dictionary is ADDED.\n */\n public onDictionaryAdded?: (dictionary: DictionaryAPI) => any;\n\n /**\n * Callback triggered when a Dictionary is UPDATED.\n */\n public onDictionaryChange?: (dictionary: DictionaryAPI) => any;\n\n /**\n * Callback triggered when a Dictionary is DELETED.\n */\n public onDictionaryDeleted?: (dictionary: DictionaryAPI) => any;\n\n constructor(private intlayerConfig?: IntlayerConfig) {}\n\n /**\n * Initializes the EventSource connection using the given intlayerConfig\n * (or the default config if none was provided).\n */\n public async initialize(): Promise<void> {\n try {\n const config = this.intlayerConfig ?? getConfiguration();\n const { backendURL } = config.editor;\n\n // Retrieve the access token\n const oAuth2TokenResult = await intlayerAPI.auth.getOAuth2AccessToken();\n const accessToken = oAuth2TokenResult.data?.accessToken;\n\n if (!accessToken) {\n throw new Error('Failed to retrieve access token');\n }\n\n if (oAuth2TokenResult.data?.organization.plan?.type !== 'ENTERPRISE')\n return;\n\n const API_ROUTE = `${backendURL}/api/event-listener`;\n const url = `${API_ROUTE}/${accessToken}`;\n\n this.eventSource = new EventSource(url);\n this.eventSource.onmessage = (event) => this.handleMessage(event);\n this.eventSource.onerror = (event) => this.handleError(event);\n } catch (error) {\n console.error('Error initializing IntlayerEventListener:', error);\n }\n }\n\n /**\n * Cleans up (closes) the EventSource connection.\n */\n public cleanup(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n }\n\n /**\n * Handles incoming SSE messages, parses the event data,\n * and invokes the appropriate callback.\n */\n private async handleMessage(event: IntlayerMessageEvent): Promise<void> {\n try {\n const { data } = event;\n for (const dataEl of data) {\n switch (dataEl.object) {\n case 'DICTIONARY':\n switch (dataEl.status) {\n case 'ADDED':\n await this.onDictionaryAdded?.(dataEl.dictionary);\n break;\n case 'UPDATED':\n await this.onDictionaryChange?.(dataEl.dictionary);\n break;\n case 'DELETED':\n await this.onDictionaryDeleted?.(dataEl.dictionary);\n break;\n default:\n console.error('Unhandled dictionary status:', dataEl.status);\n break;\n }\n break;\n default:\n console.error('Unknown object type:', dataEl.object);\n break;\n }\n }\n } catch (error) {\n console.error('Error processing dictionary update:', error);\n }\n }\n\n /**\n * Handles any SSE errors and then performs cleanup.\n */\n private handleError(event: Event): void {\n console.error('EventSource error:', event);\n this.cleanup();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,oBAAsD;AACtD,4BAA4B;AAkCrB,MAAM,sBAAsB;AAAA,EAkBjC,YAAoB,gBAAiC;AAAjC;AAAA,EAAkC;AAAA,EAjB9C,cAAkC;AAAA;AAAA;AAAA;AAAA,EAKnC;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP,MAAa,aAA4B;AACvC,QAAI;AACF,YAAM,SAAS,KAAK,sBAAkB,gCAAiB;AACvD,YAAM,EAAE,WAAW,IAAI,OAAO;AAG9B,YAAM,oBAAoB,MAAM,kCAAY,KAAK,qBAAqB;AACtE,YAAM,cAAc,kBAAkB,MAAM;AAE5C,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,iCAAiC;AAAA,MACnD;AAEA,UAAI,kBAAkB,MAAM,aAAa,MAAM,SAAS;AACtD;AAEF,YAAM,YAAY,GAAG,UAAU;AAC/B,YAAM,MAAM,GAAG,SAAS,IAAI,WAAW;AAEvC,WAAK,cAAc,IAAI,YAAY,GAAG;AACtC,WAAK,YAAY,YAAY,CAAC,UAAU,KAAK,cAAc,KAAK;AAChE,WAAK,YAAY,UAAU,CAAC,UAAU,KAAK,YAAY,KAAK;AAAA,IAC9D,SAAS,OAAO;AACd,cAAQ,MAAM,6CAA6C,KAAK;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AACrB,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,MAAM;AACvB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cAAc,OAA4C;AACtE,QAAI;AACF,YAAM,EAAE,KAAK,IAAI;AACjB,iBAAW,UAAU,MAAM;AACzB,gBAAQ,OAAO,QAAQ;AAAA,UACrB,KAAK;AACH,oBAAQ,OAAO,QAAQ;AAAA,cACrB,KAAK;AACH,sBAAM,KAAK,oBAAoB,OAAO,UAAU;AAChD;AAAA,cACF,KAAK;AACH,sBAAM,KAAK,qBAAqB,OAAO,UAAU;AACjD;AAAA,cACF,KAAK;AACH,sBAAM,KAAK,sBAAsB,OAAO,UAAU;AAClD;AAAA,cACF;AACE,wBAAQ,MAAM,gCAAgC,OAAO,MAAM;AAC3D;AAAA,YACJ;AACA;AAAA,UACF;AACE,oBAAQ,MAAM,wBAAwB,OAAO,MAAM;AACnD;AAAA,QACJ;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,OAAoB;AACtC,YAAQ,MAAM,sBAAsB,KAAK;AACzC,SAAK,QAAQ;AAAA,EACf;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/IntlayerEventListener.ts"],"sourcesContent":["// @ts-ignore: @intlayer/backend is not built yet\nimport type { DictionaryAPI, MessageEventData } from '@intlayer/backend';\nimport { type IntlayerConfig, getConfiguration } from '@intlayer/config/client';\nimport { getIntlayerAPI } from './getIntlayerAPI';\n\nexport type IntlayerMessageEvent = MessageEvent;\n\n/**\n * IntlayerEventListener class to listen for dictionary changes via SSE (Server-Sent Events).\n *\n * Usage example:\n *\n * import { buildIntlayerDictionary } from './transpiler/declaration_file_to_dictionary/intlayer_dictionary';\n * import { IntlayerEventListener } from '@intlayer/api';\n *\n * export const checkDictionaryChanges = async () => {\n * // Instantiate the listener\n * const eventListener = new IntlayerEventListener();\n *\n * // Set up your callbacks\n * eventListener.onDictionaryChange = async (dictionary) => {\n * await buildIntlayerDictionary(dictionary);\n * };\n *\n * // Initialize the listener\n * await eventListener.initialize();\n *\n * // Optionally, clean up later when you’re done\n * // eventListener.cleanup();\n * };\n */\nexport class IntlayerEventListener {\n private eventSource: EventSource | null = null;\n\n /**\n * Callback triggered when a Dictionary is ADDED.\n */\n public onDictionaryAdded?: (dictionary: DictionaryAPI) => any;\n\n /**\n * Callback triggered when a Dictionary is UPDATED.\n */\n public onDictionaryChange?: (dictionary: DictionaryAPI) => any;\n\n /**\n * Callback triggered when a Dictionary is DELETED.\n */\n public onDictionaryDeleted?: (dictionary: DictionaryAPI) => any;\n\n constructor(private intlayerConfig?: IntlayerConfig) {}\n\n /**\n * Initializes the EventSource connection using the given intlayerConfig\n * (or the default config if none was provided).\n */\n public async initialize(): Promise<void> {\n const config = this.intlayerConfig ?? getConfiguration();\n const { backendURL } = config.editor;\n\n // Retrieve the access token\n const oAuth2TokenResult = await getIntlayerAPI(\n {},\n config\n ).auth.getOAuth2AccessToken();\n const accessToken = oAuth2TokenResult.data?.accessToken;\n\n if (!accessToken) {\n throw new Error('Failed to retrieve access token');\n }\n\n if (oAuth2TokenResult.data?.organization.plan?.type !== 'ENTERPRISE') {\n throw new Error(\n 'Hot reload is enabled, but is only available for enterprise plans'\n );\n }\n\n const API_ROUTE = `${backendURL}/api/event-listener`;\n const url = `${API_ROUTE}/${accessToken}`;\n\n this.eventSource = new EventSource(url);\n this.eventSource.onmessage = (event) => this.handleMessage(event);\n this.eventSource.onerror = (event) => this.handleError(event);\n }\n\n /**\n * Cleans up (closes) the EventSource connection.\n */\n public cleanup(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n }\n\n /**\n * Handles incoming SSE messages, parses the event data,\n * and invokes the appropriate callback.\n */\n private async handleMessage(event: IntlayerMessageEvent): Promise<void> {\n try {\n const { data } = event;\n\n const dataJSON: MessageEventData[] = JSON.parse(data);\n\n for (const dataEl of dataJSON) {\n switch (dataEl.object) {\n case 'DICTIONARY':\n switch (dataEl.status) {\n case 'ADDED':\n await this.onDictionaryAdded?.(dataEl.data);\n break;\n case 'UPDATED':\n await this.onDictionaryChange?.(dataEl.data);\n break;\n case 'DELETED':\n await this.onDictionaryDeleted?.(dataEl.data);\n break;\n default:\n console.error('Unhandled dictionary status:', dataEl.status);\n break;\n }\n break;\n default:\n console.error('Unknown object type:', dataEl.object);\n break;\n }\n }\n } catch (error) {\n console.error('Error processing dictionary update:', error);\n }\n }\n\n /**\n * Handles any SSE errors and then performs cleanup.\n */\n private handleError(event: Event): void {\n console.error('EventSource error:', event);\n this.cleanup();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,oBAAsD;AACtD,4BAA+B;AA4BxB,MAAM,sBAAsB;AAAA,EAkBjC,YAAoB,gBAAiC;AAAjC;AAAA,EAAkC;AAAA,EAjB9C,cAAkC;AAAA;AAAA;AAAA;AAAA,EAKnC;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP,MAAa,aAA4B;AACvC,UAAM,SAAS,KAAK,sBAAkB,gCAAiB;AACvD,UAAM,EAAE,WAAW,IAAI,OAAO;AAG9B,UAAM,oBAAoB,UAAM;AAAA,MAC9B,CAAC;AAAA,MACD;AAAA,IACF,EAAE,KAAK,qBAAqB;AAC5B,UAAM,cAAc,kBAAkB,MAAM;AAE5C,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,QAAI,kBAAkB,MAAM,aAAa,MAAM,SAAS,cAAc;AACpE,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,GAAG,UAAU;AAC/B,UAAM,MAAM,GAAG,SAAS,IAAI,WAAW;AAEvC,SAAK,cAAc,IAAI,YAAY,GAAG;AACtC,SAAK,YAAY,YAAY,CAAC,UAAU,KAAK,cAAc,KAAK;AAChE,SAAK,YAAY,UAAU,CAAC,UAAU,KAAK,YAAY,KAAK;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AACrB,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,MAAM;AACvB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cAAc,OAA4C;AACtE,QAAI;AACF,YAAM,EAAE,KAAK,IAAI;AAEjB,YAAM,WAA+B,KAAK,MAAM,IAAI;AAEpD,iBAAW,UAAU,UAAU;AAC7B,gBAAQ,OAAO,QAAQ;AAAA,UACrB,KAAK;AACH,oBAAQ,OAAO,QAAQ;AAAA,cACrB,KAAK;AACH,sBAAM,KAAK,oBAAoB,OAAO,IAAI;AAC1C;AAAA,cACF,KAAK;AACH,sBAAM,KAAK,qBAAqB,OAAO,IAAI;AAC3C;AAAA,cACF,KAAK;AACH,sBAAM,KAAK,sBAAsB,OAAO,IAAI;AAC5C;AAAA,cACF;AACE,wBAAQ,MAAM,gCAAgC,OAAO,MAAM;AAC3D;AAAA,YACJ;AACA;AAAA,UACF;AACE,oBAAQ,MAAM,wBAAwB,OAAO,MAAM;AACnD;AAAA,QACJ;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,OAAoB;AACtC,YAAQ,MAAM,sBAAsB,KAAK;AACzC,SAAK,QAAQ;AAAA,EACf;AACF;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import { getConfiguration } from "@intlayer/config/client";
2
- import { intlayerAPI } from "./getIntlayerAPI/index.mjs";
2
+ import { getIntlayerAPI } from "./getIntlayerAPI/index.mjs";
3
3
  class IntlayerEventListener {
4
4
  constructor(intlayerConfig) {
5
5
  this.intlayerConfig = intlayerConfig;
@@ -22,24 +22,26 @@ class IntlayerEventListener {
22
22
  * (or the default config if none was provided).
23
23
  */
24
24
  async initialize() {
25
- try {
26
- const config = this.intlayerConfig ?? getConfiguration();
27
- const { backendURL } = config.editor;
28
- const oAuth2TokenResult = await intlayerAPI.auth.getOAuth2AccessToken();
29
- const accessToken = oAuth2TokenResult.data?.accessToken;
30
- if (!accessToken) {
31
- throw new Error("Failed to retrieve access token");
32
- }
33
- if (oAuth2TokenResult.data?.organization.plan?.type !== "ENTERPRISE")
34
- return;
35
- const API_ROUTE = `${backendURL}/api/event-listener`;
36
- const url = `${API_ROUTE}/${accessToken}`;
37
- this.eventSource = new EventSource(url);
38
- this.eventSource.onmessage = (event) => this.handleMessage(event);
39
- this.eventSource.onerror = (event) => this.handleError(event);
40
- } catch (error) {
41
- console.error("Error initializing IntlayerEventListener:", error);
25
+ const config = this.intlayerConfig ?? getConfiguration();
26
+ const { backendURL } = config.editor;
27
+ const oAuth2TokenResult = await getIntlayerAPI(
28
+ {},
29
+ config
30
+ ).auth.getOAuth2AccessToken();
31
+ const accessToken = oAuth2TokenResult.data?.accessToken;
32
+ if (!accessToken) {
33
+ throw new Error("Failed to retrieve access token");
34
+ }
35
+ if (oAuth2TokenResult.data?.organization.plan?.type !== "ENTERPRISE") {
36
+ throw new Error(
37
+ "Hot reload is enabled, but is only available for enterprise plans"
38
+ );
42
39
  }
40
+ const API_ROUTE = `${backendURL}/api/event-listener`;
41
+ const url = `${API_ROUTE}/${accessToken}`;
42
+ this.eventSource = new EventSource(url);
43
+ this.eventSource.onmessage = (event) => this.handleMessage(event);
44
+ this.eventSource.onerror = (event) => this.handleError(event);
43
45
  }
44
46
  /**
45
47
  * Cleans up (closes) the EventSource connection.
@@ -57,18 +59,19 @@ class IntlayerEventListener {
57
59
  async handleMessage(event) {
58
60
  try {
59
61
  const { data } = event;
60
- for (const dataEl of data) {
62
+ const dataJSON = JSON.parse(data);
63
+ for (const dataEl of dataJSON) {
61
64
  switch (dataEl.object) {
62
65
  case "DICTIONARY":
63
66
  switch (dataEl.status) {
64
67
  case "ADDED":
65
- await this.onDictionaryAdded?.(dataEl.dictionary);
68
+ await this.onDictionaryAdded?.(dataEl.data);
66
69
  break;
67
70
  case "UPDATED":
68
- await this.onDictionaryChange?.(dataEl.dictionary);
71
+ await this.onDictionaryChange?.(dataEl.data);
69
72
  break;
70
73
  case "DELETED":
71
- await this.onDictionaryDeleted?.(dataEl.dictionary);
74
+ await this.onDictionaryDeleted?.(dataEl.data);
72
75
  break;
73
76
  default:
74
77
  console.error("Unhandled dictionary status:", dataEl.status);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/IntlayerEventListener.ts"],"sourcesContent":["// @ts-ignore: @intlayer/backend is not built yet\nimport type { DictionaryAPI } from '@intlayer/backend';\nimport { type IntlayerConfig, getConfiguration } from '@intlayer/config/client';\nimport { intlayerAPI } from './getIntlayerAPI';\n\nexport type DictionaryMessageEvent = {\n object: 'DICTIONARY';\n dictionary: DictionaryAPI;\n status: 'ADDED' | 'UPDATED' | 'DELETED' | 'CREATED';\n};\n\nexport type IntlayerMessageEvent = MessageEvent<DictionaryMessageEvent[]>;\n\n/**\n * IntlayerEventListener class to listen for dictionary changes via SSE (Server-Sent Events).\n *\n * Usage example:\n *\n * import { buildIntlayerDictionary } from './transpiler/declaration_file_to_dictionary/intlayer_dictionary';\n * import { IntlayerEventListener } from '@intlayer/api';\n *\n * export const checkDictionaryChanges = async () => {\n * // Instantiate the listener\n * const eventListener = new IntlayerEventListener();\n *\n * // Set up your callbacks\n * eventListener.onDictionaryChange = async (dictionary) => {\n * await buildIntlayerDictionary(dictionary);\n * };\n *\n * // Initialize the listener\n * await eventListener.initialize();\n *\n * // Optionally, clean up later when you’re done\n * // eventListener.cleanup();\n * };\n */\nexport class IntlayerEventListener {\n private eventSource: EventSource | null = null;\n\n /**\n * Callback triggered when a Dictionary is ADDED.\n */\n public onDictionaryAdded?: (dictionary: DictionaryAPI) => any;\n\n /**\n * Callback triggered when a Dictionary is UPDATED.\n */\n public onDictionaryChange?: (dictionary: DictionaryAPI) => any;\n\n /**\n * Callback triggered when a Dictionary is DELETED.\n */\n public onDictionaryDeleted?: (dictionary: DictionaryAPI) => any;\n\n constructor(private intlayerConfig?: IntlayerConfig) {}\n\n /**\n * Initializes the EventSource connection using the given intlayerConfig\n * (or the default config if none was provided).\n */\n public async initialize(): Promise<void> {\n try {\n const config = this.intlayerConfig ?? getConfiguration();\n const { backendURL } = config.editor;\n\n // Retrieve the access token\n const oAuth2TokenResult = await intlayerAPI.auth.getOAuth2AccessToken();\n const accessToken = oAuth2TokenResult.data?.accessToken;\n\n if (!accessToken) {\n throw new Error('Failed to retrieve access token');\n }\n\n if (oAuth2TokenResult.data?.organization.plan?.type !== 'ENTERPRISE')\n return;\n\n const API_ROUTE = `${backendURL}/api/event-listener`;\n const url = `${API_ROUTE}/${accessToken}`;\n\n this.eventSource = new EventSource(url);\n this.eventSource.onmessage = (event) => this.handleMessage(event);\n this.eventSource.onerror = (event) => this.handleError(event);\n } catch (error) {\n console.error('Error initializing IntlayerEventListener:', error);\n }\n }\n\n /**\n * Cleans up (closes) the EventSource connection.\n */\n public cleanup(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n }\n\n /**\n * Handles incoming SSE messages, parses the event data,\n * and invokes the appropriate callback.\n */\n private async handleMessage(event: IntlayerMessageEvent): Promise<void> {\n try {\n const { data } = event;\n for (const dataEl of data) {\n switch (dataEl.object) {\n case 'DICTIONARY':\n switch (dataEl.status) {\n case 'ADDED':\n await this.onDictionaryAdded?.(dataEl.dictionary);\n break;\n case 'UPDATED':\n await this.onDictionaryChange?.(dataEl.dictionary);\n break;\n case 'DELETED':\n await this.onDictionaryDeleted?.(dataEl.dictionary);\n break;\n default:\n console.error('Unhandled dictionary status:', dataEl.status);\n break;\n }\n break;\n default:\n console.error('Unknown object type:', dataEl.object);\n break;\n }\n }\n } catch (error) {\n console.error('Error processing dictionary update:', error);\n }\n }\n\n /**\n * Handles any SSE errors and then performs cleanup.\n */\n private handleError(event: Event): void {\n console.error('EventSource error:', event);\n this.cleanup();\n }\n}\n"],"mappings":"AAEA,SAA8B,wBAAwB;AACtD,SAAS,mBAAmB;AAkCrB,MAAM,sBAAsB;AAAA,EAkBjC,YAAoB,gBAAiC;AAAjC;AAAA,EAAkC;AAAA,EAjB9C,cAAkC;AAAA;AAAA;AAAA;AAAA,EAKnC;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP,MAAa,aAA4B;AACvC,QAAI;AACF,YAAM,SAAS,KAAK,kBAAkB,iBAAiB;AACvD,YAAM,EAAE,WAAW,IAAI,OAAO;AAG9B,YAAM,oBAAoB,MAAM,YAAY,KAAK,qBAAqB;AACtE,YAAM,cAAc,kBAAkB,MAAM;AAE5C,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,iCAAiC;AAAA,MACnD;AAEA,UAAI,kBAAkB,MAAM,aAAa,MAAM,SAAS;AACtD;AAEF,YAAM,YAAY,GAAG,UAAU;AAC/B,YAAM,MAAM,GAAG,SAAS,IAAI,WAAW;AAEvC,WAAK,cAAc,IAAI,YAAY,GAAG;AACtC,WAAK,YAAY,YAAY,CAAC,UAAU,KAAK,cAAc,KAAK;AAChE,WAAK,YAAY,UAAU,CAAC,UAAU,KAAK,YAAY,KAAK;AAAA,IAC9D,SAAS,OAAO;AACd,cAAQ,MAAM,6CAA6C,KAAK;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AACrB,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,MAAM;AACvB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cAAc,OAA4C;AACtE,QAAI;AACF,YAAM,EAAE,KAAK,IAAI;AACjB,iBAAW,UAAU,MAAM;AACzB,gBAAQ,OAAO,QAAQ;AAAA,UACrB,KAAK;AACH,oBAAQ,OAAO,QAAQ;AAAA,cACrB,KAAK;AACH,sBAAM,KAAK,oBAAoB,OAAO,UAAU;AAChD;AAAA,cACF,KAAK;AACH,sBAAM,KAAK,qBAAqB,OAAO,UAAU;AACjD;AAAA,cACF,KAAK;AACH,sBAAM,KAAK,sBAAsB,OAAO,UAAU;AAClD;AAAA,cACF;AACE,wBAAQ,MAAM,gCAAgC,OAAO,MAAM;AAC3D;AAAA,YACJ;AACA;AAAA,UACF;AACE,oBAAQ,MAAM,wBAAwB,OAAO,MAAM;AACnD;AAAA,QACJ;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,OAAoB;AACtC,YAAQ,MAAM,sBAAsB,KAAK;AACzC,SAAK,QAAQ;AAAA,EACf;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/IntlayerEventListener.ts"],"sourcesContent":["// @ts-ignore: @intlayer/backend is not built yet\nimport type { DictionaryAPI, MessageEventData } from '@intlayer/backend';\nimport { type IntlayerConfig, getConfiguration } from '@intlayer/config/client';\nimport { getIntlayerAPI } from './getIntlayerAPI';\n\nexport type IntlayerMessageEvent = MessageEvent;\n\n/**\n * IntlayerEventListener class to listen for dictionary changes via SSE (Server-Sent Events).\n *\n * Usage example:\n *\n * import { buildIntlayerDictionary } from './transpiler/declaration_file_to_dictionary/intlayer_dictionary';\n * import { IntlayerEventListener } from '@intlayer/api';\n *\n * export const checkDictionaryChanges = async () => {\n * // Instantiate the listener\n * const eventListener = new IntlayerEventListener();\n *\n * // Set up your callbacks\n * eventListener.onDictionaryChange = async (dictionary) => {\n * await buildIntlayerDictionary(dictionary);\n * };\n *\n * // Initialize the listener\n * await eventListener.initialize();\n *\n * // Optionally, clean up later when you’re done\n * // eventListener.cleanup();\n * };\n */\nexport class IntlayerEventListener {\n private eventSource: EventSource | null = null;\n\n /**\n * Callback triggered when a Dictionary is ADDED.\n */\n public onDictionaryAdded?: (dictionary: DictionaryAPI) => any;\n\n /**\n * Callback triggered when a Dictionary is UPDATED.\n */\n public onDictionaryChange?: (dictionary: DictionaryAPI) => any;\n\n /**\n * Callback triggered when a Dictionary is DELETED.\n */\n public onDictionaryDeleted?: (dictionary: DictionaryAPI) => any;\n\n constructor(private intlayerConfig?: IntlayerConfig) {}\n\n /**\n * Initializes the EventSource connection using the given intlayerConfig\n * (or the default config if none was provided).\n */\n public async initialize(): Promise<void> {\n const config = this.intlayerConfig ?? getConfiguration();\n const { backendURL } = config.editor;\n\n // Retrieve the access token\n const oAuth2TokenResult = await getIntlayerAPI(\n {},\n config\n ).auth.getOAuth2AccessToken();\n const accessToken = oAuth2TokenResult.data?.accessToken;\n\n if (!accessToken) {\n throw new Error('Failed to retrieve access token');\n }\n\n if (oAuth2TokenResult.data?.organization.plan?.type !== 'ENTERPRISE') {\n throw new Error(\n 'Hot reload is enabled, but is only available for enterprise plans'\n );\n }\n\n const API_ROUTE = `${backendURL}/api/event-listener`;\n const url = `${API_ROUTE}/${accessToken}`;\n\n this.eventSource = new EventSource(url);\n this.eventSource.onmessage = (event) => this.handleMessage(event);\n this.eventSource.onerror = (event) => this.handleError(event);\n }\n\n /**\n * Cleans up (closes) the EventSource connection.\n */\n public cleanup(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n }\n\n /**\n * Handles incoming SSE messages, parses the event data,\n * and invokes the appropriate callback.\n */\n private async handleMessage(event: IntlayerMessageEvent): Promise<void> {\n try {\n const { data } = event;\n\n const dataJSON: MessageEventData[] = JSON.parse(data);\n\n for (const dataEl of dataJSON) {\n switch (dataEl.object) {\n case 'DICTIONARY':\n switch (dataEl.status) {\n case 'ADDED':\n await this.onDictionaryAdded?.(dataEl.data);\n break;\n case 'UPDATED':\n await this.onDictionaryChange?.(dataEl.data);\n break;\n case 'DELETED':\n await this.onDictionaryDeleted?.(dataEl.data);\n break;\n default:\n console.error('Unhandled dictionary status:', dataEl.status);\n break;\n }\n break;\n default:\n console.error('Unknown object type:', dataEl.object);\n break;\n }\n }\n } catch (error) {\n console.error('Error processing dictionary update:', error);\n }\n }\n\n /**\n * Handles any SSE errors and then performs cleanup.\n */\n private handleError(event: Event): void {\n console.error('EventSource error:', event);\n this.cleanup();\n }\n}\n"],"mappings":"AAEA,SAA8B,wBAAwB;AACtD,SAAS,sBAAsB;AA4BxB,MAAM,sBAAsB;AAAA,EAkBjC,YAAoB,gBAAiC;AAAjC;AAAA,EAAkC;AAAA,EAjB9C,cAAkC;AAAA;AAAA;AAAA;AAAA,EAKnC;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP,MAAa,aAA4B;AACvC,UAAM,SAAS,KAAK,kBAAkB,iBAAiB;AACvD,UAAM,EAAE,WAAW,IAAI,OAAO;AAG9B,UAAM,oBAAoB,MAAM;AAAA,MAC9B,CAAC;AAAA,MACD;AAAA,IACF,EAAE,KAAK,qBAAqB;AAC5B,UAAM,cAAc,kBAAkB,MAAM;AAE5C,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,QAAI,kBAAkB,MAAM,aAAa,MAAM,SAAS,cAAc;AACpE,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,GAAG,UAAU;AAC/B,UAAM,MAAM,GAAG,SAAS,IAAI,WAAW;AAEvC,SAAK,cAAc,IAAI,YAAY,GAAG;AACtC,SAAK,YAAY,YAAY,CAAC,UAAU,KAAK,cAAc,KAAK;AAChE,SAAK,YAAY,UAAU,CAAC,UAAU,KAAK,YAAY,KAAK;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AACrB,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,MAAM;AACvB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cAAc,OAA4C;AACtE,QAAI;AACF,YAAM,EAAE,KAAK,IAAI;AAEjB,YAAM,WAA+B,KAAK,MAAM,IAAI;AAEpD,iBAAW,UAAU,UAAU;AAC7B,gBAAQ,OAAO,QAAQ;AAAA,UACrB,KAAK;AACH,oBAAQ,OAAO,QAAQ;AAAA,cACrB,KAAK;AACH,sBAAM,KAAK,oBAAoB,OAAO,IAAI;AAC1C;AAAA,cACF,KAAK;AACH,sBAAM,KAAK,qBAAqB,OAAO,IAAI;AAC3C;AAAA,cACF,KAAK;AACH,sBAAM,KAAK,sBAAsB,OAAO,IAAI;AAC5C;AAAA,cACF;AACE,wBAAQ,MAAM,gCAAgC,OAAO,MAAM;AAC3D;AAAA,YACJ;AACA;AAAA,UACF;AACE,oBAAQ,MAAM,wBAAwB,OAAO,MAAM;AACnD;AAAA,QACJ;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,OAAoB;AACtC,YAAQ,MAAM,sBAAsB,KAAK;AACzC,SAAK,QAAQ;AAAA,EACf;AACF;","names":[]}
@@ -1,11 +1,6 @@
1
1
  import type { DictionaryAPI } from '@intlayer/backend';
2
2
  import { type IntlayerConfig } from '@intlayer/config/client';
3
- export type DictionaryMessageEvent = {
4
- object: 'DICTIONARY';
5
- dictionary: DictionaryAPI;
6
- status: 'ADDED' | 'UPDATED' | 'DELETED' | 'CREATED';
7
- };
8
- export type IntlayerMessageEvent = MessageEvent<DictionaryMessageEvent[]>;
3
+ export type IntlayerMessageEvent = MessageEvent;
9
4
  /**
10
5
  * IntlayerEventListener class to listen for dictionary changes via SSE (Server-Sent Events).
11
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"IntlayerEventListener.d.ts","sourceRoot":"","sources":["../../src/IntlayerEventListener.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,KAAK,cAAc,EAAoB,MAAM,yBAAyB,CAAC;AAGhF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,aAAa,CAAC;IAC1B,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,sBAAsB,EAAE,CAAC,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,qBAAqB;IAkBpB,OAAO,CAAC,cAAc,CAAC;IAjBnC,OAAO,CAAC,WAAW,CAA4B;IAE/C;;OAEG;IACI,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,KAAK,GAAG,CAAC;IAE9D;;OAEG;IACI,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,KAAK,GAAG,CAAC;IAE/D;;OAEG;IACI,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,KAAK,GAAG,CAAC;gBAE5C,cAAc,CAAC,EAAE,cAAc;IAEnD;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BxC;;OAEG;IACI,OAAO,IAAI,IAAI;IAOtB;;;OAGG;YACW,aAAa;IA+B3B;;OAEG;IACH,OAAO,CAAC,WAAW;CAIpB"}
1
+ {"version":3,"file":"IntlayerEventListener.d.ts","sourceRoot":"","sources":["../../src/IntlayerEventListener.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,KAAK,cAAc,EAAoB,MAAM,yBAAyB,CAAC;AAGhF,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,qBAAqB;IAkBpB,OAAO,CAAC,cAAc,CAAC;IAjBnC,OAAO,CAAC,WAAW,CAA4B;IAE/C;;OAEG;IACI,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,KAAK,GAAG,CAAC;IAE9D;;OAEG;IACI,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,KAAK,GAAG,CAAC;IAE/D;;OAEG;IACI,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,KAAK,GAAG,CAAC;gBAE5C,cAAc,CAAC,EAAE,cAAc;IAEnD;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BxC;;OAEG;IACI,OAAO,IAAI,IAAI;IAOtB;;;OAGG;YACW,aAAa;IAkC3B;;OAEG;IACH,OAAO,CAAC,WAAW;CAIpB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intlayer/api",
3
- "version": "5.1.6",
3
+ "version": "5.1.8",
4
4
  "private": false,
5
5
  "description": "SDK for interacting with the Intlayer API, enabling content auditing, and managing organizations, projects, and users.",
6
6
  "keywords": [
@@ -57,7 +57,7 @@
57
57
  "./package.json"
58
58
  ],
59
59
  "dependencies": {
60
- "@intlayer/config": "5.1.6"
60
+ "@intlayer/config": "5.1.8"
61
61
  },
62
62
  "devDependencies": {
63
63
  "@changesets/changelog-github": "0.5.0",
@@ -71,15 +71,15 @@
71
71
  "tsc-alias": "^1.8.10",
72
72
  "tsup": "^8.3.5",
73
73
  "typescript": "^5.7.3",
74
- "@intlayer/backend": "5.1.6",
75
74
  "@utils/eslint-config": "1.0.4",
75
+ "@intlayer/backend": "5.1.8",
76
76
  "@utils/ts-config-types": "1.0.4",
77
- "@utils/ts-config": "1.0.4",
78
77
  "@utils/tsup-config": "1.0.4",
79
- "intlayer-editor": "5.1.6"
78
+ "@utils/ts-config": "1.0.4",
79
+ "intlayer-editor": "5.1.8"
80
80
  },
81
81
  "peerDependencies": {
82
- "@intlayer/config": "5.1.6"
82
+ "@intlayer/config": "5.1.8"
83
83
  },
84
84
  "engines": {
85
85
  "node": ">=14.18"