Skip to content

Commit

Permalink
Refactor threads (#813)
Browse files Browse the repository at this point in the history
  • Loading branch information
lemonmade committed Aug 17, 2024
1 parent 8669216 commit 40c2d71
Show file tree
Hide file tree
Showing 45 changed files with 2,528 additions and 1,752 deletions.
49 changes: 49 additions & 0 deletions .changeset/popular-jobs-sort.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
---
'@quilted/threads': major
'@quilted/preact-workers': minor
'@quilted/workers': minor
'@quilted/quilt': minor
---

Refactored the API for creating threads. The new APIs are class based, and now use module-style language to define the functions shared between threads: `exports` when creating a thread indicates the methods that can be called, and `imports` allows you to call those methods in the paired thread.

For example, you previously used `createThreadFromWebWorker()` to create a thread from a web worker. Now, you use the `ThreadWebWorker` class:

```js
// Old API:
import {createThreadFromWebWorker} from '@quilted/threads';

// Parent page
const worker = new Worker('worker.js');
const thread = createThreadFromWebWorker(worker);
const result = await thread.doWork();

// Worker
createThreadFromWebWorker(self, {
expose: {
async doWork() {
/* ... */
},
},
});

// ---
// New API:
import {ThreadWebWorker} from '@quilted/threads';

// Parent
const worker = new Worker('worker.js');
const thread = new ThreadWebWorker(worker);
const result = await thread.imports.doWork();

// Worker
new ThreadWebWorker(worker, {
exports: {
async doWork() {
/* ... */
},
},
});
```

Additionally, the threads library now exports two additional helpers for turning web objects into threads: `ThreadWindow` and `ThreadNestedWindow`, which can be used to create a communication channel between a parent page and popup windows or tabs.
2 changes: 0 additions & 2 deletions packages/preact-router/source/tests/e2e.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -611,8 +611,6 @@ describe('useRoutes()', () => {

const routes = render(<Routes />, {path: '/foo/bar'});

console.log(routes.debug());

expect(routes).toContainPreactComponent(NestedRouteComponent);
});

Expand Down
6 changes: 2 additions & 4 deletions packages/preact-workers/source/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,11 @@ export {
createThreadWorker,
retain,
release,
createThread,
createThreadFromWebWorker,
ThreadWebWorker,
} from '@quilted/workers';
export type {
Thread,
ThreadOptions,
ThreadTarget,
ThreadImports,
CustomWorker,
CustomWorkerConstructor,
CustomThreadWorker,
Expand Down
57 changes: 3 additions & 54 deletions packages/quilt/source/threads.ts
Original file line number Diff line number Diff line change
@@ -1,55 +1,4 @@
export {
retain,
release,
markAsTransferable,
isMemoryManageable,
createThread,
ThreadAbortSignal,
createBasicEncoder,
createThreadFromIframe,
createThreadFromInsideIframe,
createThreadFromMessagePort,
createThreadFromWebWorker,
createThreadFromBrowserWebSocket,
createThreadFromServiceWorker,
createThreadsFromServiceWorkerClients,
ENCODE_METHOD,
} from '@quilted/threads';
export type {
Thread,
ThreadOptions,
ThreadTarget,
ThreadAbortSignalOptions,
ThreadAbortSignalSerialization,
ThreadEncoder,
ThreadEncoderApi,
ThreadEncodable,
MemoryManageable,
MemoryRetainer,
ServiceWorkerClientThreads,
} from '@quilted/threads';
export {
threadSignal,
ThreadSignal,
type ThreadSignalOptions,
type ThreadSignalSerialization,
} from '@quilted/threads/signals';
export {
on,
once,
addEventHandler,
createEventEmitter,
EventEmitter,
AbortError,
NestedAbortController,
TimedAbortController,
} from '@quilted/events';
export type {
AbortBehavior,
EventHandler,
EventTarget,
EventTargetAddEventListener,
EventTargetFunction,
EventTargetOn,
} from '@quilted/events';
export * from '@quilted/threads';
export * from '@quilted/threads/signals';
export * from '@quilted/events';
export * from '@quilted/preact-workers';
Loading

0 comments on commit 40c2d71

Please sign in to comment.