Skip to content

Commit bd458cf

Browse files
committed
add workerbox etc
1 parent 35c86ae commit bd458cf

File tree

14 files changed

+27
-657
lines changed

14 files changed

+27
-657
lines changed

packages/signals/signals-runtime/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
"build:esm": "yarn tsc -p tsconfig.build.json",
2626
"build:cjs": "yarn tsc -p tsconfig.build.json --outDir ./dist/cjs --module commonjs",
2727
"build:global": "node build-signals-runtime-global.js",
28-
"assert-generated": "bash scripts/assert-generated.sh",
2928
"watch": "rm -rf dist/esm && yarn build:esm && yarn build:esm --watch",
3029
"watch:test": "yarn test --watch",
3130
"tsc": "yarn run -T tsc",

packages/signals/signals-runtime/scripts/assert-generated.sh

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
module.exports = {
2-
...require("@internal/config").lintStagedConfig,
3-
'src/lib/workerbox/*.{js,ts,html}': ['yarn workerbox']
4-
}
1+
module.exports = require("@internal/config").lintStagedConfig,
2+
53

packages/signals/signals/package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@
3232
"build:esm": "yarn tsc -p tsconfig.build.json",
3333
"build:cjs": "yarn tsc -p tsconfig.build.json --outDir ./dist/cjs --module commonjs",
3434
"build:bundle": "NODE_ENV=production yarn run webpack",
35-
"workerbox": "node scripts/build-workerbox.js",
36-
"assert-generated": "sh scripts/assert-workerbox-built.sh",
3735
"watch": "rm -rf dist && yarn concurrently 'yarn build:bundle --watch' 'yarn build:esm --watch'",
3836
"version": "sh scripts/version.sh",
3937
"watch:test": "yarn test --watch",

packages/signals/signals/scripts/assert-workerbox-built.sh

Lines changed: 0 additions & 16 deletions
This file was deleted.

packages/signals/signals/scripts/build-workerbox.js

Lines changed: 0 additions & 64 deletions
This file was deleted.

packages/signals/signals/src/core/middleware/event-processor/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ export class SignalsEventProcessorSubscriber implements SignalsSubscriber {
3535
sandboxSettings.processSignal
3636
) {
3737
logger.debug('Initializing sandbox: iframe')
38-
sandbox = new IframeSandbox(normalizedEdgeFunctionURL)
38+
sandbox = new IframeSandbox(
39+
normalizedEdgeFunctionURL,
40+
sandboxSettings.processSignal
41+
)
3942
} else {
4043
logger.debug('Initializing sandbox: global scope')
4144
sandbox = new GlobalScopeSandbox({

packages/signals/signals/src/core/processor/__tests__/sandbox-settings.test.ts

Lines changed: 0 additions & 55 deletions
This file was deleted.

packages/signals/signals/src/core/processor/sandbox.ts

Lines changed: 21 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { logger } from '../../lib/logger'
2-
import { createWorkerBox, WorkerBoxAPI } from '../../lib/workerbox'
32
import { resolvers } from './arg-resolvers'
43
import { AnalyticsRuntimePublicApi, ProcessSignal } from '../../types'
54
import { replaceBaseUrl } from '../../lib/replace-base-url'
@@ -129,33 +128,6 @@ class AnalyticsRuntime implements AnalyticsRuntimePublicApi {
129128
}
130129
}
131130

132-
interface CodeSandbox {
133-
run: (fn: string, scope: Record<string, any>) => Promise<any>
134-
destroy: () => Promise<void>
135-
}
136-
137-
class JavascriptSandbox implements CodeSandbox {
138-
private workerbox: Promise<WorkerBoxAPI>
139-
constructor() {
140-
this.workerbox = createWorkerBox()
141-
}
142-
async run(fn: string, scope: Record<string, any>) {
143-
try {
144-
const wb = await this.workerbox
145-
await wb.run(fn, scope)
146-
} catch (err) {
147-
console.error('processSignal() error in sandbox', err, {
148-
fn,
149-
})
150-
}
151-
}
152-
153-
async destroy(): Promise<void> {
154-
const wb = await this.workerbox
155-
await wb.destroy()
156-
}
157-
}
158-
159131
export const normalizeEdgeFunctionURL = (
160132
functionHost: string | undefined,
161133
edgeFnDownloadURL: string | undefined
@@ -185,39 +157,6 @@ const PROCESS_SIGNAL_UNDEFINED =
185157

186158
const consoleWarnProcessSignal = () => console.warn(PROCESS_SIGNAL_UNDEFINED)
187159

188-
export class IframeWorkerSandboxSettings {
189-
/**
190-
* Should look like:
191-
* ```js
192-
* function processSignal(signal) {
193-
* ...
194-
* }
195-
* ```
196-
*/
197-
processSignal: Promise<string>
198-
constructor(settings: IframeSandboxSettingsConfig) {
199-
const fetch = settings.edgeFnFetchClient ?? globalThis.fetch
200-
201-
let processSignalNormalized = Promise.resolve(
202-
`globalThis.processSignal = function() {}`
203-
)
204-
205-
if (settings.processSignal) {
206-
processSignalNormalized = Promise.resolve(settings.processSignal).then(
207-
(str) => `globalThis.processSignal = ${str}`
208-
)
209-
} else if (settings.edgeFnDownloadURL) {
210-
processSignalNormalized = fetch(settings.edgeFnDownloadURL!).then((res) =>
211-
res.text()
212-
)
213-
} else {
214-
consoleWarnProcessSignal()
215-
}
216-
217-
this.processSignal = processSignalNormalized
218-
}
219-
}
220-
221160
export interface SignalSandbox {
222161
execute(
223162
signal: Signal,
@@ -226,43 +165,6 @@ export interface SignalSandbox {
226165
destroy(): void | Promise<void>
227166
}
228167

229-
export class WorkerSandbox implements SignalSandbox {
230-
settings: IframeWorkerSandboxSettings
231-
jsSandbox: CodeSandbox
232-
233-
constructor(settings: IframeWorkerSandboxSettings) {
234-
this.settings = settings
235-
this.jsSandbox = new JavascriptSandbox()
236-
}
237-
238-
async execute(
239-
signal: Signal,
240-
signals: Signal[]
241-
): Promise<AnalyticsMethodCalls> {
242-
const analytics = new AnalyticsRuntime()
243-
const scope = {
244-
analytics,
245-
}
246-
logger.debug('processing signal', { signal, scope, signals })
247-
const code = [
248-
polyfills,
249-
await this.settings.processSignal,
250-
getRuntimeCode(),
251-
`signals.signalBuffer = ${JSON.stringify(signals)};`,
252-
'try { processSignal(' +
253-
JSON.stringify(signal) +
254-
', { analytics, signals, SignalType, EventType, NavigationAction }); } catch(err) { console.error("Process signal failed.", err); }',
255-
].join('\n')
256-
await this.jsSandbox.run(code, scope)
257-
258-
const calls = analytics.getCalls()
259-
return calls
260-
}
261-
destroy(): void {
262-
void this.jsSandbox.destroy()
263-
}
264-
}
265-
266168
// ProcessSignal unfortunately uses globals. This should change.
267169
// For now, we are setting up the globals between each invocation
268170
const processWithGlobalScopeExecutionEnv = (
@@ -373,13 +275,14 @@ const noramizeMethodCallsWithArgResolver = (
373275
})
374276
return normalizedRuntime.getCalls()
375277
}
278+
376279
export class IframeSandbox implements SignalSandbox {
377280
private iframe: HTMLIFrameElement
378281
private iframeReady: Promise<void>
379282
private _resolveReady!: () => void
380283
edgeFnUrl: string
381284

382-
constructor(edgeFnUrl: string) {
285+
constructor(edgeFnUrl: string, processSignalFn?: string) {
383286
this.edgeFnUrl = edgeFnUrl
384287
this.iframe = document.createElement('iframe')
385288
this.iframe.id = 'segment-signals-sandbox'
@@ -405,16 +308,32 @@ export class IframeSandbox implements SignalSandbox {
405308
const doc = this.iframe.contentDocument!
406309
doc.open()
407310
doc.write(
408-
`<!DOCTYPE html><html><head><script id="edge-fn" src=${this.edgeFnUrl}></script></head><body></body></html>`
311+
[
312+
`<!DOCTYPE html>`,
313+
`<html>`,
314+
`<head>`,
315+
processSignalFn
316+
? ''
317+
: `<script id="edge-fn" src=${this.edgeFnUrl}></script>`,
318+
`</head>`,
319+
`<body></body>
320+
</html>`,
321+
].join(',')
409322
)
410323
doc.close()
411324

412325
// External signal processor script
413326
// Inject runtime via Blob (CSP-safe)
414327
const runtimeJs = `
328+
${processSignalFn ? `window.processSignal = ${processSignalFn}` : ''}
329+
415330
const signalsScript = document.getElementById('edge-fn')
416-
signalsScript.onload = () => {
417-
window.parent.postMessage('iframe_ready', '*')
331+
if (typeof processSignal === 'undefined') {
332+
signalsScript.onload = () => {
333+
window.parent.postMessage('iframe_ready', '*')
334+
}
335+
} else {
336+
window.parent.postMessage('iframe_ready', '*')
418337
}
419338
420339
class AnalyticsRuntimeProxy {

packages/signals/signals/src/lib/workerbox/__mocks__/workerbox.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)