Skip to content

Repository files navigation

GhostWriter

Build StatusCodacy code qualityMaven CentralLicense

About

In a sentence, ghostwriter-api is the bridge between the compile-time and the runtime part of Ghostwriter. It does the bridging using a set of callbacks that get executed for specific events triggered by your application, where the compile-time part makes sure that the callbacks are called at the right time (by instrumenting the API calls into your code), while the runtime part does the actual handling of the data.

The ghostwriter-api module does the loading of various handlers (runtime components) using a ServiceLoader. Meaning that if you put a specific runtime JAR on the classpath it will be loaded and used for handling the events.

Important: only single runtime module can be loaded.

Configuration

There are situations, where relying on the classpath and ServiceLoader to use the correct runtime module is not enough. For example, you might be working on a web application where you want to be able to switch from one solution to another with the push of a button. Switching runtime modules is possible manually as well through the provided API.

io.ghostwriter.GhostWriter.setTracerProvider(...)

For example, for setting ghostwriter-tracer as the runtime handler run the following code:

finalGhostWriterTracerProvidertracerProvider = newGhostWriterTracerProvider();
GhostWriter.setTracerProvider(tracerProvider);

The above example assumes that you have ghostwriter-api and ghostwriter-tracer JARs specified as dependencies of your application.

Debugging

In case you want to get feedback about the module loading process of GhostWriter you need to enable the verbose logging by setting the GHOSTWRITER_VERBOSE environmental property to true.

export GHOSTWRITER_VERBOSE=true

After starting you application with the correct environmental value settings ghostwriter-api will output the logging information using JUL.

Providing your own runtime handlers

For creating your own runtime implementations, you need to implement the provided io.ghostwriter.Tracer interface, that provides callbacks for handling events, such as:

  • calling a function or procedure

  • assignment to a field or variable

  • returning a value from a function

  • exiting a function or procedure

  • unexpected error occurred

The instance of your handler is created through a factory that you need to provide by implementing the io.ghostwriter.TracerProvider interface.

For details, refer to the provided JavaDoc’s of the interfaces.

Before you start using your own runtime implementation, you need to package it into a standalone JAR, that conforms to the ServiceLoader requirements. A service provider is identified by placing a provider-configuration file in the resource directory META-INF/services.

For a GhostWriter runtime implementation, this means having a file called io.ghostwriter.TracerProvider in your _src/main/META-INF/services folder, where the contents of the file correspond to the fully qualified name of your TracerProvider implementation.

For a working example, check one of the provided runtime implementations, such as the ghostwriter-tracer.

About

Public inteface components used by GhostWriter

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - GoodGrind/ghostwriter-api: Public inteface components used by GhostWriter · GitHub
Skip to content

Repository files navigation

GhostWriter

Build StatusCodacy code qualityMaven CentralLicense

About

In a sentence, ghostwriter-api is the bridge between the compile-time and the runtime part of Ghostwriter. It does the bridging using a set of callbacks that get executed for specific events triggered by your application, where the compile-time part makes sure that the callbacks are called at the right time (by instrumenting the API calls into your code), while the runtime part does the actual handling of the data.

The ghostwriter-api module does the loading of various handlers (runtime components) using a ServiceLoader. Meaning that if you put a specific runtime JAR on the classpath it will be loaded and used for handling the events.

Important: only single runtime module can be loaded.

Configuration

There are situations, where relying on the classpath and ServiceLoader to use the correct runtime module is not enough. For example, you might be working on a web application where you want to be able to switch from one solution to another with the push of a button. Switching runtime modules is possible manually as well through the provided API.

io.ghostwriter.GhostWriter.setTracerProvider(...)

For example, for setting ghostwriter-tracer as the runtime handler run the following code:

finalGhostWriterTracerProvidertracerProvider = newGhostWriterTracerProvider();
GhostWriter.setTracerProvider(tracerProvider);

The above example assumes that you have ghostwriter-api and ghostwriter-tracer JARs specified as dependencies of your application.

Debugging

In case you want to get feedback about the module loading process of GhostWriter you need to enable the verbose logging by setting the GHOSTWRITER_VERBOSE environmental property to true.

export GHOSTWRITER_VERBOSE=true

After starting you application with the correct environmental value settings ghostwriter-api will output the logging information using JUL.

Providing your own runtime handlers

For creating your own runtime implementations, you need to implement the provided io.ghostwriter.Tracer interface, that provides callbacks for handling events, such as:

  • calling a function or procedure

  • assignment to a field or variable

  • returning a value from a function

  • exiting a function or procedure

  • unexpected error occurred

The instance of your handler is created through a factory that you need to provide by implementing the io.ghostwriter.TracerProvider interface.

For details, refer to the provided JavaDoc’s of the interfaces.

Before you start using your own runtime implementation, you need to package it into a standalone JAR, that conforms to the ServiceLoader requirements. A service provider is identified by placing a provider-configuration file in the resource directory META-INF/services.

For a GhostWriter runtime implementation, this means having a file called io.ghostwriter.TracerProvider in your _src/main/META-INF/services folder, where the contents of the file correspond to the fully qualified name of your TracerProvider implementation.

For a working example, check one of the provided runtime implementations, such as the ghostwriter-tracer.

About

Public inteface components used by GhostWriter

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - GoodGrind/ghostwriter-api: Public inteface components used by GhostWriter · GitHub
Skip to content

Repository files navigation

GhostWriter

Build StatusCodacy code qualityMaven CentralLicense

About

In a sentence, ghostwriter-api is the bridge between the compile-time and the runtime part of Ghostwriter. It does the bridging using a set of callbacks that get executed for specific events triggered by your application, where the compile-time part makes sure that the callbacks are called at the right time (by instrumenting the API calls into your code), while the runtime part does the actual handling of the data.

The ghostwriter-api module does the loading of various handlers (runtime components) using a ServiceLoader. Meaning that if you put a specific runtime JAR on the classpath it will be loaded and used for handling the events.

Important: only single runtime module can be loaded.

Configuration

There are situations, where relying on the classpath and ServiceLoader to use the correct runtime module is not enough. For example, you might be working on a web application where you want to be able to switch from one solution to another with the push of a button. Switching runtime modules is possible manually as well through the provided API.

io.ghostwriter.GhostWriter.setTracerProvider(...)

For example, for setting ghostwriter-tracer as the runtime handler run the following code:

finalGhostWriterTracerProvidertracerProvider = newGhostWriterTracerProvider();
GhostWriter.setTracerProvider(tracerProvider);

The above example assumes that you have ghostwriter-api and ghostwriter-tracer JARs specified as dependencies of your application.

Debugging

In case you want to get feedback about the module loading process of GhostWriter you need to enable the verbose logging by setting the GHOSTWRITER_VERBOSE environmental property to true.

export GHOSTWRITER_VERBOSE=true

After starting you application with the correct environmental value settings ghostwriter-api will output the logging information using JUL.

Providing your own runtime handlers

For creating your own runtime implementations, you need to implement the provided io.ghostwriter.Tracer interface, that provides callbacks for handling events, such as:

  • calling a function or procedure

  • assignment to a field or variable

  • returning a value from a function

  • exiting a function or procedure

  • unexpected error occurred

The instance of your handler is created through a factory that you need to provide by implementing the io.ghostwriter.TracerProvider interface.

For details, refer to the provided JavaDoc’s of the interfaces.

Before you start using your own runtime implementation, you need to package it into a standalone JAR, that conforms to the ServiceLoader requirements. A service provider is identified by placing a provider-configuration file in the resource directory META-INF/services.

For a GhostWriter runtime implementation, this means having a file called io.ghostwriter.TracerProvider in your _src/main/META-INF/services folder, where the contents of the file correspond to the fully qualified name of your TracerProvider implementation.

For a working example, check one of the provided runtime implementations, such as the ghostwriter-tracer.

About

Public inteface components used by GhostWriter

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - GoodGrind/ghostwriter-api: Public inteface components used by GhostWriter · GitHub
Skip to content

Repository files navigation

GhostWriter

Build StatusCodacy code qualityMaven CentralLicense

About

In a sentence, ghostwriter-api is the bridge between the compile-time and the runtime part of Ghostwriter. It does the bridging using a set of callbacks that get executed for specific events triggered by your application, where the compile-time part makes sure that the callbacks are called at the right time (by instrumenting the API calls into your code), while the runtime part does the actual handling of the data.

The ghostwriter-api module does the loading of various handlers (runtime components) using a ServiceLoader. Meaning that if you put a specific runtime JAR on the classpath it will be loaded and used for handling the events.

Important: only single runtime module can be loaded.

Configuration

There are situations, where relying on the classpath and ServiceLoader to use the correct runtime module is not enough. For example, you might be working on a web application where you want to be able to switch from one solution to another with the push of a button. Switching runtime modules is possible manually as well through the provided API.

io.ghostwriter.GhostWriter.setTracerProvider(...)

For example, for setting ghostwriter-tracer as the runtime handler run the following code:

finalGhostWriterTracerProvidertracerProvider = newGhostWriterTracerProvider();
GhostWriter.setTracerProvider(tracerProvider);

The above example assumes that you have ghostwriter-api and ghostwriter-tracer JARs specified as dependencies of your application.

Debugging

In case you want to get feedback about the module loading process of GhostWriter you need to enable the verbose logging by setting the GHOSTWRITER_VERBOSE environmental property to true.

export GHOSTWRITER_VERBOSE=true

After starting you application with the correct environmental value settings ghostwriter-api will output the logging information using JUL.

Providing your own runtime handlers

For creating your own runtime implementations, you need to implement the provided io.ghostwriter.Tracer interface, that provides callbacks for handling events, such as:

  • calling a function or procedure

  • assignment to a field or variable

  • returning a value from a function

  • exiting a function or procedure

  • unexpected error occurred

The instance of your handler is created through a factory that you need to provide by implementing the io.ghostwriter.TracerProvider interface.

For details, refer to the provided JavaDoc’s of the interfaces.

Before you start using your own runtime implementation, you need to package it into a standalone JAR, that conforms to the ServiceLoader requirements. A service provider is identified by placing a provider-configuration file in the resource directory META-INF/services.

For a GhostWriter runtime implementation, this means having a file called io.ghostwriter.TracerProvider in your _src/main/META-INF/services folder, where the contents of the file correspond to the fully qualified name of your TracerProvider implementation.

For a working example, check one of the provided runtime implementations, such as the ghostwriter-tracer.

About

Public inteface components used by GhostWriter

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - GoodGrind/ghostwriter-api: Public inteface components used by GhostWriter · GitHub
Skip to content

Repository files navigation

GhostWriter

Build StatusCodacy code qualityMaven CentralLicense

About

In a sentence, ghostwriter-api is the bridge between the compile-time and the runtime part of Ghostwriter. It does the bridging using a set of callbacks that get executed for specific events triggered by your application, where the compile-time part makes sure that the callbacks are called at the right time (by instrumenting the API calls into your code), while the runtime part does the actual handling of the data.

The ghostwriter-api module does the loading of various handlers (runtime components) using a ServiceLoader. Meaning that if you put a specific runtime JAR on the classpath it will be loaded and used for handling the events.

Important: only single runtime module can be loaded.

Configuration

There are situations, where relying on the classpath and ServiceLoader to use the correct runtime module is not enough. For example, you might be working on a web application where you want to be able to switch from one solution to another with the push of a button. Switching runtime modules is possible manually as well through the provided API.

io.ghostwriter.GhostWriter.setTracerProvider(...)

For example, for setting ghostwriter-tracer as the runtime handler run the following code:

finalGhostWriterTracerProvidertracerProvider = newGhostWriterTracerProvider();
GhostWriter.setTracerProvider(tracerProvider);

The above example assumes that you have ghostwriter-api and ghostwriter-tracer JARs specified as dependencies of your application.

Debugging

In case you want to get feedback about the module loading process of GhostWriter you need to enable the verbose logging by setting the GHOSTWRITER_VERBOSE environmental property to true.

export GHOSTWRITER_VERBOSE=true

After starting you application with the correct environmental value settings ghostwriter-api will output the logging information using JUL.

Providing your own runtime handlers

For creating your own runtime implementations, you need to implement the provided io.ghostwriter.Tracer interface, that provides callbacks for handling events, such as:

  • calling a function or procedure

  • assignment to a field or variable

  • returning a value from a function

  • exiting a function or procedure

  • unexpected error occurred

The instance of your handler is created through a factory that you need to provide by implementing the io.ghostwriter.TracerProvider interface.

For details, refer to the provided JavaDoc’s of the interfaces.

Before you start using your own runtime implementation, you need to package it into a standalone JAR, that conforms to the ServiceLoader requirements. A service provider is identified by placing a provider-configuration file in the resource directory META-INF/services.

For a GhostWriter runtime implementation, this means having a file called io.ghostwriter.TracerProvider in your _src/main/META-INF/services folder, where the contents of the file correspond to the fully qualified name of your TracerProvider implementation.

For a working example, check one of the provided runtime implementations, such as the ghostwriter-tracer.

About

Public inteface components used by GhostWriter

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - GoodGrind/ghostwriter-api: Public inteface components used by GhostWriter · GitHub
Skip to content

Repository files navigation

GhostWriter

Build StatusCodacy code qualityMaven CentralLicense

About

In a sentence, ghostwriter-api is the bridge between the compile-time and the runtime part of Ghostwriter. It does the bridging using a set of callbacks that get executed for specific events triggered by your application, where the compile-time part makes sure that the callbacks are called at the right time (by instrumenting the API calls into your code), while the runtime part does the actual handling of the data.

The ghostwriter-api module does the loading of various handlers (runtime components) using a ServiceLoader. Meaning that if you put a specific runtime JAR on the classpath it will be loaded and used for handling the events.

Important: only single runtime module can be loaded.

Configuration

There are situations, where relying on the classpath and ServiceLoader to use the correct runtime module is not enough. For example, you might be working on a web application where you want to be able to switch from one solution to another with the push of a button. Switching runtime modules is possible manually as well through the provided API.

io.ghostwriter.GhostWriter.setTracerProvider(...)

For example, for setting ghostwriter-tracer as the runtime handler run the following code:

finalGhostWriterTracerProvidertracerProvider = newGhostWriterTracerProvider();
GhostWriter.setTracerProvider(tracerProvider);

The above example assumes that you have ghostwriter-api and ghostwriter-tracer JARs specified as dependencies of your application.

Debugging

In case you want to get feedback about the module loading process of GhostWriter you need to enable the verbose logging by setting the GHOSTWRITER_VERBOSE environmental property to true.

export GHOSTWRITER_VERBOSE=true

After starting you application with the correct environmental value settings ghostwriter-api will output the logging information using JUL.

Providing your own runtime handlers

For creating your own runtime implementations, you need to implement the provided io.ghostwriter.Tracer interface, that provides callbacks for handling events, such as:

  • calling a function or procedure

  • assignment to a field or variable

  • returning a value from a function

  • exiting a function or procedure

  • unexpected error occurred

The instance of your handler is created through a factory that you need to provide by implementing the io.ghostwriter.TracerProvider interface.

For details, refer to the provided JavaDoc’s of the interfaces.

Before you start using your own runtime implementation, you need to package it into a standalone JAR, that conforms to the ServiceLoader requirements. A service provider is identified by placing a provider-configuration file in the resource directory META-INF/services.

For a GhostWriter runtime implementation, this means having a file called io.ghostwriter.TracerProvider in your _src/main/META-INF/services folder, where the contents of the file correspond to the fully qualified name of your TracerProvider implementation.

For a working example, check one of the provided runtime implementations, such as the ghostwriter-tracer.

About

Public inteface components used by GhostWriter

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - GoodGrind/ghostwriter-api: Public inteface components used by GhostWriter · GitHub
Skip to content

Repository files navigation

GhostWriter

Build StatusCodacy code qualityMaven CentralLicense

About

In a sentence, ghostwriter-api is the bridge between the compile-time and the runtime part of Ghostwriter. It does the bridging using a set of callbacks that get executed for specific events triggered by your application, where the compile-time part makes sure that the callbacks are called at the right time (by instrumenting the API calls into your code), while the runtime part does the actual handling of the data.

The ghostwriter-api module does the loading of various handlers (runtime components) using a ServiceLoader. Meaning that if you put a specific runtime JAR on the classpath it will be loaded and used for handling the events.

Important: only single runtime module can be loaded.

Configuration

There are situations, where relying on the classpath and ServiceLoader to use the correct runtime module is not enough. For example, you might be working on a web application where you want to be able to switch from one solution to another with the push of a button. Switching runtime modules is possible manually as well through the provided API.

io.ghostwriter.GhostWriter.setTracerProvider(...)

For example, for setting ghostwriter-tracer as the runtime handler run the following code:

finalGhostWriterTracerProvidertracerProvider = newGhostWriterTracerProvider();
GhostWriter.setTracerProvider(tracerProvider);

The above example assumes that you have ghostwriter-api and ghostwriter-tracer JARs specified as dependencies of your application.

Debugging

In case you want to get feedback about the module loading process of GhostWriter you need to enable the verbose logging by setting the GHOSTWRITER_VERBOSE environmental property to true.

export GHOSTWRITER_VERBOSE=true

After starting you application with the correct environmental value settings ghostwriter-api will output the logging information using JUL.

Providing your own runtime handlers

For creating your own runtime implementations, you need to implement the provided io.ghostwriter.Tracer interface, that provides callbacks for handling events, such as:

  • calling a function or procedure

  • assignment to a field or variable

  • returning a value from a function

  • exiting a function or procedure

  • unexpected error occurred

The instance of your handler is created through a factory that you need to provide by implementing the io.ghostwriter.TracerProvider interface.

For details, refer to the provided JavaDoc’s of the interfaces.

Before you start using your own runtime implementation, you need to package it into a standalone JAR, that conforms to the ServiceLoader requirements. A service provider is identified by placing a provider-configuration file in the resource directory META-INF/services.

For a GhostWriter runtime implementation, this means having a file called io.ghostwriter.TracerProvider in your _src/main/META-INF/services folder, where the contents of the file correspond to the fully qualified name of your TracerProvider implementation.

For a working example, check one of the provided runtime implementations, such as the ghostwriter-tracer.

About

Public inteface components used by GhostWriter

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages