Skip to content

Commit

Permalink
Merge pull request #227 from Telegram-Mini-Apps/feature/parse-message
Browse files Browse the repository at this point in the history
Feature/parse message
  • Loading branch information
heyqbnk authored Feb 8, 2024
2 parents 12aacf4 + b54f643 commit ce70149
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 11 deletions.
5 changes: 5 additions & 0 deletions .changeset/forty-buses-fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@tma.js/sdk": patch
---

Implement parseMessage method
23 changes: 23 additions & 0 deletions packages/sdk/src/bridge/__tests__/parseMessage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { it, expect } from 'vitest';

import { parseMessage } from '../parseMessage';

it('should parse value as JSON with properties { eventType: string; eventData?: unknown }', () => {
expect(parseMessage({ eventType: 1 })).toEqual({ eventType: '1' });
expect(parseMessage({ eventType: 'test' })).toEqual({ eventType: 'test' });
expect(parseMessage({ eventType: 'test', eventData: 123 })).toEqual({
eventType: 'test',
eventData: 123,
});

expect(parseMessage('{"eventType":1}')).toEqual({ eventType: '1' });
expect(parseMessage('{"eventType":"test"}')).toEqual({ eventType: 'test' });
expect(parseMessage('{"eventType":"test","eventData":123}')).toEqual({
eventType: 'test',
eventData: 123,
});
});

it('should throw if eventType property is missing', () => {
expect(() => parseMessage({})).toThrow();
});
12 changes: 2 additions & 10 deletions packages/sdk/src/bridge/events/onTelegramEvent.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,4 @@
import { json, string } from '~/parsing/index.js';

/**
* Extracts event data from native application event.
*/
const eventDataJson = json<{ eventType: string; eventData?: unknown }>({
eventType: string(),
eventData: (value) => value,
});
import { parseMessage } from '~/bridge/parseMessage.js';

/**
* Emits event sent from Telegram native application like it was sent in
Expand Down Expand Up @@ -74,7 +66,7 @@ export function onTelegramEvent(cb: (eventType: string, eventData: unknown) => v
// We expect Telegram to send us new event through "message" event.
window.addEventListener('message', (event) => {
try {
const { eventType, eventData } = eventDataJson.parse(event.data);
const { eventType, eventData } = parseMessage(event.data);
cb(eventType, eventData);
} catch {
// We ignore incorrect messages as they could be generated by any other code.
Expand Down
3 changes: 2 additions & 1 deletion packages/sdk/src/bridge/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@ export * from './env/index.js';
export * from './errors/index.js';
export * from './events/index.js';
export * from './methods/index.js';
export * from './invoke-custom-method.js';
export * from './invokeCustomMethod.js';
export * from './parseMessage.js';
export * from './request.js';
28 changes: 28 additions & 0 deletions packages/sdk/src/bridge/parseMessage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { json, string } from '~/parsing/index.js';

/**
* Message format used in communication between client and Telegram applications.
*/
export interface MiniAppsMessage {
/**
* Event name.
*/
eventType: string;
/**
* Event parameters.
*/
eventData?: unknown;
}

const parser = json<MiniAppsMessage>({
eventType: string(),
eventData: (value) => value,
});

/**
* Parses value as a message between client and Telegram applications.
* @param value - value to parse.
*/
export function parseMessage(value: unknown): MiniAppsMessage {
return parser.parse(value);
}
1 change: 1 addition & 0 deletions packages/sdk/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export {
on,
off,
once,
parseMessage,
postEvent,
request,
subscribe,
Expand Down

0 comments on commit ce70149

Please sign in to comment.