Skip to content

Commit 5aad62c

Browse files
committed
Add explicit type-safe methods to bind for GIF events.
1 parent 18f4ceb commit 5aad62c

File tree

3 files changed

+86
-16
lines changed

3 files changed

+86
-16
lines changed

image/parsers/gif.js

Lines changed: 80 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export const GifParseEventType = {
2929
* @property {string} version
3030
*/
3131

32-
export class GifHeaderParseEvent extends Event {
32+
export class GifHeaderEvent extends Event {
3333
/** @param {GifHeader} header */
3434
constructor(header) {
3535
super(GifParseEventType.HEADER);
@@ -58,7 +58,7 @@ export class GifHeaderParseEvent extends Event {
5858
* @property {GifColor[]=} globalColorTable Only if globalColorTableFlag is true.
5959
*/
6060

61-
export class GifLogicalScreenParseEvent extends Event {
61+
export class GifLogicalScreenEvent extends Event {
6262
/** @param {GifLogicalScreen} */
6363
constructor(logicalScreen) {
6464
super(GifParseEventType.LOGICAL_SCREEN);
@@ -204,13 +204,83 @@ export class GifParser extends EventTarget {
204204
}
205205

206206
/**
207-
* Overridden so that the type hints for eventType are specific.
208-
* @param {'application_extension'|'comment_extension'|'graphical_control_extension'|'header'|'logical_screen'|'plain_text_extension'|'table_based_image'|'trailer'} eventType
209-
* @param {EventListenerOrEventListenerObject} listener
210-
* @override
207+
* Type-safe way to bind a listener for a GifApplicationExtensionEvent.
208+
* @param {function(GifApplicationExtensionEvent): void} listener
209+
* @returns {GifParser} for chaining
211210
*/
212-
addEventListener(eventType, listener) {
213-
super.addEventListener(eventType, listener);
211+
onApplicationExtension(listener) {
212+
super.addEventListener(GifParseEventType.APPLICATION_EXTENSION, listener);
213+
return this;
214+
}
215+
216+
/**
217+
* Type-safe way to bind a listener for a GifCommentExtensionEvent.
218+
* @param {function(GifCommentExtensionEvent): void} listener
219+
* @returns {GifParser} for chaining
220+
*/
221+
onCommentExtension(listener) {
222+
super.addEventListener(GifParseEventType.COMMENT_EXTENSION, listener);
223+
return this;
224+
}
225+
226+
/**
227+
* Type-safe way to bind a listener for a GifGraphicControlExtensionEvent.
228+
* @param {function(GifGraphicControlExtensionEvent): void} listener
229+
* @returns {GifParser} for chaining
230+
*/
231+
onGraphicControlExtension(listener) {
232+
super.addEventListener(GifParseEventType.GRAPHIC_CONTROL_EXTENSION, listener);
233+
return this;
234+
}
235+
236+
/**
237+
* Type-safe way to bind a listener for a GifHeaderEvent.
238+
* @param {function(GifHeaderEvent): void} listener
239+
* @returns {GifParser} for chaining
240+
*/
241+
onHeader(listener) {
242+
super.addEventListener(GifParseEventType.HEADER, listener);
243+
return this;
244+
}
245+
246+
/**
247+
* Type-safe way to bind a listener for a GifLogicalScreenEvent.
248+
* @param {function(GifLogicalScreenEvent): void} listener
249+
* @returns {GifParser} for chaining
250+
*/
251+
onLogicalScreen(listener) {
252+
super.addEventListener(GifParseEventType.LOGICAL_SCREEN, listener);
253+
return this;
254+
}
255+
256+
/**
257+
* Type-safe way to bind a listener for a GifPlainTextExtensionEvent.
258+
* @param {function(GifPlainTextExtensionEvent): void} listener
259+
* @returns {GifParser} for chaining
260+
*/
261+
onPlainTextExtension(listener) {
262+
super.addEventListener(GifParseEventType.PLAIN_TEXT_EXTENSION, listener);
263+
return this;
264+
}
265+
266+
/**
267+
* Type-safe way to bind a listener for a GifTableBasedImageEvent.
268+
* @param {function(GifTableBasedImageEvent): void} listener
269+
* @returns {GifParser} for chaining
270+
*/
271+
onTableBasedImage(listener) {
272+
super.addEventListener(GifParseEventType.TABLE_BASED_IMAGE, listener);
273+
return this;
274+
}
275+
276+
/**
277+
* Type-safe way to bind a listener for a GifTrailerEvent.
278+
* @param {function(GifTrailerEvent): void} listener
279+
* @returns {GifParser} for chaining
280+
*/
281+
onTrailer(listener) {
282+
super.addEventListener(GifParseEventType.TRAILER, listener);
283+
return this;
214284
}
215285

216286
/**
@@ -224,7 +294,7 @@ export class GifParser extends EventTarget {
224294
const version = this.version = this.bstream.readString(3); // "87a" or "89a"
225295
if (!["87a", "89a"].includes(version)) throw `Bad version: ${version}`;
226296

227-
this.dispatchEvent(new GifHeaderParseEvent(
297+
this.dispatchEvent(new GifHeaderEvent(
228298
/** @type {GifHeader} */ ({ version })
229299
));
230300

@@ -253,7 +323,7 @@ export class GifParser extends EventTarget {
253323
}));
254324
}
255325
}
256-
this.dispatchEvent(new GifLogicalScreenParseEvent(
326+
this.dispatchEvent(new GifLogicalScreenEvent(
257327
/** @type {GifLogicalScreen} */ ({
258328
logicalScreenWidth,
259329
logicalScreenHeight,

index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export {
2424
export { getFullMIMEString, getShortMIMEString } from './codecs/codecs.js';
2525
export { findMimeType } from './file/sniffer.js';
2626
export { GifApplicationExtensionEvent, GifCommentExtensionEvent, GifGraphicControlExtensionEvent,
27-
GifHeaderParseEvent, GifLogicalScreenParseEvent, GifParseEventType, GifParser,
27+
GifHeaderEvent, GifLogicalScreenEvent, GifParseEventType, GifParser,
2828
GifPlainTextExtensionEvent, GifTableBasedImageEvent } from './image/parsers/gif.js';
2929
export { convertWebPtoPNG, convertWebPtoJPG } from './image/webp-shim/webp-shim.js';
3030
export { BitBuffer } from './io/bitbuffer.js';

tests/image-parsers-gif.spec.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,18 @@ describe('bitjs.image.parsers.GifParser', () => {
1414
const parser = new GifParser(ab);
1515
let trailerFound = false;
1616
let comment;
17-
parser.addEventListener('logical_screen', evt => {
17+
parser.onLogicalScreen(evt => {
1818
const {logicalScreenWidth, logicalScreenHeight} = evt.logicalScreen;
1919
expect(logicalScreenWidth).equals(32);
2020
expect(logicalScreenHeight).equals(52);
2121
});
22-
parser.addEventListener('table_based_image', evt => {
22+
parser.onTableBasedImage(evt => {
2323
const {imageWidth, imageHeight} = evt.tableBasedImage;
2424
expect(imageWidth).equals(32);
2525
expect(imageHeight).equals(52);
2626
});
27-
parser.addEventListener('comment_extension', evt => comment = evt.comment);
28-
parser.addEventListener('trailer', evt => trailerFound = true);
27+
parser.onCommentExtension(evt => comment = evt.comment);
28+
parser.onTrailer(evt => trailerFound = true);
2929

3030
await parser.start();
3131

@@ -41,7 +41,7 @@ describe('bitjs.image.parsers.GifParser', () => {
4141
let appId;
4242
let appAuthCode;
4343
let hasAppData = false;
44-
parser.addEventListener('application_extension', evt => {
44+
parser.onApplicationExtension(evt => {
4545
appId = evt.applicationExtension.applicationIdentifier
4646
appAuthCode = new TextDecoder().decode(
4747
evt.applicationExtension.applicationAuthenticationCode);

0 commit comments

Comments
 (0)